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
api/TASK_API_DOCS.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Task Agent HTTP API Documentation
|
|
2
|
+
|
|
3
|
+
_Last reviewed: 2026-06-22. For the authoritative architecture see ../AGENTS.md; for env flags see ../docs/CONFIGURATION.md._
|
|
4
|
+
|
|
5
|
+
> Paths below mirror `api/task_http_api.py` (router `prefix="/task"`, mounted under `/api` → app-level
|
|
6
|
+
> `/api/task/...`). Grep `@router.` in that file for the authoritative path list.
|
|
7
|
+
|
|
8
|
+
## Base URL
|
|
9
|
+
- Production: `https://your-domain.example/api/task`
|
|
10
|
+
- Local: `http://localhost:9000/api/task`
|
|
11
|
+
|
|
12
|
+
## Endpoints
|
|
13
|
+
|
|
14
|
+
### 1. Create and Start Session ✅
|
|
15
|
+
**POST** `/api/task/sessions`
|
|
16
|
+
|
|
17
|
+
Creates a new AutoV2 session and starts it running in the background.
|
|
18
|
+
|
|
19
|
+
#### Request Body
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"task": "Your task description here", // REQUIRED
|
|
23
|
+
"user_id": "user_identifier", // Optional, defaults to "_anonymous_"
|
|
24
|
+
"session_id": "custom_session_id", // Optional, auto-generated if not provided
|
|
25
|
+
"model": "gpt-5", // Optional, defaults to "gpt-5"
|
|
26
|
+
"provider": "openai", // Optional, defaults to "openai"
|
|
27
|
+
"temperature": 0.0, // Optional, defaults to 0.0
|
|
28
|
+
"use_vision": true, // Optional, defaults to true
|
|
29
|
+
"max_steps": 50, // Optional, defaults to 50
|
|
30
|
+
"tools": ["browser", "filesystem"], // Optional, defaults to ["browser", "filesystem"]
|
|
31
|
+
"tools_config": {} // Optional, tool-specific configuration
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
#### Response
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"ok": true,
|
|
39
|
+
"session_id": "37155a84-85fe-4456-bd05-187c44612c49",
|
|
40
|
+
"task": "Test AutoV2. Calculate 2+2.",
|
|
41
|
+
"state": "running",
|
|
42
|
+
"status": "running",
|
|
43
|
+
"model": "gpt-5",
|
|
44
|
+
"tools": ["browser", "filesystem"],
|
|
45
|
+
"webview_url": "https://your-domain.example/session/37155a84-85fe-4456-bd05-187c44612c49",
|
|
46
|
+
"message": "Session created and started successfully",
|
|
47
|
+
"error": null
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
#### Working Example
|
|
52
|
+
```bash
|
|
53
|
+
# From local machine (may have curl issues)
|
|
54
|
+
ssh -i <YOUR_SSH_KEY> root@<YOUR_SERVER_IP> \
|
|
55
|
+
"curl -X POST http://localhost:9000/api/task/sessions \
|
|
56
|
+
-H 'Content-Type: application/json' \
|
|
57
|
+
-d '{\"task\":\"Test AutoV2. Calculate 2+2.\",\"user_id\":\"test\"}' -s"
|
|
58
|
+
|
|
59
|
+
# OR save to file first
|
|
60
|
+
echo '{"task":"Your task here","user_id":"test"}' > /tmp/request.json
|
|
61
|
+
curl -X POST https://your-domain.example/api/task/sessions \
|
|
62
|
+
-H "Content-Type: application/json" \
|
|
63
|
+
-d @/tmp/request.json
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. Send User Message to Session
|
|
67
|
+
**POST** `/api/task/sessions/{session_id}/messages`
|
|
68
|
+
|
|
69
|
+
Send guidance or feedback to a running AutoV2 session. The session ID is in the URL path.
|
|
70
|
+
|
|
71
|
+
#### Request Body
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"text": "Your message here", // REQUIRED
|
|
75
|
+
"kind": "guidance", // Optional: "guidance" or "feedback"
|
|
76
|
+
"metadata": {} // Optional additional metadata
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### Response
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"success": true,
|
|
84
|
+
"message": "Message sent successfully",
|
|
85
|
+
"metadata": {
|
|
86
|
+
"session_id": "session-uuid"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 3. Session Control
|
|
92
|
+
|
|
93
|
+
#### Cancel Session
|
|
94
|
+
**POST** `/api/task/sessions/{session_id}/cancel`
|
|
95
|
+
|
|
96
|
+
> Note: there are no pause/resume routes.
|
|
97
|
+
|
|
98
|
+
### 4. Get Session Info
|
|
99
|
+
**GET** `/api/task/sessions/{session_id}`
|
|
100
|
+
|
|
101
|
+
### 5. List User Sessions
|
|
102
|
+
**GET** `/api/task/users/{user_id}/sessions`
|
|
103
|
+
|
|
104
|
+
### 6. Get Capabilities
|
|
105
|
+
**GET** `/api/task/capabilities`
|
|
106
|
+
|
|
107
|
+
## Testing the Deployment
|
|
108
|
+
|
|
109
|
+
### Step 1: Create a Session
|
|
110
|
+
```bash
|
|
111
|
+
# Direct on server (WORKING)
|
|
112
|
+
ssh -i <YOUR_SSH_KEY> root@<YOUR_SERVER_IP> \
|
|
113
|
+
"curl -X POST http://localhost:9000/api/task/sessions \
|
|
114
|
+
-H 'Content-Type: application/json' \
|
|
115
|
+
-d '{\"task\":\"Calculate 2+2 and explain.\",\"user_id\":\"test\",\"max_steps\":5}' -s"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Step 2: Check Logs
|
|
119
|
+
```bash
|
|
120
|
+
# View session logs
|
|
121
|
+
ssh -i <YOUR_SSH_KEY> root@<YOUR_SERVER_IP> \
|
|
122
|
+
"sudo journalctl -u rob.service --since '2 minutes ago' | grep -E 'session_id|Step|Calculate'"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Step 3: View in Browser
|
|
126
|
+
The response includes a `webview_url` you can open in your browser to watch the session progress:
|
|
127
|
+
```
|
|
128
|
+
https://your-domain.example/session/{session_id}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Common Issues
|
|
132
|
+
|
|
133
|
+
1. **curl issues on macOS**: The curl command may have issues with special characters. Use SSH to run curl directly on the server or save JSON to a file first.
|
|
134
|
+
|
|
135
|
+
2. **Session not found**: A `GET /api/task/sessions/{id}` may return 404 for an unknown/expired session, or a 409 (with `owner_pid`) if the session is owned by another worker. Check logs if unsure.
|
|
136
|
+
|
|
137
|
+
3. **Service unavailable**: If you get 503 errors, the AutoV2 agent may not be initialized. Check service status:
|
|
138
|
+
```bash
|
|
139
|
+
ssh -i <YOUR_SSH_KEY> root@<YOUR_SERVER_IP> "sudo systemctl status rob.service"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Deployment Verification
|
|
143
|
+
|
|
144
|
+
✅ **Successful Test Session Created**
|
|
145
|
+
- Session ID: `37155a84-85fe-4456-bd05-187c44612c49`
|
|
146
|
+
- Task: "Test AutoV2. Calculate 2+2."
|
|
147
|
+
- Status: Running
|
|
148
|
+
- Model: gpt-5
|
|
149
|
+
- Tools: browser, filesystem
|
|
150
|
+
|
|
151
|
+
The AutoV2 fixes have been successfully deployed and are working!
|
api/__init__.py
ADDED
|
File without changes
|
api/a2a/__init__.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""A2A (Agent-to-Agent) Protocol Implementation for POLYROB Platform.
|
|
2
|
+
|
|
3
|
+
This module implements Google's A2A Protocol (https://github.com/google/A2A)
|
|
4
|
+
enabling POLYROB to both:
|
|
5
|
+
1. Expose its capabilities to other A2A-compliant agents (Server mode)
|
|
6
|
+
2. Consume services from other A2A agents (Client mode)
|
|
7
|
+
|
|
8
|
+
Key Components:
|
|
9
|
+
- AgentCard: Self-describing manifest of agent capabilities
|
|
10
|
+
- Task Management: JSON-RPC endpoints for task lifecycle
|
|
11
|
+
- Streaming: SSE-based real-time status updates
|
|
12
|
+
- Push Notifications: Webhook callbacks for async updates
|
|
13
|
+
- Client: Consume external A2A agent services
|
|
14
|
+
|
|
15
|
+
Authentication:
|
|
16
|
+
- x402 (primary): Pay-per-request crypto payments
|
|
17
|
+
- Bearer JWT: For registered users
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
'agent_card_router',
|
|
22
|
+
'a2a_router',
|
|
23
|
+
'streaming_router'
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def __getattr__(name):
|
|
28
|
+
if name == "agent_card_router":
|
|
29
|
+
from api.a2a.agent_card import router
|
|
30
|
+
return router
|
|
31
|
+
if name == "a2a_router":
|
|
32
|
+
from api.a2a.endpoints import router
|
|
33
|
+
return router
|
|
34
|
+
if name == "streaming_router":
|
|
35
|
+
from api.a2a.streaming import router
|
|
36
|
+
return router
|
|
37
|
+
raise AttributeError(name)
|
api/a2a/agent_card.py
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"""A2A Agent Card - Self-describing manifest of POLYROB's capabilities.
|
|
2
|
+
|
|
3
|
+
The Agent Card is hosted at /.well-known/agent.json following RFC 8615.
|
|
4
|
+
Other A2A-compliant agents use this to discover POLYROB's capabilities
|
|
5
|
+
and understand how to interact with it.
|
|
6
|
+
|
|
7
|
+
Reference: https://a2a-protocol.org/latest/topics/agent-discovery/
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import List, Dict, Any, Optional
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
from fastapi import APIRouter, Request
|
|
13
|
+
import os
|
|
14
|
+
import logging
|
|
15
|
+
|
|
16
|
+
from core.version import get_version
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
router = APIRouter()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _x402_price_usd() -> float:
|
|
23
|
+
"""Single x402 price source (F12) — keeps the card aligned with the live charge."""
|
|
24
|
+
from modules.x402.x402_integration import get_x402_price_usd
|
|
25
|
+
return get_x402_price_usd()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class AgentSkill(BaseModel):
|
|
29
|
+
"""A specific capability the agent can perform."""
|
|
30
|
+
id: str = Field(..., description="Unique skill identifier")
|
|
31
|
+
name: str = Field(..., description="Human-readable name")
|
|
32
|
+
description: str = Field(..., description="Functional explanation")
|
|
33
|
+
tags: Optional[List[str]] = Field(default_factory=list)
|
|
34
|
+
examples: Optional[List[str]] = Field(default_factory=list, description="Example use cases")
|
|
35
|
+
inputModes: Optional[List[str]] = Field(default=["text"], description="Supported input MIME types")
|
|
36
|
+
outputModes: Optional[List[str]] = Field(default=["text"], description="Supported output MIME types")
|
|
37
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class AgentCapabilities(BaseModel):
|
|
41
|
+
"""Agent capability flags."""
|
|
42
|
+
streaming: bool = True # SSE streaming support
|
|
43
|
+
pushNotifications: bool = True # Webhook callbacks
|
|
44
|
+
stateTransitionHistory: bool = True # Task state change history
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class AgentProvider(BaseModel):
|
|
48
|
+
"""Organization providing this agent."""
|
|
49
|
+
organization: str
|
|
50
|
+
url: str
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SecurityScheme(BaseModel):
|
|
54
|
+
"""Security scheme definition (OpenAPI 3.2 compatible)."""
|
|
55
|
+
type: str # "apiKey", "http", "oauth2", "openIdConnect", "mutualTLS"
|
|
56
|
+
scheme: Optional[str] = None # For http: "bearer", "basic"
|
|
57
|
+
bearerFormat: Optional[str] = None # e.g., "JWT"
|
|
58
|
+
name: Optional[str] = None # For apiKey: header/query param name
|
|
59
|
+
in_: Optional[str] = Field(None, alias="in") # For apiKey: "header", "query", "cookie"
|
|
60
|
+
description: Optional[str] = None
|
|
61
|
+
|
|
62
|
+
class Config:
|
|
63
|
+
populate_by_name = True
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class AgentCard(BaseModel):
|
|
67
|
+
"""A2A Agent Card - Complete agent metadata.
|
|
68
|
+
|
|
69
|
+
Hosted at /.well-known/agent.json for discovery.
|
|
70
|
+
"""
|
|
71
|
+
# Core Identity
|
|
72
|
+
name: str = "POLYROB"
|
|
73
|
+
description: str = Field(
|
|
74
|
+
default="AI automation agent with browser control, file system access, "
|
|
75
|
+
"MCP integrations, and autonomous task execution capabilities."
|
|
76
|
+
)
|
|
77
|
+
url: str = Field(..., description="Base URL for A2A service endpoint")
|
|
78
|
+
version: str = Field(default_factory=get_version)
|
|
79
|
+
|
|
80
|
+
# Protocol
|
|
81
|
+
protocolVersion: str = "1.0" # A2A protocol version
|
|
82
|
+
|
|
83
|
+
# Media Types
|
|
84
|
+
defaultInputModes: List[str] = Field(
|
|
85
|
+
default=["text/plain", "application/json", "image/png", "image/jpeg"]
|
|
86
|
+
)
|
|
87
|
+
defaultOutputModes: List[str] = Field(
|
|
88
|
+
default=["text/plain", "application/json", "image/png", "application/pdf"]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Capabilities
|
|
92
|
+
capabilities: AgentCapabilities = Field(default_factory=AgentCapabilities)
|
|
93
|
+
|
|
94
|
+
# Skills
|
|
95
|
+
skills: List[AgentSkill] = Field(default_factory=list)
|
|
96
|
+
|
|
97
|
+
# Provider
|
|
98
|
+
provider: AgentProvider
|
|
99
|
+
|
|
100
|
+
# Security (OpenAPI 3.2 compatible)
|
|
101
|
+
securitySchemes: Dict[str, SecurityScheme] = Field(default_factory=dict)
|
|
102
|
+
security: List[Dict[str, List[str]]] = Field(default_factory=list)
|
|
103
|
+
|
|
104
|
+
# Extensions
|
|
105
|
+
supportsAuthenticatedExtendedCard: bool = True
|
|
106
|
+
|
|
107
|
+
# Pricing (custom extension for x402)
|
|
108
|
+
pricing: Optional[Dict[str, Any]] = None
|
|
109
|
+
|
|
110
|
+
# Metadata
|
|
111
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def build_agent_card(request: Optional[Request] = None) -> AgentCard:
|
|
115
|
+
"""Build the Agent Card from current configuration.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
request: Optional FastAPI request for URL detection
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Complete AgentCard instance
|
|
122
|
+
"""
|
|
123
|
+
# Determine base URL
|
|
124
|
+
base_url = os.environ.get("A2A_BASE_URL")
|
|
125
|
+
if not base_url and request:
|
|
126
|
+
# Construct from request
|
|
127
|
+
scheme = request.headers.get("x-forwarded-proto", request.url.scheme)
|
|
128
|
+
host = request.headers.get("host", request.url.netloc)
|
|
129
|
+
base_url = f"{scheme}://{host}"
|
|
130
|
+
|
|
131
|
+
base_url = base_url or "http://localhost:9000"
|
|
132
|
+
|
|
133
|
+
# Define skills
|
|
134
|
+
skills = [
|
|
135
|
+
AgentSkill(
|
|
136
|
+
id="web-automation",
|
|
137
|
+
name="Web Automation",
|
|
138
|
+
description="Automate browser tasks: navigate websites, click elements, "
|
|
139
|
+
"fill forms, take screenshots, extract data from web pages.",
|
|
140
|
+
tags=["browser", "automation", "scraping", "web"],
|
|
141
|
+
examples=[
|
|
142
|
+
"Go to example.com and take a screenshot",
|
|
143
|
+
"Fill out the contact form with my information",
|
|
144
|
+
"Extract all product prices from the page",
|
|
145
|
+
"Navigate through a multi-step checkout process"
|
|
146
|
+
],
|
|
147
|
+
inputModes=["text/plain", "image/png", "image/jpeg"],
|
|
148
|
+
outputModes=["text/plain", "image/png", "application/json"]
|
|
149
|
+
),
|
|
150
|
+
AgentSkill(
|
|
151
|
+
id="file-management",
|
|
152
|
+
name="File Management",
|
|
153
|
+
description="Create, read, edit, and organize files in the workspace. "
|
|
154
|
+
"Supports various formats including text, JSON, CSV, and more.",
|
|
155
|
+
tags=["filesystem", "documents", "files"],
|
|
156
|
+
examples=[
|
|
157
|
+
"Create a summary.txt with the meeting notes",
|
|
158
|
+
"Read the config.json file and parse its contents",
|
|
159
|
+
"Organize downloaded files by date",
|
|
160
|
+
"Convert CSV data to JSON format"
|
|
161
|
+
],
|
|
162
|
+
inputModes=["text/plain", "application/json"],
|
|
163
|
+
outputModes=["text/plain", "application/json", "text/csv"]
|
|
164
|
+
),
|
|
165
|
+
AgentSkill(
|
|
166
|
+
id="research",
|
|
167
|
+
name="Research & Analysis",
|
|
168
|
+
description="Search the web, analyze data, compile reports, and synthesize "
|
|
169
|
+
"information from multiple sources.",
|
|
170
|
+
tags=["research", "search", "analysis", "reports"],
|
|
171
|
+
examples=[
|
|
172
|
+
"Research the top 5 competitors in AI automation",
|
|
173
|
+
"Find recent news about cryptocurrency regulations",
|
|
174
|
+
"Analyze the sentiment of customer reviews",
|
|
175
|
+
"Create a comparison report of SaaS tools"
|
|
176
|
+
],
|
|
177
|
+
inputModes=["text/plain"],
|
|
178
|
+
outputModes=["text/plain", "application/json", "text/markdown"]
|
|
179
|
+
),
|
|
180
|
+
AgentSkill(
|
|
181
|
+
id="mcp-integration",
|
|
182
|
+
name="MCP Tool Integration",
|
|
183
|
+
description="Access external services via Model Context Protocol. "
|
|
184
|
+
"Connect to databases, APIs, and other services through MCP.",
|
|
185
|
+
tags=["mcp", "integration", "api", "external-services"],
|
|
186
|
+
examples=[
|
|
187
|
+
"Use the anysite tool to scrape the article content",
|
|
188
|
+
"Query the connected database for sales data",
|
|
189
|
+
"Send an email via the configured SMTP service",
|
|
190
|
+
"Fetch data from the weather API"
|
|
191
|
+
],
|
|
192
|
+
inputModes=["text/plain", "application/json"],
|
|
193
|
+
outputModes=["text/plain", "application/json"]
|
|
194
|
+
),
|
|
195
|
+
AgentSkill(
|
|
196
|
+
id="task-planning",
|
|
197
|
+
name="Task Planning & Execution",
|
|
198
|
+
description="Break down complex tasks into steps, plan execution strategy, "
|
|
199
|
+
"and autonomously complete multi-step workflows.",
|
|
200
|
+
tags=["planning", "workflow", "automation", "multi-step"],
|
|
201
|
+
examples=[
|
|
202
|
+
"Plan and execute a market research project",
|
|
203
|
+
"Set up a new project structure with files and configs",
|
|
204
|
+
"Create and populate a spreadsheet with collected data",
|
|
205
|
+
"Automate a daily reporting workflow"
|
|
206
|
+
],
|
|
207
|
+
inputModes=["text/plain"],
|
|
208
|
+
outputModes=["text/plain", "application/json"]
|
|
209
|
+
)
|
|
210
|
+
]
|
|
211
|
+
|
|
212
|
+
# Security schemes
|
|
213
|
+
security_schemes = {
|
|
214
|
+
"x402": SecurityScheme(
|
|
215
|
+
type="apiKey",
|
|
216
|
+
name="X-PAYMENT",
|
|
217
|
+
in_="header",
|
|
218
|
+
description="x402 cryptocurrency payment. Pay-per-request, no account required. See /api/x402/pricing for details."
|
|
219
|
+
),
|
|
220
|
+
"apiKey": SecurityScheme(
|
|
221
|
+
type="apiKey",
|
|
222
|
+
name="X-API-KEY",
|
|
223
|
+
in_="header",
|
|
224
|
+
description="API key for programmatic access. Create at POST /api/auth/api-keys (requires DEN token)."
|
|
225
|
+
),
|
|
226
|
+
"bearer": SecurityScheme(
|
|
227
|
+
type="http",
|
|
228
|
+
scheme="bearer",
|
|
229
|
+
bearerFormat="JWT",
|
|
230
|
+
description="JWT token from wallet SIWE authentication. For web UI users."
|
|
231
|
+
)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
# Security requirements - API key is easiest for agents
|
|
235
|
+
security = [
|
|
236
|
+
{"apiKey": []}, # Recommended: API key (simple, persistent)
|
|
237
|
+
{"x402": []}, # Alternative: pay-per-request (no account)
|
|
238
|
+
{"bearer": []} # Alternative: JWT (for web users)
|
|
239
|
+
]
|
|
240
|
+
|
|
241
|
+
# Pricing information (x402 extension)
|
|
242
|
+
pricing = {
|
|
243
|
+
"model": "pay-per-request",
|
|
244
|
+
"description": "Pay only for what you use. No subscription required.",
|
|
245
|
+
"authentication_options": {
|
|
246
|
+
"api_key": {
|
|
247
|
+
"description": "Recommended for AI agents. Create once, use forever.",
|
|
248
|
+
"how_to_get": "1) Login with wallet at /api/auth/nonce + /api/auth/verify, 2) POST /api/auth/api-keys",
|
|
249
|
+
"requires": "DEN token ownership",
|
|
250
|
+
"header": "X-API-KEY: rob_xxx..."
|
|
251
|
+
},
|
|
252
|
+
"x402": {
|
|
253
|
+
"description": "Pay-per-request with crypto. No account needed.",
|
|
254
|
+
"how_to_use": (
|
|
255
|
+
"Standard x402 flow: 1) send your request; 2) on HTTP 402 read the "
|
|
256
|
+
"payment requirements; 3) retry with an X-PAYMENT header (base64 "
|
|
257
|
+
"EIP-3009 authorization). Settlement is handled automatically."
|
|
258
|
+
),
|
|
259
|
+
"per_request_usd": _x402_price_usd(),
|
|
260
|
+
"supported_chains": ["base", "ethereum"],
|
|
261
|
+
"supported_assets": ["usdc", "usdt", "eth"],
|
|
262
|
+
"payment_address": os.environ.get("X402_PAYMENT_RECIPIENT", os.environ.get("X402_PAYMENT_ADDRESS", "")),
|
|
263
|
+
"facilitator": os.environ.get("X402_FACILITATOR_URL", "") or "Direct signature verification"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"credits": {
|
|
267
|
+
"enabled": True,
|
|
268
|
+
"credit_cost_usd": 0.01,
|
|
269
|
+
"session_credits": 1,
|
|
270
|
+
"description": "For registered users with pre-purchased credits"
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
# Instance branding: reuse the webview branding seam (POLYROB_BRAND_URL /
|
|
275
|
+
# POLYROB_TERMS_URL / POLYROB_PRIVACY_URL / POLYROB_SUPPORT_URL) so an
|
|
276
|
+
# instance sets its brand once; default is instance-neutral (the base URL).
|
|
277
|
+
brand_url = os.environ.get("POLYROB_BRAND_URL", base_url).strip().rstrip("/")
|
|
278
|
+
|
|
279
|
+
return AgentCard(
|
|
280
|
+
url=f"{base_url}/a2a",
|
|
281
|
+
skills=skills,
|
|
282
|
+
provider=AgentProvider(
|
|
283
|
+
organization="The Self Rule",
|
|
284
|
+
url=brand_url
|
|
285
|
+
),
|
|
286
|
+
securitySchemes=security_schemes,
|
|
287
|
+
security=security,
|
|
288
|
+
pricing=pricing,
|
|
289
|
+
metadata={
|
|
290
|
+
"contact": os.environ.get("POLYROB_SUPPORT_URL", brand_url).strip(),
|
|
291
|
+
"documentation": f"{base_url}/docs",
|
|
292
|
+
"terms_of_service": os.environ.get("POLYROB_TERMS_URL", f"{brand_url}/terms").strip(),
|
|
293
|
+
"privacy_policy": os.environ.get("POLYROB_PRIVACY_URL", f"{brand_url}/privacy").strip()
|
|
294
|
+
}
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
@router.get("/.well-known/agent.json", response_model=AgentCard)
|
|
299
|
+
async def get_agent_card_wellknown(request: Request) -> AgentCard:
|
|
300
|
+
"""Return the Agent Card at RFC 8615 well-known path.
|
|
301
|
+
|
|
302
|
+
This is the primary discovery endpoint for A2A agents.
|
|
303
|
+
"""
|
|
304
|
+
logger.info("Agent Card requested at /.well-known/agent.json")
|
|
305
|
+
return build_agent_card(request)
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
@router.get("/a2a/agent-card", response_model=AgentCard)
|
|
309
|
+
async def get_agent_card_api(request: Request) -> AgentCard:
|
|
310
|
+
"""Return the Agent Card at API path.
|
|
311
|
+
|
|
312
|
+
Alternative endpoint for programmatic access.
|
|
313
|
+
"""
|
|
314
|
+
return build_agent_card(request)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
@router.get("/a2a/extended-card", response_model=AgentCard)
|
|
318
|
+
async def get_extended_agent_card(request: Request) -> AgentCard:
|
|
319
|
+
"""Return extended Agent Card for authenticated clients.
|
|
320
|
+
|
|
321
|
+
May include additional capabilities or reduced pricing
|
|
322
|
+
for authenticated users.
|
|
323
|
+
"""
|
|
324
|
+
# Build base card
|
|
325
|
+
card = build_agent_card(request)
|
|
326
|
+
|
|
327
|
+
# Check authentication
|
|
328
|
+
user_id = getattr(request.state, 'user_id', None)
|
|
329
|
+
tier = getattr(request.state, 'tier', 'free')
|
|
330
|
+
|
|
331
|
+
if user_id and tier != 'free':
|
|
332
|
+
# Add tier-specific metadata
|
|
333
|
+
card.metadata = card.metadata or {}
|
|
334
|
+
card.metadata['authenticated'] = True
|
|
335
|
+
card.metadata['tier'] = tier
|
|
336
|
+
|
|
337
|
+
return card
|