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
tools/mcp/config.py
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"""Configuration models for MCP service."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import re
|
|
6
|
+
from typing import Dict, List, Optional, Any, Union
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from pydantic import BaseModel, Field, validator, root_validator
|
|
9
|
+
from core.exceptions import ConfigurationError
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MCPServerType(str, Enum):
|
|
15
|
+
"""MCP server connection types."""
|
|
16
|
+
STDIO = "stdio"
|
|
17
|
+
SSE = "sse"
|
|
18
|
+
HTTP = "http" # HTTP JSON-RPC (request-response)
|
|
19
|
+
STREAMABLE_HTTP = "streamable_http" # POST with SSE responses (e.g., mcp.anysite.io)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MCPEnvironmentVariable(BaseModel):
|
|
23
|
+
"""Environment variable configuration for MCP servers."""
|
|
24
|
+
name: str = Field(..., description="Environment variable name")
|
|
25
|
+
value: str = Field(..., description="Environment variable value (supports ${VAR} substitution)")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MCPServerConfig(BaseModel):
|
|
29
|
+
"""Configuration for a single MCP server."""
|
|
30
|
+
|
|
31
|
+
type: MCPServerType = Field(..., description="Server connection type")
|
|
32
|
+
command: Optional[List[str]] = Field(None, description="Command to start server (for STDIO)")
|
|
33
|
+
args: Optional[List[str]] = Field(default_factory=list, description="Arguments for server command")
|
|
34
|
+
url: Optional[str] = Field(None, description="Server URL (for SSE)")
|
|
35
|
+
headers: Optional[Dict[str, str]] = Field(default_factory=dict, description="HTTP headers (for SSE)")
|
|
36
|
+
env: Optional[List[MCPEnvironmentVariable]] = Field(default_factory=list, description="Environment variables")
|
|
37
|
+
enabled: bool = Field(True, description="Whether this server is enabled")
|
|
38
|
+
timeout: int = Field(30, description="Connection timeout in seconds")
|
|
39
|
+
retry_attempts: int = Field(3, description="Number of retry attempts")
|
|
40
|
+
retry_delay: int = Field(5, description="Delay between retries in seconds")
|
|
41
|
+
auto_reconnect: bool = Field(True, description="Whether to auto-reconnect on failure")
|
|
42
|
+
max_concurrent_requests: int = Field(10, description="Maximum concurrent requests to this server")
|
|
43
|
+
message_endpoint: Optional[str] = Field(None, description="For SSE: explicit POST endpoint for messages (FIX #7)")
|
|
44
|
+
|
|
45
|
+
@validator('command')
|
|
46
|
+
def validate_command_for_stdio(cls, v, values):
|
|
47
|
+
"""Validate that command is provided for STDIO servers."""
|
|
48
|
+
if values.get('type') == MCPServerType.STDIO and not v:
|
|
49
|
+
raise ValueError("command is required for STDIO servers")
|
|
50
|
+
return v
|
|
51
|
+
|
|
52
|
+
@validator('url')
|
|
53
|
+
def validate_url_for_sse(cls, v, values):
|
|
54
|
+
"""Validate that URL is provided for SSE servers."""
|
|
55
|
+
if values.get('type') == MCPServerType.SSE and not v:
|
|
56
|
+
raise ValueError("url is required for SSE servers")
|
|
57
|
+
return v
|
|
58
|
+
|
|
59
|
+
@validator('timeout')
|
|
60
|
+
def validate_timeout(cls, v):
|
|
61
|
+
"""Validate timeout is positive."""
|
|
62
|
+
if v <= 0:
|
|
63
|
+
raise ValueError("timeout must be positive")
|
|
64
|
+
return v
|
|
65
|
+
|
|
66
|
+
@validator('retry_attempts')
|
|
67
|
+
def validate_retry_attempts(cls, v):
|
|
68
|
+
"""Validate retry attempts is non-negative."""
|
|
69
|
+
if v < 0:
|
|
70
|
+
raise ValueError("retry_attempts must be non-negative")
|
|
71
|
+
return v
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class MCPConfig(BaseModel):
|
|
75
|
+
"""Main MCP service configuration."""
|
|
76
|
+
|
|
77
|
+
enabled: bool = Field(False, description="Whether MCP service is enabled (disabled by default for security)")
|
|
78
|
+
servers: Dict[str, MCPServerConfig] = Field(default_factory=dict, description="Configured MCP servers")
|
|
79
|
+
global_timeout: int = Field(60, description="Global timeout for all operations")
|
|
80
|
+
max_concurrent_connections: int = Field(10, description="Maximum concurrent server connections")
|
|
81
|
+
enable_resource_caching: bool = Field(True, description="Whether to cache resources")
|
|
82
|
+
cache_ttl_seconds: int = Field(300, description="Cache TTL in seconds")
|
|
83
|
+
auto_discover_tools: bool = Field(True, description="Whether to automatically discover and register tools")
|
|
84
|
+
log_mcp_communications: bool = Field(False, description="Whether to log MCP protocol messages (debug)")
|
|
85
|
+
|
|
86
|
+
@validator('global_timeout')
|
|
87
|
+
def validate_global_timeout(cls, v):
|
|
88
|
+
"""Validate global timeout is positive."""
|
|
89
|
+
if v <= 0:
|
|
90
|
+
raise ValueError("global_timeout must be positive")
|
|
91
|
+
return v
|
|
92
|
+
|
|
93
|
+
@validator('max_concurrent_connections')
|
|
94
|
+
def validate_max_concurrent_connections(cls, v):
|
|
95
|
+
"""Validate max concurrent connections is positive."""
|
|
96
|
+
if v <= 0:
|
|
97
|
+
raise ValueError("max_concurrent_connections must be positive")
|
|
98
|
+
return v
|
|
99
|
+
|
|
100
|
+
@validator('cache_ttl_seconds')
|
|
101
|
+
def validate_cache_ttl(cls, v):
|
|
102
|
+
"""Validate cache TTL is non-negative."""
|
|
103
|
+
if v < 0:
|
|
104
|
+
raise ValueError("cache_ttl_seconds must be non-negative")
|
|
105
|
+
return v
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def resolve_environment_variables(config_value: str) -> str:
|
|
109
|
+
"""Resolve environment variables in configuration values.
|
|
110
|
+
|
|
111
|
+
Supports ${VAR} and ${VAR:-default} syntax.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
config_value: Configuration value that may contain environment variables
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
Resolved configuration value
|
|
118
|
+
|
|
119
|
+
Raises:
|
|
120
|
+
ConfigurationError: If required environment variable is not found
|
|
121
|
+
"""
|
|
122
|
+
if not isinstance(config_value, str):
|
|
123
|
+
return config_value
|
|
124
|
+
|
|
125
|
+
# Pattern to match ${VAR} or ${VAR:-default}
|
|
126
|
+
pattern = re.compile(r'\$\{([^}]+)\}')
|
|
127
|
+
|
|
128
|
+
def replace_var(match):
|
|
129
|
+
var_expr = match.group(1)
|
|
130
|
+
|
|
131
|
+
# Check if there's a default value
|
|
132
|
+
if ':-' in var_expr:
|
|
133
|
+
var_name, default_value = var_expr.split(':-', 1)
|
|
134
|
+
return os.getenv(var_name, default_value)
|
|
135
|
+
else:
|
|
136
|
+
var_name = var_expr
|
|
137
|
+
value = os.getenv(var_name)
|
|
138
|
+
if value is None:
|
|
139
|
+
raise ConfigurationError(f"Required environment variable '{var_name}' not found")
|
|
140
|
+
return value
|
|
141
|
+
|
|
142
|
+
return pattern.sub(replace_var, config_value)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def resolve_config_environment_variables(config: MCPConfig) -> MCPConfig:
|
|
146
|
+
"""Resolve all environment variables in an MCP configuration.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
config: MCP configuration with potential environment variables
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
Configuration with resolved environment variables
|
|
153
|
+
|
|
154
|
+
Raises:
|
|
155
|
+
ConfigurationError: If required environment variable is not found
|
|
156
|
+
"""
|
|
157
|
+
resolved_servers = {}
|
|
158
|
+
|
|
159
|
+
def _resolve_one(server_config: MCPServerConfig) -> MCPServerConfig:
|
|
160
|
+
# Create a copy of the server config dict
|
|
161
|
+
server_dict = server_config.model_dump()
|
|
162
|
+
|
|
163
|
+
# Resolve URL if present
|
|
164
|
+
if server_dict.get('url'):
|
|
165
|
+
server_dict['url'] = resolve_environment_variables(server_dict['url'])
|
|
166
|
+
|
|
167
|
+
# Resolve headers if present
|
|
168
|
+
if server_dict.get('headers'):
|
|
169
|
+
resolved_headers = {}
|
|
170
|
+
for key, value in server_dict['headers'].items():
|
|
171
|
+
resolved_headers[key] = resolve_environment_variables(value)
|
|
172
|
+
server_dict['headers'] = resolved_headers
|
|
173
|
+
|
|
174
|
+
# Resolve environment variables
|
|
175
|
+
if server_dict.get('env'):
|
|
176
|
+
resolved_env = []
|
|
177
|
+
for env_var in server_dict['env']:
|
|
178
|
+
if isinstance(env_var, dict):
|
|
179
|
+
resolved_env.append({
|
|
180
|
+
'name': env_var['name'],
|
|
181
|
+
'value': resolve_environment_variables(env_var['value'])
|
|
182
|
+
})
|
|
183
|
+
else:
|
|
184
|
+
# Handle MCPEnvironmentVariable objects
|
|
185
|
+
resolved_env.append(MCPEnvironmentVariable(
|
|
186
|
+
name=env_var.name,
|
|
187
|
+
value=resolve_environment_variables(env_var.value)
|
|
188
|
+
))
|
|
189
|
+
server_dict['env'] = resolved_env
|
|
190
|
+
|
|
191
|
+
# Resolve command arguments if present
|
|
192
|
+
if server_dict.get('command'):
|
|
193
|
+
resolved_command = []
|
|
194
|
+
for cmd_part in server_dict['command']:
|
|
195
|
+
resolved_command.append(resolve_environment_variables(cmd_part))
|
|
196
|
+
server_dict['command'] = resolved_command
|
|
197
|
+
|
|
198
|
+
if server_dict.get('args'):
|
|
199
|
+
resolved_args = []
|
|
200
|
+
for arg in server_dict['args']:
|
|
201
|
+
resolved_args.append(resolve_environment_variables(arg))
|
|
202
|
+
server_dict['args'] = resolved_args
|
|
203
|
+
|
|
204
|
+
# Recreate the server config with resolved values
|
|
205
|
+
return MCPServerConfig(**server_dict)
|
|
206
|
+
|
|
207
|
+
for server_name, server_config in config.servers.items():
|
|
208
|
+
# Fault-isolate per server: a missing required ${VAR} for ONE server drops
|
|
209
|
+
# only that server (logged loudly), instead of aborting resolution for the
|
|
210
|
+
# whole config and silently disabling ALL MCP (the prior behavior — the
|
|
211
|
+
# caller swallowed the raise and fell back to an empty default config).
|
|
212
|
+
try:
|
|
213
|
+
resolved_servers[server_name] = _resolve_one(server_config)
|
|
214
|
+
except ConfigurationError as e:
|
|
215
|
+
logger.error(
|
|
216
|
+
"MCP server '%s' disabled: %s. Other MCP servers are unaffected.",
|
|
217
|
+
server_name, e,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# Create new config with resolved servers
|
|
221
|
+
config_dict = config.model_dump()
|
|
222
|
+
config_dict['servers'] = resolved_servers
|
|
223
|
+
|
|
224
|
+
return MCPConfig(**config_dict)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
# Default MCP server configurations - completely empty, all servers added dynamically
|
|
228
|
+
DEFAULT_MCP_SERVERS = {}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def get_default_mcp_config() -> MCPConfig:
|
|
232
|
+
"""Get default MCP configuration with all servers disabled for security."""
|
|
233
|
+
return MCPConfig(
|
|
234
|
+
enabled=False, # Disabled by default
|
|
235
|
+
servers=DEFAULT_MCP_SERVERS,
|
|
236
|
+
global_timeout=60,
|
|
237
|
+
max_concurrent_connections=5, # Conservative default
|
|
238
|
+
enable_resource_caching=True,
|
|
239
|
+
cache_ttl_seconds=300,
|
|
240
|
+
auto_discover_tools=True,
|
|
241
|
+
log_mcp_communications=False
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def add_mcp_server(config: MCPConfig, name: str, server_config: Union[MCPServerConfig, Dict[str, Any]]) -> MCPConfig:
|
|
246
|
+
"""Add a new MCP server to the configuration dynamically.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
config: Existing MCP configuration
|
|
250
|
+
name: Name for the new server
|
|
251
|
+
server_config: Server configuration (MCPServerConfig or dict)
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
Updated MCPConfig
|
|
255
|
+
"""
|
|
256
|
+
if isinstance(server_config, dict):
|
|
257
|
+
server_config = MCPServerConfig(**server_config)
|
|
258
|
+
|
|
259
|
+
config.servers[name] = server_config
|
|
260
|
+
return config
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def create_stdio_server(command: List[str], env_vars: Optional[Dict[str, str]] = None, **kwargs) -> MCPServerConfig:
|
|
264
|
+
"""Helper to create a STDIO MCP server configuration.
|
|
265
|
+
|
|
266
|
+
Args:
|
|
267
|
+
command: Command to start the server
|
|
268
|
+
env_vars: Environment variables as key-value pairs
|
|
269
|
+
**kwargs: Additional configuration options
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
MCPServerConfig for STDIO server
|
|
273
|
+
"""
|
|
274
|
+
env = []
|
|
275
|
+
if env_vars:
|
|
276
|
+
for name, value in env_vars.items():
|
|
277
|
+
env.append(MCPEnvironmentVariable(name=name, value=value))
|
|
278
|
+
|
|
279
|
+
return MCPServerConfig(
|
|
280
|
+
type=MCPServerType.STDIO,
|
|
281
|
+
command=command,
|
|
282
|
+
env=env,
|
|
283
|
+
enabled=kwargs.get('enabled', False),
|
|
284
|
+
timeout=kwargs.get('timeout', 30),
|
|
285
|
+
retry_attempts=kwargs.get('retry_attempts', 3),
|
|
286
|
+
retry_delay=kwargs.get('retry_delay', 5),
|
|
287
|
+
auto_reconnect=kwargs.get('auto_reconnect', True),
|
|
288
|
+
max_concurrent_requests=kwargs.get('max_concurrent_requests', 10)
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def create_sse_server(url: str, headers: Optional[Dict[str, str]] = None, **kwargs) -> MCPServerConfig:
|
|
293
|
+
"""Helper to create an SSE MCP server configuration.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
url: Server URL
|
|
297
|
+
headers: HTTP headers
|
|
298
|
+
**kwargs: Additional configuration options
|
|
299
|
+
|
|
300
|
+
Returns:
|
|
301
|
+
MCPServerConfig for SSE server
|
|
302
|
+
"""
|
|
303
|
+
return MCPServerConfig(
|
|
304
|
+
type=MCPServerType.SSE,
|
|
305
|
+
url=url,
|
|
306
|
+
headers=headers or {},
|
|
307
|
+
enabled=kwargs.get('enabled', False),
|
|
308
|
+
timeout=kwargs.get('timeout', 30),
|
|
309
|
+
retry_attempts=kwargs.get('retry_attempts', 3),
|
|
310
|
+
retry_delay=kwargs.get('retry_delay', 5),
|
|
311
|
+
auto_reconnect=kwargs.get('auto_reconnect', True),
|
|
312
|
+
max_concurrent_requests=kwargs.get('max_concurrent_requests', 10)
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def load_local_mcp_servers() -> Dict[str, Any]:
|
|
317
|
+
"""Load MCP server configs from ~/.polyrob/mcp.json then ./.polyrob/mcp.json (R7).
|
|
318
|
+
|
|
319
|
+
Project (./.polyrob) overrides global (~/.polyrob) on name clash. Each file may
|
|
320
|
+
use a top-level "servers" or "mcpServers" object. Missing/invalid files are
|
|
321
|
+
skipped. File-first: no DB, no dependency on config/mcp_config.json.
|
|
322
|
+
"""
|
|
323
|
+
import json
|
|
324
|
+
from pathlib import Path
|
|
325
|
+
from core.paths import polyrob_home
|
|
326
|
+
merged: Dict[str, Any] = {}
|
|
327
|
+
for path in (polyrob_home() / "mcp.json", Path.cwd() / ".polyrob" / "mcp.json"):
|
|
328
|
+
if not path.exists():
|
|
329
|
+
continue
|
|
330
|
+
try:
|
|
331
|
+
data = json.loads(path.read_text())
|
|
332
|
+
except (json.JSONDecodeError, OSError, ValueError):
|
|
333
|
+
continue
|
|
334
|
+
servers = data.get("servers") or data.get("mcpServers") or {}
|
|
335
|
+
if isinstance(servers, dict):
|
|
336
|
+
merged.update(servers) # later (project) wins
|
|
337
|
+
return merged
|