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,102 @@
|
|
|
1
|
+
"""Blocker → owner escalation (§7.2).
|
|
2
|
+
|
|
3
|
+
Historically a goal that tripped the circuit breaker went to ``status='blocked'`` +
|
|
4
|
+
a ``gave_up`` audit event and then **died silently** — nothing surfaced it to the
|
|
5
|
+
owner. This module is the missing producer: when a goal blocks, push a concrete,
|
|
6
|
+
specific ask to the owner over the SAME rail an out-of-band cron report uses
|
|
7
|
+
(``self_evolution.push_owner_message`` → telegram sink + ``resolve_owner_telegram_id``).
|
|
8
|
+
|
|
9
|
+
Pure builders + one gated, fail-open async producer so it is trivially testable and
|
|
10
|
+
can never break the dispatcher's failure path.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def build_blocker_escalation(goal: Any) -> str:
|
|
21
|
+
"""A concrete owner-facing ask for a blocked goal (not just a status line)."""
|
|
22
|
+
title = getattr(goal, "title", None) or "(untitled goal)"
|
|
23
|
+
reason = (getattr(goal, "last_failure_error", None) or "repeated failures").strip()
|
|
24
|
+
fails = getattr(goal, "consecutive_failures", None)
|
|
25
|
+
tail = f" after {fails} attempts" if fails else ""
|
|
26
|
+
return (
|
|
27
|
+
f"🚧 I'm blocked and stopped retrying{tail}.\n"
|
|
28
|
+
f"Goal: {title}\n"
|
|
29
|
+
f"Why: {reason}\n"
|
|
30
|
+
f"What do you want me to do — drop it, give me what it needs, or should I "
|
|
31
|
+
f"try a different approach?"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def build_empty_pipeline_escalation(objective_title: str | None) -> str:
|
|
36
|
+
"""An owner-facing ask when the board has drained with no next goal to run."""
|
|
37
|
+
obj = objective_title or "the current objective"
|
|
38
|
+
return (
|
|
39
|
+
f"🫗 My goal pipeline is empty — I have nothing queued for {obj}.\n"
|
|
40
|
+
f"Tell me the next concrete step, or what's blocking progress, and I'll pick it up."
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def maybe_escalate_blocked(task_agent: Any, goal: Any) -> bool:
|
|
45
|
+
"""Escalate a BLOCKED goal to the owner if enabled. No-op + fail-open otherwise.
|
|
46
|
+
|
|
47
|
+
Gated ``GOAL_BLOCKER_ESCALATION`` (default OFF). Only fires for a goal whose
|
|
48
|
+
status is ``blocked`` (the circuit breaker tripped), never a transient retry.
|
|
49
|
+
"""
|
|
50
|
+
try:
|
|
51
|
+
from agents.task.goals.board import STATUS_BLOCKED
|
|
52
|
+
if getattr(goal, "status", None) != STATUS_BLOCKED:
|
|
53
|
+
return False
|
|
54
|
+
from agents.task.constants import AutonomyConfig
|
|
55
|
+
if not AutonomyConfig.goal_blocker_escalation():
|
|
56
|
+
return False
|
|
57
|
+
container = getattr(task_agent, "container", None)
|
|
58
|
+
from core.self_evolution import push_owner_message
|
|
59
|
+
sent = await push_owner_message(container, build_blocker_escalation(goal))
|
|
60
|
+
if sent:
|
|
61
|
+
logger.info("goal %s blocked → owner escalation sent", getattr(goal, "id", "?"))
|
|
62
|
+
return bool(sent)
|
|
63
|
+
except Exception as e: # never let escalation break the failure path
|
|
64
|
+
logger.debug("blocker escalation skipped (fail-open): %s", e)
|
|
65
|
+
return False
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
async def maybe_escalate_empty_pipeline(task_agent: Any, *,
|
|
69
|
+
objective_title: str | None = None,
|
|
70
|
+
planner_summary: str | None = None) -> bool:
|
|
71
|
+
"""Escalate a drained goal pipeline to the owner if enabled. Fail-open.
|
|
72
|
+
|
|
73
|
+
Gated ``GOAL_BLOCKER_ESCALATION`` (same flag as the blocked-goal producer —
|
|
74
|
+
both are "the board can't advance without you"). A planner run that reported
|
|
75
|
+
"queue healthy" is a legitimate non-blocker outcome and is never escalated.
|
|
76
|
+
"""
|
|
77
|
+
try:
|
|
78
|
+
from agents.task.constants import AutonomyConfig
|
|
79
|
+
if not AutonomyConfig.goal_blocker_escalation():
|
|
80
|
+
return False
|
|
81
|
+
if planner_summary and "queue healthy" in planner_summary.lower():
|
|
82
|
+
return False
|
|
83
|
+
text = build_empty_pipeline_escalation(objective_title)
|
|
84
|
+
if planner_summary:
|
|
85
|
+
text += f"\nMy planner's last word: {planner_summary.strip()[:400]}"
|
|
86
|
+
container = getattr(task_agent, "container", None)
|
|
87
|
+
from core.self_evolution import push_owner_message
|
|
88
|
+
sent = await push_owner_message(container, text)
|
|
89
|
+
if sent:
|
|
90
|
+
logger.info("empty goal pipeline → owner escalation sent")
|
|
91
|
+
return bool(sent)
|
|
92
|
+
except Exception as e: # never let escalation break the planner path
|
|
93
|
+
logger.debug("empty-pipeline escalation skipped (fail-open): %s", e)
|
|
94
|
+
return False
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
__all__ = [
|
|
98
|
+
"build_blocker_escalation",
|
|
99
|
+
"build_empty_pipeline_escalation",
|
|
100
|
+
"maybe_escalate_blocked",
|
|
101
|
+
"maybe_escalate_empty_pipeline",
|
|
102
|
+
]
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Objective-driven goal planner (replaces scripts/seed_goal_seeder.py).
|
|
2
|
+
|
|
3
|
+
The PROMPT IS BUILT BY CODE from live board + deliverables state — the agent
|
|
4
|
+
never re-derives its mission from a hardcoded theme list. Pure functions here;
|
|
5
|
+
the dispatcher owns triggering (flags, cooldown, quota) and session dispatch.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import time
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any, Dict, List, Optional
|
|
12
|
+
|
|
13
|
+
PLANNER_TOOLS = ["goal", "task"]
|
|
14
|
+
PLANNER_MAX_STEPS = 8
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def list_deliverables(root: Path, max_files: int = 40) -> List[Dict[str, Any]]:
|
|
18
|
+
"""name (relative), mtime iso, first markdown heading — depth <=2, dotfiles skipped."""
|
|
19
|
+
out: List[Dict[str, Any]] = []
|
|
20
|
+
if not root or not Path(root).is_dir():
|
|
21
|
+
return out
|
|
22
|
+
root = Path(root)
|
|
23
|
+
candidates = sorted(
|
|
24
|
+
(p for pattern in ("*", "*/*") for p in root.glob(pattern)
|
|
25
|
+
if p.is_file() and not any(part.startswith(".") for part in p.relative_to(root).parts)),
|
|
26
|
+
key=lambda p: p.stat().st_mtime, reverse=True,
|
|
27
|
+
)
|
|
28
|
+
for p in candidates[:max_files]:
|
|
29
|
+
heading = ""
|
|
30
|
+
try:
|
|
31
|
+
with open(p, "r", encoding="utf-8", errors="ignore") as fh:
|
|
32
|
+
for i, line in enumerate(fh):
|
|
33
|
+
if i > 40:
|
|
34
|
+
break
|
|
35
|
+
if line.startswith("# "):
|
|
36
|
+
heading = line[2:].strip()
|
|
37
|
+
break
|
|
38
|
+
except OSError:
|
|
39
|
+
pass
|
|
40
|
+
out.append({
|
|
41
|
+
"name": str(p.relative_to(root)),
|
|
42
|
+
"mtime_iso": time.strftime("%Y-%m-%d %H:%M", time.gmtime(p.stat().st_mtime)),
|
|
43
|
+
"heading": heading,
|
|
44
|
+
})
|
|
45
|
+
return out
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def build_planner_prompt(board, user_id: str, deliverables_root: Optional[Path],
|
|
49
|
+
*, history_n: int = 10) -> str:
|
|
50
|
+
from agents.task.goals.board import OBJ_ACTIVE
|
|
51
|
+
|
|
52
|
+
objectives = board.objectives(user_id=user_id, status=OBJ_ACTIVE)
|
|
53
|
+
done = [g for g in board.list(user_id=user_id, status="done", limit=history_n * 3)
|
|
54
|
+
if g.kind == "goal"]
|
|
55
|
+
done = sorted(done, key=lambda g: g.completed_at or 0, reverse=True)[:history_n]
|
|
56
|
+
blocked = [g for g in board.list(user_id=user_id, status="blocked", limit=20)
|
|
57
|
+
if g.kind == "goal"]
|
|
58
|
+
ready = [g for g in board.list(user_id=user_id, status="ready", limit=20)
|
|
59
|
+
if g.kind == "goal"]
|
|
60
|
+
|
|
61
|
+
sections = ["You are planning your own work queue. Create goals that genuinely "
|
|
62
|
+
"advance a standing objective below. If you create nothing, there are "
|
|
63
|
+
"TWO valid, DIFFERENT outcomes — pick the true one:\n"
|
|
64
|
+
" (a) REAL BLOCKER: progress needs something only the owner can provide "
|
|
65
|
+
"(a credential, a decision, access) — state that specific blocker as your "
|
|
66
|
+
"summary so it reaches the owner.\n"
|
|
67
|
+
" (b) QUEUE HEALTHY: the objective is already well-covered and there is "
|
|
68
|
+
"no non-duplicate work worth adding right now — say exactly \"queue "
|
|
69
|
+
"healthy, nothing to add\". This is NORMAL and is NOT a blocker.\n"
|
|
70
|
+
"Do NOT invent busywork, and do NOT report a routine empty/covered queue "
|
|
71
|
+
"as a blocker."]
|
|
72
|
+
|
|
73
|
+
def _obj_line(o) -> str:
|
|
74
|
+
crit = (o.payload or {}).get("success_criteria")
|
|
75
|
+
base = f"- id={o.id} [{o.title}] {o.body}".rstrip()
|
|
76
|
+
return base + (f"\n success criteria: {crit}" if crit else "")
|
|
77
|
+
|
|
78
|
+
sections.append("STANDING OBJECTIVES (active):\n" + "\n".join(
|
|
79
|
+
_obj_line(o) for o in objectives))
|
|
80
|
+
|
|
81
|
+
if done:
|
|
82
|
+
sections.append("RECENTLY DONE (title -> outcome):\n" + "\n".join(
|
|
83
|
+
f"- {g.title} -> {(g.payload or {}).get('outcome') or '[no outcome recorded]'}"
|
|
84
|
+
for g in done))
|
|
85
|
+
if blocked:
|
|
86
|
+
sections.append("BLOCKED (do NOT recreate; fix or avoid):\n" + "\n".join(
|
|
87
|
+
f"- {g.title} (error: {(g.last_failure_error or '?')[:120]})" for g in blocked))
|
|
88
|
+
if ready:
|
|
89
|
+
sections.append("ALREADY QUEUED (ready):\n" + "\n".join(f"- {g.title}" for g in ready))
|
|
90
|
+
|
|
91
|
+
dels = list_deliverables(deliverables_root) if deliverables_root else []
|
|
92
|
+
if dels:
|
|
93
|
+
sections.append("EXISTING DELIVERABLES (extend these; do NOT create overlapping docs):\n"
|
|
94
|
+
+ "\n".join(f"- {d['name']} ({d['mtime_iso']})"
|
|
95
|
+
+ (f": {d['heading']}" if d['heading'] else "")
|
|
96
|
+
for d in dels))
|
|
97
|
+
|
|
98
|
+
sections.append(
|
|
99
|
+
"INSTRUCTIONS:\n"
|
|
100
|
+
"- Create 1-3 goals with goal_create; each MUST set objective_id, tools, and "
|
|
101
|
+
"acceptance (what 'done' must prove: ids/paths/urls).\n"
|
|
102
|
+
"- Each goal must EXTEND an existing deliverable or state why none applies.\n"
|
|
103
|
+
"- Tools by shape: research -> ['web_fetch','anysite','filesystem','task']; "
|
|
104
|
+
"drafting -> ['filesystem','task','web_fetch']; posting/engagement -> "
|
|
105
|
+
"['twitter','filesystem','task']. At most ONE goal may include 'twitter'.\n"
|
|
106
|
+
"- Never exceed 5 ready goals total. A rejected duplicate means: extend the "
|
|
107
|
+
"matched goal's work instead of retrying a rename.\n"
|
|
108
|
+
"- If progress is blocked on something only the owner can provide (credentials, "
|
|
109
|
+
"a decision, access), SAY SO explicitly and specifically — a concrete ask beats "
|
|
110
|
+
"inventing busywork.\n"
|
|
111
|
+
"- Finish with a one-line summary of what you queued, or — if you queued "
|
|
112
|
+
"nothing — the specific blocker/ask standing between you and the objective."
|
|
113
|
+
)
|
|
114
|
+
return "\n\n".join(sections)
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Task Agent Logging Configuration
|
|
3
|
+
|
|
4
|
+
Provides session-aware logging for the task agent system.
|
|
5
|
+
Integrates with core.logging when available, with automatic fallback.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
from typing import Optional
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
# Try to import core logging if available
|
|
14
|
+
try:
|
|
15
|
+
from core.logging import get_component_logger
|
|
16
|
+
CORE_LOGGING_AVAILABLE = True
|
|
17
|
+
except ImportError:
|
|
18
|
+
CORE_LOGGING_AVAILABLE = False
|
|
19
|
+
|
|
20
|
+
# Cache for created loggers
|
|
21
|
+
_LOGGER_CACHE = {}
|
|
22
|
+
|
|
23
|
+
def get_task_logger(component_name: str, session_id: Optional[str] = None) -> logging.Logger:
|
|
24
|
+
"""
|
|
25
|
+
Get a logger for task agent components.
|
|
26
|
+
|
|
27
|
+
Integrates with core logging system when available, with automatic fallback
|
|
28
|
+
to basic logging if core system is not initialized.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
component_name: Component name (e.g., 'agent', 'orchestrator', 'controller')
|
|
32
|
+
session_id: Optional session ID for session-aware logging
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
Configured logger instance with appropriate handlers and formatting
|
|
36
|
+
|
|
37
|
+
Examples:
|
|
38
|
+
>>> logger = get_task_logger('agent', 'abc123')
|
|
39
|
+
>>> logger.info('Agent started')
|
|
40
|
+
|
|
41
|
+
>>> logger = get_task_logger('orchestrator')
|
|
42
|
+
>>> logger.debug('Session created')
|
|
43
|
+
"""
|
|
44
|
+
# Create consistent logger name
|
|
45
|
+
if session_id:
|
|
46
|
+
# Truncate session ID to first 8 chars for readability
|
|
47
|
+
logger_name = f"task.{component_name}[{session_id[:8]}]"
|
|
48
|
+
else:
|
|
49
|
+
logger_name = f"task.{component_name}"
|
|
50
|
+
|
|
51
|
+
# Return cached logger if available
|
|
52
|
+
if logger_name in _LOGGER_CACHE:
|
|
53
|
+
return _LOGGER_CACHE[logger_name]
|
|
54
|
+
|
|
55
|
+
# Use core logging if available
|
|
56
|
+
if CORE_LOGGING_AVAILABLE:
|
|
57
|
+
try:
|
|
58
|
+
logger = get_component_logger(logger_name)
|
|
59
|
+
_LOGGER_CACHE[logger_name] = logger
|
|
60
|
+
return logger
|
|
61
|
+
except Exception:
|
|
62
|
+
# Fall through to basic logger
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
# Fallback to basic logger configuration
|
|
66
|
+
logger = logging.getLogger(logger_name)
|
|
67
|
+
|
|
68
|
+
# Only configure if not already configured
|
|
69
|
+
if not logger.handlers:
|
|
70
|
+
# Set level from environment or default to INFO
|
|
71
|
+
log_level = os.getenv('LOG_LEVEL', 'INFO').upper()
|
|
72
|
+
logger.setLevel(getattr(logging, log_level, logging.INFO))
|
|
73
|
+
|
|
74
|
+
# Add console handler with simple format
|
|
75
|
+
handler = logging.StreamHandler()
|
|
76
|
+
formatter = logging.Formatter(
|
|
77
|
+
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
78
|
+
datefmt='%Y-%m-%d %H:%M:%S'
|
|
79
|
+
)
|
|
80
|
+
handler.setFormatter(formatter)
|
|
81
|
+
logger.addHandler(handler)
|
|
82
|
+
|
|
83
|
+
# Prevent propagation to avoid duplicate logs
|
|
84
|
+
logger.propagate = False
|
|
85
|
+
|
|
86
|
+
_LOGGER_CACHE[logger_name] = logger
|
|
87
|
+
return logger
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def setup_logging(log_level: str = 'INFO', log_file: Optional[str] = None) -> None:
|
|
91
|
+
"""
|
|
92
|
+
Basic logging setup.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
96
|
+
log_file: Optional file path for logging
|
|
97
|
+
"""
|
|
98
|
+
level = getattr(logging, log_level.upper(), logging.INFO)
|
|
99
|
+
|
|
100
|
+
# Basic configuration
|
|
101
|
+
handlers = [logging.StreamHandler()]
|
|
102
|
+
|
|
103
|
+
if log_file:
|
|
104
|
+
handlers.append(logging.FileHandler(log_file))
|
|
105
|
+
|
|
106
|
+
logging.basicConfig(
|
|
107
|
+
level=level,
|
|
108
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
109
|
+
datefmt='%Y-%m-%d %H:%M:%S',
|
|
110
|
+
handlers=handlers,
|
|
111
|
+
force=True
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Silence noisy libraries
|
|
115
|
+
configure_library_loggers()
|
|
116
|
+
|
|
117
|
+
def configure_library_loggers():
|
|
118
|
+
"""Configure logging levels for third-party libraries."""
|
|
119
|
+
# Silence noisy libraries
|
|
120
|
+
noisy_loggers = [
|
|
121
|
+
'urllib3',
|
|
122
|
+
'httpx',
|
|
123
|
+
'httpcore',
|
|
124
|
+
'selenium',
|
|
125
|
+
'PIL',
|
|
126
|
+
'matplotlib',
|
|
127
|
+
'asyncio',
|
|
128
|
+
'filelock',
|
|
129
|
+
'fontTools',
|
|
130
|
+
'pinecone',
|
|
131
|
+
'google.auth',
|
|
132
|
+
'google.api_core',
|
|
133
|
+
'google.cloud',
|
|
134
|
+
'googleapiclient',
|
|
135
|
+
'openai',
|
|
136
|
+
'anthropic'
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
for logger_name in noisy_loggers:
|
|
140
|
+
logging.getLogger(logger_name).setLevel(logging.WARNING)
|
|
141
|
+
|
|
142
|
+
# Special handling for very noisy loggers
|
|
143
|
+
logging.getLogger('httpx._client').setLevel(logging.ERROR)
|
|
144
|
+
logging.getLogger('httpcore._trace').setLevel(logging.ERROR)
|
|
145
|
+
|
|
146
|
+
# Disable propagation for task loggers to avoid duplicates
|
|
147
|
+
logging.getLogger('task').propagate = False
|
|
148
|
+
|
|
149
|
+
# Removed compatibility no-ops - these functions are no longer needed:
|
|
150
|
+
# - silence_metadata_logs()
|
|
151
|
+
# - fix_httpx_logging()
|
|
152
|
+
# - enable_log_deduplication()
|
|
153
|
+
# - reset_log_deduplication_cache()
|
|
154
|
+
# - optimize_logging_for_agent_system()
|
|
155
|
+
# If you're using any of these, please remove the calls or use configure_library_loggers() directly
|