polyrob 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agents/README.md +453 -0
- agents/__init__.py +164 -0
- agents/base_agent.py +743 -0
- agents/personality/character.py +119 -0
- agents/personality/character_manager.py +309 -0
- agents/personality/characters/rob.character.json +56 -0
- agents/personality/characters/trump.character.json +63 -0
- agents/personality/persona_render.py +78 -0
- agents/personality/persona_resolver.py +115 -0
- agents/prompt/__init__.py +58 -0
- agents/prompt/base_prompt.py +92 -0
- agents/prompt/system.py +417 -0
- agents/task/README_PATH_MANAGEMENT.md +141 -0
- agents/task/__init__.py +162 -0
- agents/task/agent/__init__.py +70 -0
- agents/task/agent/agent_state.py +408 -0
- agents/task/agent/async_delegation.py +274 -0
- agents/task/agent/autonomy_state.py +275 -0
- agents/task/agent/conversation.py +75 -0
- agents/task/agent/core/__init__.py +6 -0
- agents/task/agent/core/aux_metering.py +61 -0
- agents/task/agent/core/background_review.py +157 -0
- agents/task/agent/core/construction.py +1179 -0
- agents/task/agent/core/conversational_exit.py +49 -0
- agents/task/agent/core/correspondent_gate.py +227 -0
- agents/task/agent/core/curator.py +246 -0
- agents/task/agent/core/episodic_digest.py +103 -0
- agents/task/agent/core/error_recovery.py +480 -0
- agents/task/agent/core/history_io.py +257 -0
- agents/task/agent/core/llm_provisioning.py +287 -0
- agents/task/agent/core/llm_runner.py +547 -0
- agents/task/agent/core/logging_io.py +276 -0
- agents/task/agent/core/loop_detection.py +262 -0
- agents/task/agent/core/memory_prefetch.py +325 -0
- agents/task/agent/core/memory_writer.py +667 -0
- agents/task/agent/core/model_introspection.py +82 -0
- agents/task/agent/core/model_swap.py +177 -0
- agents/task/agent/core/next_action_internal.py +1331 -0
- agents/task/agent/core/output_validation.py +303 -0
- agents/task/agent/core/project_context.py +272 -0
- agents/task/agent/core/resources.py +93 -0
- agents/task/agent/core/result_processing.py +389 -0
- agents/task/agent/core/run_loop.py +661 -0
- agents/task/agent/core/safety_lifecycle.py +228 -0
- agents/task/agent/core/secret_guard.py +293 -0
- agents/task/agent/core/self_wake.py +280 -0
- agents/task/agent/core/session_metadata.py +104 -0
- agents/task/agent/core/step.py +781 -0
- agents/task/agent/core/step_execution.py +398 -0
- agents/task/agent/core/step_telemetry.py +222 -0
- agents/task/agent/core/test_aux_metering.py +50 -0
- agents/task/agent/core/test_billing_failover.py +68 -0
- agents/task/agent/core/test_fatal_error_classifier.py +38 -0
- agents/task/agent/core/test_judge_validation.py +275 -0
- agents/task/agent/core/test_model_swap.py +190 -0
- agents/task/agent/core/test_reflection_offload.py +54 -0
- agents/task/agent/core/turn_input.py +8 -0
- agents/task/agent/core/untrusted_wrap.py +103 -0
- agents/task/agent/core/user_ingress.py +228 -0
- agents/task/agent/hitl_manager.py +396 -0
- agents/task/agent/log_sanitize.py +36 -0
- agents/task/agent/message_manager/config.py +97 -0
- agents/task/agent/message_manager/service.py +758 -0
- agents/task/agent/message_manager/tests.py +305 -0
- agents/task/agent/message_manager/tool_call_builder.py +539 -0
- agents/task/agent/message_manager/tool_message_repair.py +364 -0
- agents/task/agent/message_manager/views.py +143 -0
- agents/task/agent/messages/__init__.py +8 -0
- agents/task/agent/messages/builders.py +309 -0
- agents/task/agent/messages/compactor.py +611 -0
- agents/task/agent/messages/context_references.py +271 -0
- agents/task/agent/messages/filters.py +333 -0
- agents/task/agent/messages/guidance.py +328 -0
- agents/task/agent/messages/persistence.py +448 -0
- agents/task/agent/messages/retrieval.py +506 -0
- agents/task/agent/messages/sqlite_persistence.py +85 -0
- agents/task/agent/messages/test_compaction_upgrade.py +349 -0
- agents/task/agent/messages/test_persistence_subdir_fix.py +28 -0
- agents/task/agent/messages/test_sqlite_persistence.py +54 -0
- agents/task/agent/messages/token_counter.py +532 -0
- agents/task/agent/orchestrator.py +776 -0
- agents/task/agent/profile_manager.py +105 -0
- agents/task/agent/profile_registry.py +173 -0
- agents/task/agent/prompts.py +1090 -0
- agents/task/agent/scenario_registry.py +226 -0
- agents/task/agent/service.py +509 -0
- agents/task/agent/session.py +984 -0
- agents/task/agent/skill_discovery.py +110 -0
- agents/task/agent/skill_frontmatter.py +94 -0
- agents/task/agent/skill_manager.py +1201 -0
- agents/task/agent/skill_store.py +627 -0
- agents/task/agent/skill_validation.py +56 -0
- agents/task/agent/skill_writer.py +492 -0
- agents/task/agent/sub_agent_manager.py +1137 -0
- agents/task/agent/test_session_disk_recovery.py +34 -0
- agents/task/agent/tests.py +513 -0
- agents/task/agent/tool_call_tracker.py +511 -0
- agents/task/agent/views.py +469 -0
- agents/task/config.py +432 -0
- agents/task/constants.py +1384 -0
- agents/task/flag_defaults.py +63 -0
- agents/task/goals/__init__.py +1 -0
- agents/task/goals/autonomy_marker.py +28 -0
- agents/task/goals/board.py +690 -0
- agents/task/goals/completion_judge.py +247 -0
- agents/task/goals/context.py +62 -0
- agents/task/goals/dispatcher.py +848 -0
- agents/task/goals/escalation.py +102 -0
- agents/task/goals/planner.py +114 -0
- agents/task/logging_config.py +155 -0
- agents/task/path.py +991 -0
- agents/task/robust_parse_config.py +400 -0
- agents/task/runtime/__init__.py +0 -0
- agents/task/runtime/run_as_session.py +130 -0
- agents/task/runtime_safety.py +308 -0
- agents/task/session/__init__.py +5 -0
- agents/task/session/browser_pool.py +130 -0
- agents/task/session/cleanup.py +612 -0
- agents/task/session/execution.py +397 -0
- agents/task/session/feed.py +200 -0
- agents/task/session/hitl_ingress.py +201 -0
- agents/task/session/hooks.py +83 -0
- agents/task/session/multi_agent.py +243 -0
- agents/task/session/workspace.py +91 -0
- agents/task/session_registry.py +91 -0
- agents/task/session_route.py +35 -0
- agents/task/sqlite_session_registry.py +261 -0
- agents/task/surface_config.py +185 -0
- agents/task/telemetry/__init__.py +58 -0
- agents/task/telemetry/event_log.py +180 -0
- agents/task/telemetry/formatters.py +642 -0
- agents/task/telemetry/manager.py +571 -0
- agents/task/telemetry/memory_events.py +66 -0
- agents/task/telemetry/self_events.py +53 -0
- agents/task/telemetry/sequence.py +160 -0
- agents/task/telemetry/service.py +1265 -0
- agents/task/telemetry/views.py +882 -0
- agents/task/templates.py +98 -0
- agents/task/test_aux_chain.py +151 -0
- agents/task/test_aux_router.py +41 -0
- agents/task/tests/test_parse_robustness.py +170 -0
- agents/task/tool_defaults.py +110 -0
- agents/task/utils.py +762 -0
- agents/task/utils_json.py +768 -0
- agents/task/utils_webview.py +86 -0
- agents/task/workspace_context.py +229 -0
- agents/task_agent_lite.py +2398 -0
- api/README.md +683 -0
- api/TASK_API_DOCS.md +151 -0
- api/__init__.py +0 -0
- api/a2a/__init__.py +37 -0
- api/a2a/agent_card.py +337 -0
- api/a2a/client.py +657 -0
- api/a2a/endpoints.py +375 -0
- api/a2a/models.py +268 -0
- api/a2a/streaming.py +419 -0
- api/a2a/task_handler.py +929 -0
- api/admin_endpoints.py +1584 -0
- api/app.py +923 -0
- api/auth_constants.py +28 -0
- api/auth_endpoints.py +402 -0
- api/auth_state.py +36 -0
- api/chat_via_task.py +42 -0
- api/conversation_manager.py +231 -0
- api/dependencies.py +186 -0
- api/eip8004_endpoints.py +452 -0
- api/hyperliquid_models.py +174 -0
- api/hyperliquid_routes.py +450 -0
- api/interfaces.py +207 -0
- api/jwt_middleware.py +83 -0
- api/kb/__init__.py +1 -0
- api/kb/endpoints.py +314 -0
- api/mcp_models.py +279 -0
- api/mcp_routes.py +438 -0
- api/middleware.py +526 -0
- api/models.py +176 -0
- api/openai_compat/__init__.py +0 -0
- api/openai_compat/model_map.py +25 -0
- api/openai_compat/models.py +59 -0
- api/openai_compat/router.py +140 -0
- api/payment_endpoints.py +444 -0
- api/payment_verification.py +138 -0
- api/polymarket_models.py +155 -0
- api/polymarket_routes.py +501 -0
- api/pricing_endpoints.py +89 -0
- api/session_routing.py +54 -0
- api/skill_endpoints.py +453 -0
- api/task_http_api.py +1856 -0
- api/webhooks.py +52 -0
- api/x402_endpoints.py +280 -0
- avatar/README.md +44 -0
- avatar/__init__.py +1 -0
- avatar/config/rob.json +7 -0
- avatar/mindprint.js +395 -0
- avatar/renders/rob.meta.json +20 -0
- avatar/renders/rob.png +0 -0
- avatar/studio.html +373 -0
- avatar/webview/avatar-live.js +44 -0
- cli/README.md +89 -0
- cli/__init__.py +0 -0
- cli/cli_surface.py +67 -0
- cli/commands/__init__.py +0 -0
- cli/commands/_bootstrap.py +49 -0
- cli/commands/_errors.py +53 -0
- cli/commands/chat.py +973 -0
- cli/commands/config.py +100 -0
- cli/commands/dashboard.py +103 -0
- cli/commands/doctor.py +222 -0
- cli/commands/email.py +174 -0
- cli/commands/gateway.py +346 -0
- cli/commands/goals.py +509 -0
- cli/commands/init.py +276 -0
- cli/commands/journey.py +30 -0
- cli/commands/kb.py +280 -0
- cli/commands/model.py +107 -0
- cli/commands/owner.py +431 -0
- cli/commands/pfp.py +232 -0
- cli/commands/run.py +414 -0
- cli/commands/serve.py +41 -0
- cli/commands/session.py +684 -0
- cli/commands/skill_install.py +786 -0
- cli/commands/skills.py +128 -0
- cli/commands/subagents.py +100 -0
- cli/commands/surface.py +81 -0
- cli/commands/telegram.py +185 -0
- cli/commands/todos.py +209 -0
- cli/commands/tools.py +102 -0
- cli/commands/update.py +316 -0
- cli/commands/whatsapp.py +175 -0
- cli/config_store.py +276 -0
- cli/gitignore.py +43 -0
- cli/inventory.py +46 -0
- cli/keys.py +101 -0
- cli/persona.py +17 -0
- cli/polyrob.py +137 -0
- cli/ui/__init__.py +64 -0
- cli/ui/activity.py +141 -0
- cli/ui/app.py +538 -0
- cli/ui/banner.py +233 -0
- cli/ui/blocks.py +534 -0
- cli/ui/bootstrap_notice.py +47 -0
- cli/ui/commands/__init__.py +41 -0
- cli/ui/commands/h_cron.py +64 -0
- cli/ui/commands/h_journey.py +164 -0
- cli/ui/commands/h_kb.py +121 -0
- cli/ui/commands/h_learn.py +100 -0
- cli/ui/commands/h_mcp.py +215 -0
- cli/ui/commands/h_self.py +113 -0
- cli/ui/commands/h_skills.py +314 -0
- cli/ui/commands/handlers.py +1672 -0
- cli/ui/commands/registry.py +426 -0
- cli/ui/dialog.py +425 -0
- cli/ui/event_registry.py +110 -0
- cli/ui/event_specs.py +45 -0
- cli/ui/events.py +433 -0
- cli/ui/identity.py +15 -0
- cli/ui/lifecycle.py +159 -0
- cli/ui/live_hooks.py +43 -0
- cli/ui/model_selector.py +532 -0
- cli/ui/persistent_loop.py +181 -0
- cli/ui/pick.py +113 -0
- cli/ui/plain_renderer.py +351 -0
- cli/ui/renderer.py +384 -0
- cli/ui/rich_renderer.py +533 -0
- cli/ui/secrets.py +115 -0
- cli/ui/state.py +376 -0
- cli/ui/statusbar.py +231 -0
- cli/ui/streaming.py +254 -0
- cli/ui/terminal_render.py +105 -0
- cli/ui/theme.py +132 -0
- cli/update/__init__.py +6 -0
- cli/update/context.py +121 -0
- cli/update/detect.py +176 -0
- cli/update/engine.py +95 -0
- cli/update/migrate_guarded.py +55 -0
- cli/update/process_guard.py +215 -0
- cli/update/runners.py +78 -0
- cli/update/snapshot.py +270 -0
- cli/update/versions.py +205 -0
- core/README.md +377 -0
- core/__init__.py +174 -0
- core/assets.py +87 -0
- core/async_bridge.py +76 -0
- core/autonomy_runtime.py +259 -0
- core/base_component.py +302 -0
- core/bootstrap.py +681 -0
- core/bot.py +310 -0
- core/config.py +833 -0
- core/constants.py +126 -0
- core/container.py +462 -0
- core/db_manifest.py +101 -0
- core/embedding.py +57 -0
- core/env.py +39 -0
- core/exceptions.py +287 -0
- core/flags.py +144 -0
- core/flags_catalog.py +345 -0
- core/home_migration.py +62 -0
- core/identity.py +118 -0
- core/initialization.py +1004 -0
- core/instance.py +537 -0
- core/interactive_gate.py +96 -0
- core/logging.py +436 -0
- core/owner_doc_writer.py +176 -0
- core/pairing.py +193 -0
- core/path_safety.py +20 -0
- core/paths.py +27 -0
- core/payment_config.py +21 -0
- core/permissions.py +322 -0
- core/runtime_config.py +96 -0
- core/runtime_paths.py +135 -0
- core/seams.py +35 -0
- core/secret_scan.py +25 -0
- core/secret_scrub.py +71 -0
- core/secrets.py +35 -0
- core/security_logging_filter.py +148 -0
- core/self_context_writer.py +333 -0
- core/self_evolution.py +294 -0
- core/session_context.py +47 -0
- core/sqlite_util.py +59 -0
- core/surfaces/__init__.py +16 -0
- core/surfaces/access.py +118 -0
- core/surfaces/binding.py +88 -0
- core/surfaces/bootstrap.py +78 -0
- core/surfaces/circuit.py +168 -0
- core/surfaces/continuity.py +77 -0
- core/surfaces/correspondents.py +228 -0
- core/surfaces/dispatcher.py +216 -0
- core/surfaces/envelopes.py +75 -0
- core/surfaces/gc.py +30 -0
- core/surfaces/idempotency.py +57 -0
- core/surfaces/inbound_webhook.py +124 -0
- core/surfaces/media.py +32 -0
- core/surfaces/message_router.py +91 -0
- core/surfaces/outbound_allowlist.py +80 -0
- core/surfaces/outbound_dispatcher.py +110 -0
- core/surfaces/outbound_mirror.py +37 -0
- core/surfaces/outbound_queue.py +107 -0
- core/surfaces/outbound_target.py +12 -0
- core/surfaces/owner_admin.py +29 -0
- core/surfaces/proactive.py +78 -0
- core/surfaces/progress.py +108 -0
- core/surfaces/rate_bucket.py +21 -0
- core/surfaces/registry.py +51 -0
- core/surfaces/rendering.py +53 -0
- core/surfaces/send_policy.py +14 -0
- core/surfaces/serialize.py +24 -0
- core/surfaces/session_chat_registry.py +112 -0
- core/surfaces/session_policy.py +60 -0
- core/surfaces/surface.py +288 -0
- core/surfaces/transcription.py +88 -0
- core/surfaces/voice_echo.py +26 -0
- core/surfaces/voice_guard.py +23 -0
- core/tickers.py +174 -0
- core/tool_catalog.py +192 -0
- core/version.py +75 -0
- core/wallet/__init__.py +5 -0
- core/wallet/agent_wallet.py +59 -0
- core/wallet/audit_sink.py +61 -0
- core/wallet/config.py +70 -0
- core/wallet/factory.py +87 -0
- core/wallet/policy.py +104 -0
- core/wallet/signer.py +51 -0
- cron/README.md +65 -0
- cron/__init__.py +0 -0
- cron/delivery.py +277 -0
- cron/digest.py +124 -0
- cron/jobs.py +207 -0
- cron/runner.py +297 -0
- cron/schedule.py +194 -0
- cron/scheduler.py +201 -0
- cron/service.py +57 -0
- cron/wake_gate.py +223 -0
- data/__init__.py +1 -0
- data/prompts/autov2_prompts.json +87 -0
- data/prompts/skills/browser-automation/SKILL.md +43 -0
- data/prompts/skills/coding-workflow/SKILL.md +36 -0
- data/prompts/skills/crypto-trading-safety/SKILL.md +53 -0
- data/prompts/skills/document-writing/SKILL.md +33 -0
- data/prompts/skills/email-comms/SKILL.md +33 -0
- data/prompts/skills/file-data-ops/SKILL.md +35 -0
- data/prompts/skills/hyperliquid-account-review/SKILL.md +48 -0
- data/prompts/skills/hyperliquid-market-data/SKILL.md +52 -0
- data/prompts/skills/hyperliquid-trading/SKILL.md +59 -0
- data/prompts/skills/lead-research/SKILL.md +86 -0
- data/prompts/skills/market-research-brief/SKILL.md +104 -0
- data/prompts/skills/person-analyzer/SKILL.md +124 -0
- data/prompts/skills/polymarket-market-research/SKILL.md +54 -0
- data/prompts/skills/polymarket-portfolio-review/SKILL.md +50 -0
- data/prompts/skills/polymarket-trading/SKILL.md +55 -0
- data/prompts/skills/presentation-creator/SKILL.md +36 -0
- data/prompts/skills/project-analyzer/SKILL.md +169 -0
- data/prompts/skills/rules.json +268 -0
- data/prompts/skills/secret-handling/SKILL.md +20 -0
- data/prompts/skills/skill-authoring/SKILL.md +31 -0
- data/prompts/skills/skill-security-review/SKILL.md +27 -0
- data/prompts/skills/social-discovery/SKILL.md +57 -0
- data/prompts/skills/task-planning/SKILL.md +33 -0
- data/prompts/skills/web-research/SKILL.md +39 -0
- data/prompts/skills/web-scraping/SKILL.md +73 -0
- data/prompts/skills/x-engagement/SKILL.md +69 -0
- data/prompts/system_prompts.json +4 -0
- data/subscription_channels.json +5 -0
- modules/README.md +503 -0
- modules/__init__.py +124 -0
- modules/auth/__init__.py +13 -0
- modules/auth/api_key_manager.py +157 -0
- modules/auth/identity_mapper.py +380 -0
- modules/auth/siwe_auth.py +273 -0
- modules/auth/tier_manager.py +173 -0
- modules/base_module.py +190 -0
- modules/credits/__init__.py +29 -0
- modules/credits/balance_manager.py +237 -0
- modules/credits/cost_utils.py +129 -0
- modules/credits/pricing.py +139 -0
- modules/credits/unified_ledger.py +148 -0
- modules/credits/usage_meter.py +310 -0
- modules/credits/usage_tracker.py +674 -0
- modules/database/__init__.py +33 -0
- modules/database/audit_log.py +322 -0
- modules/database/auth_tables.py +276 -0
- modules/database/connection.py +644 -0
- modules/database/connection_pool.py +305 -0
- modules/database/conversation_contexts.py +446 -0
- modules/database/database_manager.py +237 -0
- modules/database/hyperliquid.py +375 -0
- modules/database/polymarket.py +574 -0
- modules/database/user_mcp_servers.py +728 -0
- modules/database/user_profiles.py +562 -0
- modules/database/utils.py +107 -0
- modules/database/x402_tables.py +92 -0
- modules/eip8004/README.md +1069 -0
- modules/eip8004/__init__.py +65 -0
- modules/eip8004/contracts.py +498 -0
- modules/eip8004/models.py +271 -0
- modules/eip8004/registration.py +148 -0
- modules/eip8004/reputation.py +367 -0
- modules/eip8004/validation.py +277 -0
- modules/llm/__init__.py +97 -0
- modules/llm/adapters.py +963 -0
- modules/llm/anthropic_client.py +831 -0
- modules/llm/available_models.py +106 -0
- modules/llm/brain_scrubber.py +137 -0
- modules/llm/cache_hints.py +162 -0
- modules/llm/deepseek_client.py +562 -0
- modules/llm/gemini_client.py +1367 -0
- modules/llm/llm_client.py +1139 -0
- modules/llm/llm_client_registry.py +188 -0
- modules/llm/llm_factory.py +237 -0
- modules/llm/llm_manager.py +1036 -0
- modules/llm/messages.py +374 -0
- modules/llm/model_registry.py +1935 -0
- modules/llm/nvidia_client.py +125 -0
- modules/llm/openai_client.py +800 -0
- modules/llm/openrouter_client.py +969 -0
- modules/llm/profiles.py +178 -0
- modules/llm/test_anthropic_cache_capture.py +35 -0
- modules/llm/test_cached_pricing_derivation.py +24 -0
- modules/llm/think_scrubber.py +444 -0
- modules/llm/token_counter.py +268 -0
- modules/memory/__init__.py +35 -0
- modules/memory/backend_factory.py +83 -0
- modules/memory/cache_manager.py +186 -0
- modules/memory/episodic.py +108 -0
- modules/memory/local_vector_memory_provider.py +552 -0
- modules/memory/memory_manager.py +225 -0
- modules/memory/models.py +312 -0
- modules/memory/provider.py +210 -0
- modules/memory/registry.py +205 -0
- modules/memory/sqlite_memory_provider.py +767 -0
- modules/memory/task/__init__.py +52 -0
- modules/memory/task/compaction_manager.py +157 -0
- modules/memory/task/context_retriever.py +809 -0
- modules/memory/task/hierarchical_memory.py +1002 -0
- modules/memory/task/lexical_retriever.py +71 -0
- modules/memory/task/null_context_manager.py +213 -0
- modules/memory/task/phase_manager.py +625 -0
- modules/memory/task/reflection_service.py +157 -0
- modules/memory/task/semantic_retriever.py +218 -0
- modules/memory/task/task_context_manager.py +1165 -0
- modules/memory/task/test_forgetting_engages.py +24 -0
- modules/memory/task/test_reflection_llm.py +39 -0
- modules/memory/task/test_threat_scan.py +53 -0
- modules/memory/task/threat_scan.py +90 -0
- modules/memory/test_sqlite_memory_provider.py +106 -0
- modules/memory/user_profile_manager.py +527 -0
- modules/payments/__init__.py +11 -0
- modules/payments/deposit_monitor.py +478 -0
- modules/payments/price_oracle.py +70 -0
- modules/payments/treasury_sweeper.py +401 -0
- modules/payments/wallet_generator.py +145 -0
- modules/pfp/__init__.py +1 -0
- modules/pfp/config.py +92 -0
- modules/pfp/mesh.py +565 -0
- modules/pfp/push.py +69 -0
- modules/pfp/renderer.py +85 -0
- modules/pfp/store.py +82 -0
- modules/skills/__init__.py +1 -0
- modules/skills/skill_usage.py +248 -0
- modules/transcription/__init__.py +24 -0
- modules/transcription/base.py +20 -0
- modules/transcription/faster_whisper_transcriber.py +55 -0
- modules/x402/README.md +249 -0
- modules/x402/__init__.py +22 -0
- modules/x402/invoicing.py +416 -0
- modules/x402/middleware.py +364 -0
- modules/x402/settlement_watcher.py +145 -0
- modules/x402/x402_integration.py +344 -0
- polyrob-0.5.0.dist-info/METADATA +482 -0
- polyrob-0.5.0.dist-info/RECORD +745 -0
- polyrob-0.5.0.dist-info/WHEEL +5 -0
- polyrob-0.5.0.dist-info/entry_points.txt +2 -0
- polyrob-0.5.0.dist-info/licenses/LICENSE +21 -0
- polyrob-0.5.0.dist-info/top_level.txt +12 -0
- surfaces/README.md +70 -0
- surfaces/__init__.py +0 -0
- surfaces/email/__init__.py +0 -0
- surfaces/email/dedup.py +44 -0
- surfaces/email/harness.py +187 -0
- surfaces/email/inbound.py +159 -0
- surfaces/email/seed.py +60 -0
- surfaces/email/surface.py +105 -0
- surfaces/telegram/__init__.py +0 -0
- surfaces/telegram/dedup.py +83 -0
- surfaces/telegram/harness.py +886 -0
- surfaces/telegram/inbound.py +145 -0
- surfaces/telegram/interactive_tools.py +49 -0
- surfaces/telegram/markdown.py +347 -0
- surfaces/telegram/rate_limit.py +167 -0
- surfaces/telegram/surface.py +187 -0
- surfaces/telegram/voice.py +52 -0
- surfaces/whatsapp/__init__.py +0 -0
- surfaces/whatsapp/client.py +51 -0
- surfaces/whatsapp/harness.py +62 -0
- surfaces/whatsapp/inbound.py +132 -0
- surfaces/whatsapp/surface.py +64 -0
- surfaces/whatsapp/window.py +34 -0
- tools/README.md +578 -0
- tools/__init__.py +424 -0
- tools/alchemy/__init__.py +5 -0
- tools/alchemy/alchemy_tool.py +389 -0
- tools/anysite/__init__.py +17 -0
- tools/anysite/client.py +88 -0
- tools/anysite/tool.py +89 -0
- tools/base_tool.py +468 -0
- tools/browser/__init__.py +22 -0
- tools/browser/actions.py +118 -0
- tools/browser/browser.py +1457 -0
- tools/browser/browser_manager.py +690 -0
- tools/browser/context.py +1748 -0
- tools/browser/playwright_utils.py +137 -0
- tools/browser/views.py +56 -0
- tools/code_exec/SANDBOX_SECURITY.md +144 -0
- tools/code_exec/__init__.py +178 -0
- tools/code_exec/backend.py +73 -0
- tools/code_exec/backends/__init__.py +1 -0
- tools/code_exec/backends/docker.py +779 -0
- tools/code_exec/backends/local_subprocess.py +154 -0
- tools/code_exec/env_policy.py +45 -0
- tools/code_exec/result.py +42 -0
- tools/code_exec/sandbox_guard.py +59 -0
- tools/code_exec/tool.py +227 -0
- tools/coding/__init__.py +50 -0
- tools/coding/edit.py +107 -0
- tools/coding/search.py +113 -0
- tools/coding/tool.py +353 -0
- tools/collabland/__init__.py +5 -0
- tools/collabland/collabland_tool.py +471 -0
- tools/controller/__init__.py +0 -0
- tools/controller/_helpers.py +165 -0
- tools/controller/action_registration.py +1765 -0
- tools/controller/approval.py +244 -0
- tools/controller/approval_interactive.py +90 -0
- tools/controller/delegation.py +195 -0
- tools/controller/execution.py +797 -0
- tools/controller/execution_context.py +141 -0
- tools/controller/hooks.py +135 -0
- tools/controller/introspection.py +344 -0
- tools/controller/mcp_registrar.py +190 -0
- tools/controller/message_send.py +31 -0
- tools/controller/registry/__init__.py +4 -0
- tools/controller/registry/schema_generators.py +395 -0
- tools/controller/registry/schema_sanitizer.py +406 -0
- tools/controller/registry/service.py +1266 -0
- tools/controller/registry/views.py +151 -0
- tools/controller/service.py +409 -0
- tools/controller/tool_management.py +334 -0
- tools/controller/types.py +28 -0
- tools/controller/views.py +450 -0
- tools/cronjob_tools.py +166 -0
- tools/crypto_trade_gate.py +59 -0
- tools/descriptors.py +452 -0
- tools/dom/__init__.py +0 -0
- tools/dom/history_tree_processor/service.py +244 -0
- tools/dom/history_tree_processor/view.py +99 -0
- tools/dom/service.py +471 -0
- tools/dom/views.py +346 -0
- tools/email_tool.py +403 -0
- tools/exceptions.py +169 -0
- tools/filesystem.py +1038 -0
- tools/filesystem_docproc.py +331 -0
- tools/filesystem_pdf.py +755 -0
- tools/git/__init__.py +42 -0
- tools/git/tool.py +258 -0
- tools/github/__init__.py +33 -0
- tools/github/client.py +94 -0
- tools/github/tool.py +237 -0
- tools/goal_tools.py +309 -0
- tools/hyperliquid/__init__.py +56 -0
- tools/hyperliquid/models.py +233 -0
- tools/hyperliquid/service.py +1680 -0
- tools/knowledge_ingest.py +950 -0
- tools/mcp/README.md +535 -0
- tools/mcp/__init__.py +52 -0
- tools/mcp/catalog.py +115 -0
- tools/mcp/config.py +337 -0
- tools/mcp/mcp_tool.py +1415 -0
- tools/mcp/param_coercion.py +289 -0
- tools/mcp/protocol.py +1520 -0
- tools/mcp/rate_limit.py +50 -0
- tools/mcp/security.py +424 -0
- tools/mcp/self_install.py +111 -0
- tools/mcp/server_manager.py +829 -0
- tools/mcp/subscriptions.py +72 -0
- tools/mcp/user_mcp_service.py +899 -0
- tools/mcp/validation_tracker.py +89 -0
- tools/mcp/views.py +346 -0
- tools/oauth/__init__.py +17 -0
- tools/oauth/manager.py +75 -0
- tools/oauth/provider.py +69 -0
- tools/oauth/providers/__init__.py +1 -0
- tools/oauth/providers/generic_oauth2.py +96 -0
- tools/perplexity_tool.py +280 -0
- tools/polymarket/__init__.py +41 -0
- tools/polymarket/clob_adapter.py +76 -0
- tools/polymarket/models.py +182 -0
- tools/polymarket/service.py +2082 -0
- tools/self_env/__init__.py +61 -0
- tools/self_env/tool.py +274 -0
- tools/shell/__init__.py +80 -0
- tools/shell/backend_pool.py +118 -0
- tools/shell/discipline.py +62 -0
- tools/shell/executor.py +157 -0
- tools/shell/loopback_allow.py +87 -0
- tools/shell/process_registry.py +113 -0
- tools/shell/process_tool.py +131 -0
- tools/shell/state.py +129 -0
- tools/shell/tool.py +151 -0
- tools/task_tool.py +637 -0
- tools/twitter_tool.py +2086 -0
- tools/user_directory.py +179 -0
- tools/web_fetch/__init__.py +3 -0
- tools/web_fetch/fetcher.py +144 -0
- tools/web_fetch/render.py +44 -0
- tools/web_fetch/tool.py +60 -0
- tools/x402/__init__.py +60 -0
- tools/x402/client.py +47 -0
- tools/x402/invoice_tool.py +143 -0
- tools/x402/real_client.py +250 -0
- tools/x402/service.py +131 -0
- utils/README.md +498 -0
- utils/__init__.py +46 -0
- utils/auth_utils.py +114 -0
- utils/bounded_collections.py +162 -0
- utils/circuit_breaker.py +389 -0
- utils/gif_utils.py +435 -0
- utils/markdown_utils.py +291 -0
- utils/message_utils.py +147 -0
- utils/metrics.py +36 -0
- utils/path_validator.py +227 -0
- utils/rate_limit_manager.py +399 -0
- utils/result_size.py +296 -0
- utils/time_utils.py +206 -0
- utils/user_utils.py +188 -0
- webview/README.md +111 -0
- webview/RENAME_AND_ALIGN_HANDOFF.md +200 -0
- webview/__init__.py +8 -0
- webview/activity.py +636 -0
- webview/owner_auth.py +108 -0
- webview/pages.py +448 -0
- webview/repair_sessions.py +399 -0
- webview/server.py +4323 -0
- webview/server_launcher.py +112 -0
- webview/static/css/activity.css +89 -0
- webview/static/css/chat.css +1772 -0
- webview/static/css/components.css +1190 -0
- webview/static/css/config-panel.css +651 -0
- webview/static/css/pages/admin.css +766 -0
- webview/static/css/pages/profile.css +231 -0
- webview/static/css/pages/settings.css +297 -0
- webview/static/css/pages/signin.css +316 -0
- webview/static/css/style.css +4250 -0
- webview/static/css/variables.css +147 -0
- webview/static/css/workspace-fullwidth-fix.css +109 -0
- webview/static/img/favicon.ico +0 -0
- webview/static/js/activity.js +394 -0
- webview/static/js/admin/activity.js +186 -0
- webview/static/js/admin/dashboard.js +163 -0
- webview/static/js/admin/user_detail.js +400 -0
- webview/static/js/admin/users.js +174 -0
- webview/static/js/admin/utils.js +214 -0
- webview/static/js/chat.js +3178 -0
- webview/static/js/config-panel.js +522 -0
- webview/static/js/constants.js +20 -0
- webview/static/js/error-handler.js +226 -0
- webview/static/js/ethers.min.js +1 -0
- webview/static/js/event-filter.js +137 -0
- webview/static/js/event-store.js +351 -0
- webview/static/js/file-attachments.js +374 -0
- webview/static/js/file-loader.js +163 -0
- webview/static/js/index.js +103 -0
- webview/static/js/performance-utils.js +196 -0
- webview/static/js/profile.js +396 -0
- webview/static/js/screenshot.js +386 -0
- webview/static/js/session.js +1527 -0
- webview/static/js/settings.js +1288 -0
- webview/static/js/sidebar-data.js +766 -0
- webview/static/js/sidebar-toggle.js +296 -0
- webview/static/js/socket.io.min.js +7 -0
- webview/static/js/stats.js +355 -0
- webview/static/js/ui-utils.js +420 -0
- webview/static/js/workspace.js +966 -0
- webview/stats_service.py +613 -0
- webview/templates/__init__.py +1 -0
- webview/templates/__pycache__/__init__.cpython-311.pyc +0 -0
- webview/templates/activity.html +36 -0
- webview/templates/admin/activity.html +122 -0
- webview/templates/admin/dashboard.html +112 -0
- webview/templates/admin/user_detail.html +228 -0
- webview/templates/admin/users.html +105 -0
- webview/templates/autonomy.html +60 -0
- webview/templates/error.html +133 -0
- webview/templates/finance.html +90 -0
- webview/templates/identity.html +73 -0
- webview/templates/index.html +42 -0
- webview/templates/layout.html +125 -0
- webview/templates/memory.html +59 -0
- webview/templates/owner_login.html +15 -0
- webview/templates/profile.html +121 -0
- webview/templates/session.html +312 -0
- webview/templates/settings.html +534 -0
- webview/templates/sidebar.html +112 -0
- webview/templates/signin.html +213 -0
- webview/templates/status.html +14 -0
- webview/templates/system.html +45 -0
- webview/webgate.py +196 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""Pluggable memory provider interface (roadmap P7, Reference §27).
|
|
2
|
+
|
|
3
|
+
Establishes the seam for swapping memory backends behind one interface, with the
|
|
4
|
+
one-external-provider constraint that keeps tool-schema bloat in check. This is
|
|
5
|
+
the abstraction only — the live agent path is not rewired here; a follow-up
|
|
6
|
+
routes prefetch/sync_turn through ``MemoryProviderRegistry.active()``.
|
|
7
|
+
|
|
8
|
+
Interface shape (from Reference ``MemoryProvider(ABC)``):
|
|
9
|
+
- identity ......... ``name``, ``is_external``
|
|
10
|
+
- lifecycle ........ ``is_available``, ``initialize``, ``shutdown``
|
|
11
|
+
- stateless ........ ``get_tool_schemas``
|
|
12
|
+
- stateful ......... ``prefetch``, ``sync_turn``, ``search``
|
|
13
|
+
- optional hooks ... ``on_session_end``, ``on_pre_compress`` (default no-ops; wired)
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from abc import ABC, abstractmethod
|
|
18
|
+
from dataclasses import dataclass, field
|
|
19
|
+
from typing import Any, Dict, List, Optional
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MemoryProviderError(RuntimeError):
|
|
23
|
+
"""Raised on provider-registration violations (e.g. >1 external provider)."""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class EpisodeRecord:
|
|
28
|
+
"""One durable activity/provenance row: what a completed run did, when.
|
|
29
|
+
|
|
30
|
+
Distinct from the relevance `memories` store — this is time-ordered episodic
|
|
31
|
+
provenance (answers "what did I do since X"), never full-text-searched.
|
|
32
|
+
"""
|
|
33
|
+
ts: int # unix epoch secs UTC — run COMPLETION time
|
|
34
|
+
user_id: str
|
|
35
|
+
session_id: str
|
|
36
|
+
kind: str # 'chat' | 'goal' | 'cron' | 'subagent'
|
|
37
|
+
task: Optional[str] = None
|
|
38
|
+
outcome: Optional[str] = None # 'done'|'failed'|'partial'|'cancelled' (+status)
|
|
39
|
+
summary: Optional[str] = None
|
|
40
|
+
artifacts: List[Dict[str, Any]] = field(default_factory=list)
|
|
41
|
+
spend_usd: float = 0.0
|
|
42
|
+
steps: int = 0
|
|
43
|
+
goal_id: Optional[str] = None
|
|
44
|
+
thread_key: Optional[str] = None # durable chat binding; None for goal/cron
|
|
45
|
+
started_ts: Optional[int] = None
|
|
46
|
+
meta: Optional[Dict[str, Any]] = None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class MemoryProvider(ABC):
|
|
50
|
+
"""Base class for memory backends."""
|
|
51
|
+
|
|
52
|
+
# --- identity ------------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
@abstractmethod
|
|
56
|
+
def name(self) -> str:
|
|
57
|
+
...
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def is_external(self) -> bool:
|
|
61
|
+
"""External providers count against the one-provider limit. Built-in/Null
|
|
62
|
+
providers return False so they can coexist with an external one."""
|
|
63
|
+
return True
|
|
64
|
+
|
|
65
|
+
# --- stateful (must implement) ------------------------------------------
|
|
66
|
+
|
|
67
|
+
@abstractmethod
|
|
68
|
+
async def prefetch(self, query: str, *, session_id: str, user_id: Optional[str] = None) -> str:
|
|
69
|
+
"""Return relevant context to inject before a turn (may be empty).
|
|
70
|
+
|
|
71
|
+
``user_id`` scopes recall to a single tenant (P0-0); ``None`` is the shared
|
|
72
|
+
anonymous bucket for single-user/local use.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
async def search(self, query: str, *, user_id: Optional[str] = None,
|
|
76
|
+
session_id: Optional[str] = None, limit: int = 5,
|
|
77
|
+
sort: Optional[str] = None) -> str:
|
|
78
|
+
"""Agent-callable recall (UP-09). Default implementation delegates to
|
|
79
|
+
``prefetch`` (ignoring limit/sort/browse) so providers that don't override it
|
|
80
|
+
still work. Backends with a richer store (SQLite FTS) override this to support
|
|
81
|
+
bounded result counts, sort, and browse-on-empty-query.
|
|
82
|
+
"""
|
|
83
|
+
return await self.prefetch(query, session_id=session_id or "", user_id=user_id)
|
|
84
|
+
|
|
85
|
+
@abstractmethod
|
|
86
|
+
async def sync_turn(self, user_content: str, assistant_content: str, *,
|
|
87
|
+
session_id: str, user_id: Optional[str] = None) -> None:
|
|
88
|
+
"""Persist a completed turn into memory (scoped to ``user_id``)."""
|
|
89
|
+
|
|
90
|
+
# --- lifecycle (default ok) ---------------------------------------------
|
|
91
|
+
|
|
92
|
+
async def is_available(self) -> bool:
|
|
93
|
+
return True
|
|
94
|
+
|
|
95
|
+
async def initialize(self, *, session_id: str, **kwargs: Any) -> None:
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
async def shutdown(self) -> None:
|
|
99
|
+
return None
|
|
100
|
+
|
|
101
|
+
# --- stateless (default empty) ------------------------------------------
|
|
102
|
+
|
|
103
|
+
def get_tool_schemas(self) -> List[Dict[str, Any]]:
|
|
104
|
+
return []
|
|
105
|
+
|
|
106
|
+
# --- optional hooks (default no-op) -------------------------------------
|
|
107
|
+
|
|
108
|
+
async def on_session_end(self, *, session_id: str, **kwargs: Any) -> None:
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
async def on_pre_compress(self, *, session_id: str, **kwargs: Any) -> None:
|
|
112
|
+
return None
|
|
113
|
+
|
|
114
|
+
# --- KB (knowledge-base) storage — default no-ops (Task 5) -------------
|
|
115
|
+
# Non-abstract: every provider satisfies the interface without implementing.
|
|
116
|
+
# Concrete KB storage lives in SqliteMemoryProvider; NullMemoryProvider
|
|
117
|
+
# inherits these no-ops automatically.
|
|
118
|
+
|
|
119
|
+
async def kb_ingest_chunk(self, *, user_id, collection: str, source_path: str,
|
|
120
|
+
source_hash: str, chunk_idx: int, content: str,
|
|
121
|
+
mime: str = "text/plain", created_at: str = None) -> None:
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
async def kb_search(self, query: str, *, user_id, collection: str = "default",
|
|
125
|
+
limit: int = 8) -> str:
|
|
126
|
+
return ""
|
|
127
|
+
|
|
128
|
+
async def kb_list_sources(self, *, user_id, collection: Optional[str] = None) -> List[Dict[str, Any]]:
|
|
129
|
+
return []
|
|
130
|
+
|
|
131
|
+
async def kb_remove(self, *, user_id, collection: str, source: Optional[str] = None) -> int:
|
|
132
|
+
return 0
|
|
133
|
+
|
|
134
|
+
def kb_source_hash(self, *, user_id, collection: str, source_path: str) -> Optional[str]:
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
# --- episodic activity ledger — default no-ops (mirror KB methods) -------
|
|
138
|
+
async def record_episode(self, episode: "EpisodeRecord", *,
|
|
139
|
+
session_id: str, user_id: Optional[str] = None) -> None:
|
|
140
|
+
"""Durably upsert one activity row keyed on session_id. Default: no-op."""
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
async def recall_episodes(self, *, user_id: Optional[str] = None,
|
|
144
|
+
since_ts: Optional[int] = None, until_ts: Optional[int] = None,
|
|
145
|
+
kind: Optional[str] = None, thread_key: Optional[str] = None,
|
|
146
|
+
limit: int = 20, order: str = "newest",
|
|
147
|
+
exclude_surfaced: bool = False) -> List["EpisodeRecord"]:
|
|
148
|
+
"""Time-ordered activity recall. Default: no-op -> []."""
|
|
149
|
+
return []
|
|
150
|
+
|
|
151
|
+
def prune_episodes(self, *, older_than_ts: int) -> int:
|
|
152
|
+
"""Retention sweep hook (curator cadence). Default: no-op -> 0."""
|
|
153
|
+
return 0
|
|
154
|
+
|
|
155
|
+
def mark_episode_surfaced(self, *, session_id: str, user_id: Optional[str] = None) -> None:
|
|
156
|
+
"""Mark episode(s) as surfaced/delivered. Default: no-op."""
|
|
157
|
+
return None
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class NullMemoryProvider(MemoryProvider):
|
|
161
|
+
"""Inert provider — the default when no external memory backend is configured."""
|
|
162
|
+
|
|
163
|
+
@property
|
|
164
|
+
def name(self) -> str:
|
|
165
|
+
return "null"
|
|
166
|
+
|
|
167
|
+
@property
|
|
168
|
+
def is_external(self) -> bool:
|
|
169
|
+
return False
|
|
170
|
+
|
|
171
|
+
async def prefetch(self, query: str, *, session_id: str, user_id: Optional[str] = None) -> str:
|
|
172
|
+
return ""
|
|
173
|
+
|
|
174
|
+
async def sync_turn(self, user_content: str, assistant_content: str, *,
|
|
175
|
+
session_id: str, user_id: Optional[str] = None) -> None:
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class MemoryProviderRegistry:
|
|
180
|
+
"""Holds registered providers and enforces the one-external-provider limit.
|
|
181
|
+
|
|
182
|
+
``active()`` prefers the external provider when present, else the most recently
|
|
183
|
+
registered built-in/Null provider.
|
|
184
|
+
"""
|
|
185
|
+
|
|
186
|
+
def __init__(self) -> None:
|
|
187
|
+
self._providers: List[MemoryProvider] = []
|
|
188
|
+
|
|
189
|
+
def register(self, provider: MemoryProvider) -> MemoryProvider:
|
|
190
|
+
if provider.is_external and any(p.is_external for p in self._providers):
|
|
191
|
+
existing = next(p for p in self._providers if p.is_external)
|
|
192
|
+
raise MemoryProviderError(
|
|
193
|
+
f"only one external memory provider allowed; '{existing.name}' is already "
|
|
194
|
+
f"registered (tried to add '{provider.name}')"
|
|
195
|
+
)
|
|
196
|
+
self._providers.append(provider)
|
|
197
|
+
return provider
|
|
198
|
+
|
|
199
|
+
def active(self) -> Optional[MemoryProvider]:
|
|
200
|
+
for p in self._providers:
|
|
201
|
+
if p.is_external:
|
|
202
|
+
return p
|
|
203
|
+
return self._providers[-1] if self._providers else None
|
|
204
|
+
|
|
205
|
+
@property
|
|
206
|
+
def providers(self) -> List[MemoryProvider]:
|
|
207
|
+
return list(self._providers)
|
|
208
|
+
|
|
209
|
+
def clear(self) -> None:
|
|
210
|
+
self._providers.clear()
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"""Process-global memory-provider registry + agent-facing helpers (roadmap P7).
|
|
2
|
+
|
|
3
|
+
Makes the P7 ``MemoryProviderRegistry`` a live, consumable singleton and gives the
|
|
4
|
+
agent two no-throw entry points (``memory_prefetch`` / ``memory_sync_turn``) that
|
|
5
|
+
route through the *active* provider. The default active provider is
|
|
6
|
+
``NullMemoryProvider`` — so when no external backend is configured these are
|
|
7
|
+
no-ops and production behavior is unchanged. Registering an external provider
|
|
8
|
+
(``set_external_memory_provider``) makes the live agent start using it.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
from typing import Optional
|
|
14
|
+
|
|
15
|
+
from modules.memory.provider import (
|
|
16
|
+
MemoryProvider, NullMemoryProvider, MemoryProviderRegistry,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
_registry: Optional[MemoryProviderRegistry] = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_memory_registry() -> MemoryProviderRegistry:
|
|
25
|
+
"""Return the process-global registry, seeded with a Null provider on first use."""
|
|
26
|
+
global _registry
|
|
27
|
+
if _registry is None:
|
|
28
|
+
_registry = MemoryProviderRegistry()
|
|
29
|
+
_registry.register(NullMemoryProvider())
|
|
30
|
+
return _registry
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def set_external_memory_provider(provider: MemoryProvider) -> MemoryProvider:
|
|
34
|
+
"""Register the single external memory provider (one-provider constraint enforced)."""
|
|
35
|
+
return get_memory_registry().register(provider)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def reset_memory_registry() -> None:
|
|
39
|
+
"""Test/teardown helper: drop all providers (next get_* re-seeds Null)."""
|
|
40
|
+
global _registry
|
|
41
|
+
_registry = None
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def memory_prefetch(query: str, *, session_id: str, user_id: Optional[str] = None) -> str:
|
|
45
|
+
"""Route a prefetch through the active provider; '' for Null / on any error.
|
|
46
|
+
|
|
47
|
+
``user_id`` scopes recall to the tenant (P0-0) so one user's memory never leaks
|
|
48
|
+
into another's recall in a multi-tenant deployment.
|
|
49
|
+
"""
|
|
50
|
+
provider = get_memory_registry().active()
|
|
51
|
+
if provider is None:
|
|
52
|
+
return ""
|
|
53
|
+
try:
|
|
54
|
+
return await provider.prefetch(query, session_id=session_id, user_id=user_id)
|
|
55
|
+
except Exception as e: # never break the agent loop on a memory backend hiccup
|
|
56
|
+
logger.warning("memory_prefetch failed: %s", e)
|
|
57
|
+
return ""
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
async def memory_search(query: str, *, session_id: str = "", user_id: Optional[str] = None,
|
|
61
|
+
limit: int = 5, sort: Optional[str] = None) -> str:
|
|
62
|
+
"""Route an agent-initiated recall (discover/browse) through the active provider.
|
|
63
|
+
|
|
64
|
+
Unlike ``memory_prefetch`` (automatic, fixed top_k, rank-only), this exposes the
|
|
65
|
+
provider's richer ``search`` (bounded limit, sort, browse-on-empty). '' for Null
|
|
66
|
+
/ on any error. Tenant-scoped via ``user_id`` exactly like prefetch.
|
|
67
|
+
"""
|
|
68
|
+
provider = get_memory_registry().active()
|
|
69
|
+
if provider is None:
|
|
70
|
+
return ""
|
|
71
|
+
try:
|
|
72
|
+
return await provider.search(query, user_id=user_id, session_id=session_id,
|
|
73
|
+
limit=limit, sort=sort)
|
|
74
|
+
except Exception as e:
|
|
75
|
+
logger.warning("memory_search failed: %s", e)
|
|
76
|
+
return ""
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
async def memory_sync_turn(user_content: str, assistant_content: str, *,
|
|
80
|
+
session_id: str, user_id: Optional[str] = None) -> None:
|
|
81
|
+
"""Route a completed turn through the active provider (no-op for Null)."""
|
|
82
|
+
provider = get_memory_registry().active()
|
|
83
|
+
if provider is None or not provider.is_external:
|
|
84
|
+
return # Null/built-in: nothing to persist externally
|
|
85
|
+
try:
|
|
86
|
+
await provider.sync_turn(user_content, assistant_content,
|
|
87
|
+
session_id=session_id, user_id=user_id)
|
|
88
|
+
except Exception as e:
|
|
89
|
+
logger.warning("memory_sync_turn failed: %s", e)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# ---- Episodic activity-ledger registry routers (Task 2) -------------------
|
|
93
|
+
# Mirror memory_sync_turn (writes) / kb_search (reads): no-throw, delegate to
|
|
94
|
+
# .active(), safe defaults on error. Tenant scoping stays the provider's job.
|
|
95
|
+
|
|
96
|
+
async def memory_record_episode(episode, *, session_id: str,
|
|
97
|
+
user_id: Optional[str] = None) -> None:
|
|
98
|
+
"""Route an episodic write through the active external provider (no-op for Null)."""
|
|
99
|
+
provider = get_memory_registry().active()
|
|
100
|
+
if provider is None or not provider.is_external:
|
|
101
|
+
return
|
|
102
|
+
try:
|
|
103
|
+
await provider.record_episode(episode, session_id=session_id, user_id=user_id)
|
|
104
|
+
except Exception as e:
|
|
105
|
+
logger.warning("memory_record_episode failed: %s", e)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
async def memory_recall_episodes(*, user_id: Optional[str] = None,
|
|
109
|
+
since_ts: Optional[int] = None,
|
|
110
|
+
until_ts: Optional[int] = None,
|
|
111
|
+
kind: Optional[str] = None,
|
|
112
|
+
thread_key: Optional[str] = None,
|
|
113
|
+
limit: int = 20, order: str = "newest",
|
|
114
|
+
exclude_surfaced: bool = False) -> list:
|
|
115
|
+
"""Route a time-ordered episodic recall through the active provider. [] on error."""
|
|
116
|
+
provider = get_memory_registry().active()
|
|
117
|
+
if provider is None:
|
|
118
|
+
return []
|
|
119
|
+
try:
|
|
120
|
+
return await provider.recall_episodes(
|
|
121
|
+
user_id=user_id, since_ts=since_ts, until_ts=until_ts, kind=kind,
|
|
122
|
+
thread_key=thread_key, limit=limit, order=order,
|
|
123
|
+
exclude_surfaced=exclude_surfaced)
|
|
124
|
+
except Exception as e:
|
|
125
|
+
logger.warning("memory_recall_episodes failed: %s", e)
|
|
126
|
+
return []
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# ---- KB (knowledge-base) registry routers (Task 5) -------------------------
|
|
130
|
+
# Mirror memory_search: no-throw, delegate to .active(), safe defaults on error.
|
|
131
|
+
|
|
132
|
+
async def kb_search(query: str, *, user_id: Optional[str] = None,
|
|
133
|
+
collection: str = "default", limit: int = 8) -> str:
|
|
134
|
+
"""Route a KB search through the active provider. '' on no-provider / error."""
|
|
135
|
+
provider = get_memory_registry().active()
|
|
136
|
+
if provider is None:
|
|
137
|
+
return ""
|
|
138
|
+
try:
|
|
139
|
+
return await provider.kb_search(query, user_id=user_id,
|
|
140
|
+
collection=collection, limit=limit)
|
|
141
|
+
except Exception as e:
|
|
142
|
+
logger.warning("kb_search failed: %s", e)
|
|
143
|
+
return ""
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
async def kb_list_sources(*, user_id: Optional[str] = None,
|
|
147
|
+
collection: Optional[str] = None) -> list:
|
|
148
|
+
"""Route a KB source listing through the active provider. [] on error."""
|
|
149
|
+
provider = get_memory_registry().active()
|
|
150
|
+
if provider is None:
|
|
151
|
+
return []
|
|
152
|
+
try:
|
|
153
|
+
return await provider.kb_list_sources(user_id=user_id, collection=collection)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
logger.warning("kb_list_sources failed: %s", e)
|
|
156
|
+
return []
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
async def kb_remove(*, user_id: Optional[str] = None, collection: str,
|
|
160
|
+
source: Optional[str] = None) -> int:
|
|
161
|
+
"""Route a KB removal through the active provider. 0 on error."""
|
|
162
|
+
provider = get_memory_registry().active()
|
|
163
|
+
if provider is None:
|
|
164
|
+
return 0
|
|
165
|
+
try:
|
|
166
|
+
return await provider.kb_remove(user_id=user_id, collection=collection,
|
|
167
|
+
source=source)
|
|
168
|
+
except Exception as e:
|
|
169
|
+
logger.warning("kb_remove failed: %s", e)
|
|
170
|
+
return 0
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
async def kb_ingest_chunk(*, user_id: Optional[str] = None, collection: str,
|
|
174
|
+
source_path: str, source_hash: str, chunk_idx: int,
|
|
175
|
+
content: str, mime: str = "text/plain",
|
|
176
|
+
created_at: str = None) -> bool:
|
|
177
|
+
"""Route a KB chunk ingest through the active provider. Returns True on a
|
|
178
|
+
successful write, False on no-provider / error / provider-refusal — so the
|
|
179
|
+
ingest engine can detect a partial write instead of silently completing."""
|
|
180
|
+
provider = get_memory_registry().active()
|
|
181
|
+
if provider is None:
|
|
182
|
+
return False
|
|
183
|
+
try:
|
|
184
|
+
return bool(await provider.kb_ingest_chunk(
|
|
185
|
+
user_id=user_id, collection=collection, source_path=source_path,
|
|
186
|
+
source_hash=source_hash, chunk_idx=chunk_idx, content=content,
|
|
187
|
+
mime=mime, created_at=created_at,
|
|
188
|
+
))
|
|
189
|
+
except Exception as e:
|
|
190
|
+
logger.warning("kb_ingest_chunk failed: %s", e)
|
|
191
|
+
return False
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
async def kb_source_hash(*, user_id: Optional[str] = None, collection: str,
|
|
195
|
+
source_path: str) -> Optional[str]:
|
|
196
|
+
"""Route a KB source-hash lookup through the active provider. None on error."""
|
|
197
|
+
provider = get_memory_registry().active()
|
|
198
|
+
if provider is None:
|
|
199
|
+
return None
|
|
200
|
+
try:
|
|
201
|
+
return provider.kb_source_hash(user_id=user_id, collection=collection,
|
|
202
|
+
source_path=source_path)
|
|
203
|
+
except Exception as e:
|
|
204
|
+
logger.warning("kb_source_hash failed: %s", e)
|
|
205
|
+
return None
|