polyrob 1.6.0__tar.gz → 1.7.0__tar.gz
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.
- polyrob-1.7.0/CHANGELOG.md +2094 -0
- polyrob-1.7.0/PKG-INFO +648 -0
- polyrob-1.7.0/README.md +530 -0
- polyrob-1.7.0/agents/task/agent/conversation.py +116 -0
- polyrob-1.7.0/agents/task/agent/core/construction.py +1385 -0
- polyrob-1.7.0/agents/task/agent/core/conversational_exit.py +123 -0
- polyrob-1.7.0/agents/task/agent/core/episodic_digest.py +451 -0
- polyrob-1.7.0/agents/task/agent/core/llm_provisioning.py +259 -0
- polyrob-1.7.0/agents/task/agent/core/next_action_internal.py +1616 -0
- polyrob-1.7.0/agents/task/agent/core/result_processing.py +584 -0
- polyrob-1.7.0/agents/task/agent/core/run_loop.py +844 -0
- polyrob-1.7.0/agents/task/agent/core/step_execution.py +469 -0
- polyrob-1.7.0/agents/task/agent/core/user_ingress.py +451 -0
- polyrob-1.7.0/agents/task/agent/messages/builders.py +349 -0
- polyrob-1.7.0/agents/task/agent/messages/filters.py +537 -0
- polyrob-1.7.0/agents/task/agent/messages/persistence.py +524 -0
- polyrob-1.7.0/agents/task/agent/messages/retrieval.py +670 -0
- polyrob-1.7.0/agents/task/agent/orchestrator.py +924 -0
- polyrob-1.7.0/agents/task/agent/prompts.py +1067 -0
- polyrob-1.7.0/agents/task/goals/board.py +1234 -0
- polyrob-1.7.0/agents/task/goals/board_deps.py +283 -0
- polyrob-1.7.0/agents/task/goals/goal_run.py +1010 -0
- polyrob-1.7.0/agents/task/goals/rail_answers.py +245 -0
- polyrob-1.7.0/agents/task/session/cleanup.py +862 -0
- polyrob-1.7.0/agents/task/task_agent_delivery.py +1099 -0
- polyrob-1.7.0/agents/task/task_agent_support.py +265 -0
- polyrob-1.7.0/agents/task/telemetry/service_detect.py +47 -0
- polyrob-1.7.0/agents/task_agent_lite.py +978 -0
- polyrob-1.7.0/api/a2a/agent_card.py +347 -0
- polyrob-1.7.0/api/admin_endpoints.py +1328 -0
- polyrob-1.7.0/api/auth_endpoints.py +478 -0
- polyrob-1.7.0/api/mcp_models.py +285 -0
- polyrob-1.7.0/api/openai_compat/router.py +315 -0
- polyrob-1.7.0/api/payment_endpoints.py +424 -0
- polyrob-1.7.0/api/task_http_api.py +1875 -0
- polyrob-1.7.0/cli/commands/chat.py +1111 -0
- polyrob-1.7.0/cli/commands/config.py +756 -0
- polyrob-1.7.0/cli/commands/doctor.py +1481 -0
- polyrob-1.7.0/cli/commands/identity.py +126 -0
- polyrob-1.7.0/cli/commands/init.py +670 -0
- polyrob-1.7.0/cli/commands/keys.py +220 -0
- polyrob-1.7.0/cli/commands/model.py +191 -0
- polyrob-1.7.0/cli/commands/run.py +547 -0
- polyrob-1.7.0/cli/commands/service.py +620 -0
- polyrob-1.7.0/cli/commands/wallet.py +1838 -0
- polyrob-1.7.0/cli/commands/wallet_lp.py +120 -0
- polyrob-1.7.0/cli/config_store.py +316 -0
- polyrob-1.7.0/cli/keys.py +103 -0
- polyrob-1.7.0/cli/ui/commands/h_config.py +367 -0
- polyrob-1.7.0/cli/ui/commands/h_inbox.py +145 -0
- polyrob-1.7.0/cli/ui/commands/h_mcp.py +242 -0
- polyrob-1.7.0/cli/ui/commands/h_money_verbs.py +164 -0
- polyrob-1.7.0/cli/ui/commands/handlers.py +1765 -0
- polyrob-1.7.0/cli/ui/model_selector.py +528 -0
- polyrob-1.7.0/config/.env.development.template +290 -0
- polyrob-1.7.0/core/CHANGELOG.md +2094 -0
- polyrob-1.7.0/core/cli_tool_tables.py +104 -0
- polyrob-1.7.0/core/config.py +736 -0
- polyrob-1.7.0/core/config_policy/profiles.py +191 -0
- polyrob-1.7.0/core/config_policy/rigs.py +166 -0
- polyrob-1.7.0/core/config_policy/spend_lane.py +403 -0
- polyrob-1.7.0/core/config_service.py +913 -0
- polyrob-1.7.0/core/constants.py +125 -0
- polyrob-1.7.0/core/copy/en.py +87 -0
- polyrob-1.7.0/core/cron_lanes.py +323 -0
- polyrob-1.7.0/core/db_manifest.py +262 -0
- polyrob-1.7.0/core/event_kinds.py +255 -0
- polyrob-1.7.0/core/event_log.py +455 -0
- polyrob-1.7.0/core/flags_catalog.py +1384 -0
- polyrob-1.7.0/core/goal_vocab.py +65 -0
- polyrob-1.7.0/core/lazy_closures/docs.docx.txt +187 -0
- polyrob-1.7.0/core/lazy_closures/docs.pdf.txt +7 -0
- polyrob-1.7.0/core/lazy_closures/media.gif.txt +231 -0
- polyrob-1.7.0/core/lazy_closures/media.qr.txt +10 -0
- polyrob-1.7.0/core/lazy_closures/memory.vector.txt +232 -0
- polyrob-1.7.0/core/lazy_closures/provider.anthropic.txt +296 -0
- polyrob-1.7.0/core/lazy_closures/provider.gemini.txt +594 -0
- polyrob-1.7.0/core/lazy_closures/server.api.txt +1720 -0
- polyrob-1.7.0/core/lazy_closures/surface.telegram.txt +904 -0
- polyrob-1.7.0/core/lazy_closures/tool.anysite.txt +340 -0
- polyrob-1.7.0/core/lazy_closures/voice.transcribe.txt +402 -0
- polyrob-1.7.0/core/lifecycle.py +785 -0
- polyrob-1.7.0/core/mcp_admin.py +290 -0
- polyrob-1.7.0/core/money/authorize.py +273 -0
- polyrob-1.7.0/core/money/hooks.py +194 -0
- polyrob-1.7.0/core/money/limits.py +183 -0
- polyrob-1.7.0/core/money/mandate_gate.py +290 -0
- polyrob-1.7.0/core/money_verbs.py +109 -0
- polyrob-1.7.0/core/open_positions.py +982 -0
- polyrob-1.7.0/core/packs/loader.py +629 -0
- polyrob-1.7.0/core/position_events.py +116 -0
- polyrob-1.7.0/core/position_plans.py +262 -0
- polyrob-1.7.0/core/position_retire.py +151 -0
- polyrob-1.7.0/core/runtime_config.py +336 -0
- polyrob-1.7.0/core/self_context_writer.py +672 -0
- polyrob-1.7.0/core/self_evolution.py +1001 -0
- polyrob-1.7.0/core/setting_proposals.py +307 -0
- polyrob-1.7.0/core/signer/protocol.py +266 -0
- polyrob-1.7.0/core/signer/remote.py +347 -0
- polyrob-1.7.0/core/signer/server.py +928 -0
- polyrob-1.7.0/core/signer/shadow.py +326 -0
- polyrob-1.7.0/core/signer/sign_ops.py +71 -0
- polyrob-1.7.0/core/signer/store.py +217 -0
- polyrob-1.7.0/core/status_money.py +548 -0
- polyrob-1.7.0/core/status_render.py +373 -0
- polyrob-1.7.0/core/status_sections.py +163 -0
- polyrob-1.7.0/core/status_snapshot.py +283 -0
- polyrob-1.7.0/core/status_types.py +175 -0
- polyrob-1.7.0/core/surfaces/cards.py +1365 -0
- polyrob-1.7.0/core/surfaces/group_admin.py +378 -0
- polyrob-1.7.0/core/surfaces/message_router.py +628 -0
- polyrob-1.7.0/core/surfaces/owner_intent.py +69 -0
- polyrob-1.7.0/core/surfaces/owner_thread.py +747 -0
- polyrob-1.7.0/core/surfaces/room_actions.py +1134 -0
- polyrob-1.7.0/core/surfaces/room_label.py +91 -0
- polyrob-1.7.0/core/surfaces/turn_reply.py +141 -0
- polyrob-1.7.0/core/tool_capabilities.py +547 -0
- polyrob-1.7.0/core/tool_catalog.py +229 -0
- polyrob-1.7.0/core/tool_gates.py +298 -0
- polyrob-1.7.0/core/trading_intake.py +276 -0
- polyrob-1.7.0/core/trading_mandate.py +481 -0
- polyrob-1.7.0/core/trading_presets.py +312 -0
- polyrob-1.7.0/core/trading_report.py +303 -0
- polyrob-1.7.0/core/verb_policy_rows.py +649 -0
- polyrob-1.7.0/core/verbs.py +566 -0
- polyrob-1.7.0/core/wallet/__init__.py +63 -0
- polyrob-1.7.0/core/wallet/buy_target.py +322 -0
- polyrob-1.7.0/core/wallet/sign_policy.py +580 -0
- polyrob-1.7.0/core/wallet/token_pins.py +410 -0
- polyrob-1.7.0/core/wallet/token_provenance.py +302 -0
- polyrob-1.7.0/core/wallet/token_trust.py +450 -0
- polyrob-1.7.0/core/wallet/tx_guard_steps/turn.py +234 -0
- polyrob-1.7.0/cron/digest.py +360 -0
- polyrob-1.7.0/cron/jobs.py +521 -0
- polyrob-1.7.0/cron/read_job.py +577 -0
- polyrob-1.7.0/cron/runner.py +873 -0
- polyrob-1.7.0/cron/service.py +489 -0
- polyrob-1.7.0/data/prompts/skills/dca/SKILL.md +87 -0
- polyrob-1.7.0/data/prompts/skills/defi-bridge/SKILL.md +121 -0
- polyrob-1.7.0/data/prompts/skills/defi-liquidity/SKILL.md +64 -0
- polyrob-1.7.0/data/prompts/skills/exits/SKILL.md +127 -0
- polyrob-1.7.0/data/prompts/skills/harness-manual/SKILL.md +29 -0
- polyrob-1.7.0/data/prompts/skills/memecoin-scouting/SKILL.md +245 -0
- polyrob-1.7.0/data/prompts/skills/polyrob-user-guide/references/configuration.md +687 -0
- polyrob-1.7.0/data/prompts/skills/polyrob-user-guide/references/surfaces.md +125 -0
- polyrob-1.7.0/data/prompts/skills/polyrob-user-guide/references/verbs.md +167 -0
- polyrob-1.7.0/data/prompts/skills/position-journal/SKILL.md +88 -0
- polyrob-1.7.0/data/prompts/skills/robinhood-chain/SKILL.md +109 -0
- polyrob-1.7.0/data/prompts/skills/self-deploy/SKILL.md +176 -0
- polyrob-1.7.0/data/prompts/skills/sizing-and-risk/SKILL.md +96 -0
- polyrob-1.7.0/data/prompts/skills/token-identity/SKILL.md +157 -0
- polyrob-1.7.0/data/prompts/skills/token-launch/SKILL.md +177 -0
- polyrob-1.7.0/data/prompts/skills/trade-execution/SKILL.md +114 -0
- polyrob-1.7.0/data/prompts/skills/trading-mandate/SKILL.md +167 -0
- polyrob-1.7.0/data/prompts/skills/treasury-trading/SKILL.md +317 -0
- polyrob-1.7.0/data/prompts/skills/treasury-trading/references/executing.md +32 -0
- polyrob-1.7.0/data/prompts/skills/verified-tooling/SKILL.md +62 -0
- polyrob-1.7.0/data/prompts/system/harness.md +3 -0
- polyrob-1.7.0/data/prompts/system/mcp_tools.md +52 -0
- polyrob-1.7.0/docs/CONFIGURATION.md +1381 -0
- polyrob-1.7.0/docs/guide/api.md +673 -0
- polyrob-1.7.0/docs/guide/architecture.md +282 -0
- polyrob-1.7.0/docs/guide/cli.md +1012 -0
- polyrob-1.7.0/docs/guide/configuration.md +859 -0
- polyrob-1.7.0/docs/guide/console.md +220 -0
- polyrob-1.7.0/docs/guide/conversation.md +69 -0
- polyrob-1.7.0/docs/guide/deployment-postures.md +350 -0
- polyrob-1.7.0/docs/guide/feishu-dingtalk.md +117 -0
- polyrob-1.7.0/docs/guide/getting-started.md +442 -0
- polyrob-1.7.0/docs/guide/groups.md +615 -0
- polyrob-1.7.0/docs/guide/instances.md +255 -0
- polyrob-1.7.0/docs/guide/migration/from-hermes.md +251 -0
- polyrob-1.7.0/docs/guide/migration/from-openclaw.md +247 -0
- polyrob-1.7.0/docs/guide/operate-the-service.md +108 -0
- polyrob-1.7.0/docs/guide/owner-controls.md +441 -0
- polyrob-1.7.0/docs/guide/packs.md +191 -0
- polyrob-1.7.0/docs/guide/payments.md +1754 -0
- polyrob-1.7.0/docs/guide/profiles.md +197 -0
- polyrob-1.7.0/docs/guide/security-model.md +653 -0
- polyrob-1.7.0/docs/guide/self-hosting.md +499 -0
- polyrob-1.7.0/docs/guide/skills.md +382 -0
- polyrob-1.7.0/docs/guide/streams.md +265 -0
- polyrob-1.7.0/docs/guide/upgrading.md +304 -0
- polyrob-1.7.0/docs/guide/x-twitter.md +204 -0
- polyrob-1.7.0/migrations/README.md +398 -0
- polyrob-1.7.0/migrations/version_manager.py +241 -0
- polyrob-1.7.0/migrations/versions/v1_11_0_retire_holder_tier.py +92 -0
- polyrob-1.7.0/modules/auth/api_key_manager.py +176 -0
- polyrob-1.7.0/modules/auth/identity_mapper.py +143 -0
- polyrob-1.7.0/modules/auth/tier_manager.py +91 -0
- polyrob-1.7.0/modules/cards/cards.py +396 -0
- polyrob-1.7.0/modules/database/user_profiles.py +492 -0
- polyrob-1.7.0/modules/llm/__init__.py +96 -0
- polyrob-1.7.0/modules/llm/adapters.py +1111 -0
- polyrob-1.7.0/modules/llm/available_models.py +89 -0
- polyrob-1.7.0/modules/llm/deepseek_client.py +147 -0
- polyrob-1.7.0/modules/llm/llm_client_registry.py +290 -0
- polyrob-1.7.0/modules/llm/llm_factory.py +287 -0
- polyrob-1.7.0/modules/llm/llm_manager.py +854 -0
- polyrob-1.7.0/modules/llm/model_catalog.py +1553 -0
- polyrob-1.7.0/modules/llm/model_registry.py +414 -0
- polyrob-1.7.0/modules/llm/openrouter_reasoning.py +114 -0
- polyrob-1.7.0/modules/llm/profiles.py +601 -0
- polyrob-1.7.0/modules/llm/provider_spec.py +1315 -0
- polyrob-1.7.0/modules/memory/models.py +179 -0
- polyrob-1.7.0/modules/memory/recall_rank.py +98 -0
- polyrob-1.7.0/modules/x402/invoice_jitter.py +358 -0
- polyrob-1.7.0/packs/x/polyrob_x/cron_delivery.py +67 -0
- polyrob-1.7.0/packs/x/polyrob_x/metrics.py +39 -0
- polyrob-1.7.0/packs/x/polyrob_x/skills/x-engagement/SKILL.md +156 -0
- polyrob-1.7.0/packs/x/polyrob_x/twitter_tool.py +2824 -0
- polyrob-1.7.0/polyrob/app/autonomy_runtime.py +1298 -0
- polyrob-1.7.0/polyrob/app/bootstrap.py +808 -0
- polyrob-1.7.0/polyrob/app/initialization.py +1000 -0
- polyrob-1.7.0/polyrob/app/trading_jobs.py +326 -0
- polyrob-1.7.0/polyrob/app/trading_lifecycle.py +514 -0
- polyrob-1.7.0/polyrob.egg-info/PKG-INFO +648 -0
- polyrob-1.7.0/polyrob.egg-info/SOURCES.txt +1908 -0
- polyrob-1.7.0/polyrob.egg-info/requires.txt +121 -0
- polyrob-1.7.0/pyproject.toml +180 -0
- polyrob-1.7.0/requirements.lock +5356 -0
- polyrob-1.7.0/surfaces/telegram/admin_verbs.py +445 -0
- polyrob-1.7.0/surfaces/telegram/harness.py +2912 -0
- polyrob-1.7.0/surfaces/telegram/identity_ops.py +177 -0
- polyrob-1.7.0/surfaces/telegram/lifecycle_ops.py +211 -0
- polyrob-1.7.0/surfaces/telegram/nft_ops.py +264 -0
- polyrob-1.7.0/surfaces/telegram/owner_ops.py +924 -0
- polyrob-1.7.0/surfaces/telegram/prefs_ops.py +257 -0
- polyrob-1.7.0/surfaces/telegram/token_ops.py +321 -0
- polyrob-1.7.0/surfaces/telegram/trade_ops.py +249 -0
- polyrob-1.7.0/tests/test_board_create_grant_ratchet.py +76 -0
- polyrob-1.7.0/tests/test_effect_classification_ratchet.py +329 -0
- polyrob-1.7.0/tests/test_file_size_ratchet.py +221 -0
- polyrob-1.7.0/tests/test_flag_count_ratchet.py +80 -0
- polyrob-1.7.0/tests/test_prompt_surface_golden.py +120 -0
- polyrob-1.7.0/tests/test_prose_required_ratchet.py +68 -0
- polyrob-1.7.0/tests/test_room_safety_ratchet.py +206 -0
- polyrob-1.7.0/tests/test_status_silence_ratchet.py +153 -0
- polyrob-1.7.0/tools/README.md +537 -0
- polyrob-1.7.0/tools/__init__.py +428 -0
- polyrob-1.7.0/tools/agent_nft/tool.py +433 -0
- polyrob-1.7.0/tools/agent_nft/view.py +345 -0
- polyrob-1.7.0/tools/agent_nft/withdraw.py +211 -0
- polyrob-1.7.0/tools/base_tool.py +525 -0
- polyrob-1.7.0/tools/code_exec/backend_probe.py +249 -0
- polyrob-1.7.0/tools/code_exec/tool.py +387 -0
- polyrob-1.7.0/tools/controller/action_registration.py +1832 -0
- polyrob-1.7.0/tools/controller/agent_status_action.py +309 -0
- polyrob-1.7.0/tools/controller/approval_queue.py +1442 -0
- polyrob-1.7.0/tools/controller/delegation.py +210 -0
- polyrob-1.7.0/tools/controller/execution.py +1042 -0
- polyrob-1.7.0/tools/controller/introspection.py +330 -0
- polyrob-1.7.0/tools/controller/mcp_gate.py +69 -0
- polyrob-1.7.0/tools/controller/mcp_registrar.py +288 -0
- polyrob-1.7.0/tools/controller/send_message_route.py +129 -0
- polyrob-1.7.0/tools/controller/service.py +409 -0
- polyrob-1.7.0/tools/controller/setting_actions.py +196 -0
- polyrob-1.7.0/tools/controller/tool_management.py +487 -0
- polyrob-1.7.0/tools/controller/trade_mandate_action.py +91 -0
- polyrob-1.7.0/tools/cronjob_tools.py +745 -0
- polyrob-1.7.0/tools/dapp_browser/bridge.py +800 -0
- polyrob-1.7.0/tools/dapp_browser/tool.py +454 -0
- polyrob-1.7.0/tools/defi/book.py +377 -0
- polyrob-1.7.0/tools/defi/buy_screen.py +104 -0
- polyrob-1.7.0/tools/defi/data_holdings.py +542 -0
- polyrob-1.7.0/tools/defi/data_params.py +187 -0
- polyrob-1.7.0/tools/defi/data_reconcile.py +278 -0
- polyrob-1.7.0/tools/defi/data_render.py +802 -0
- polyrob-1.7.0/tools/defi/data_retire.py +51 -0
- polyrob-1.7.0/tools/defi/data_tool.py +1355 -0
- polyrob-1.7.0/tools/defi/discovery.py +228 -0
- polyrob-1.7.0/tools/defi/identity_gate.py +398 -0
- polyrob-1.7.0/tools/defi/lp_v4.py +291 -0
- polyrob-1.7.0/tools/defi/marks.py +323 -0
- polyrob-1.7.0/tools/defi/positions_view.py +282 -0
- polyrob-1.7.0/tools/defi/providers/alchemy_index.py +170 -0
- polyrob-1.7.0/tools/defi/providers/base.py +183 -0
- polyrob-1.7.0/tools/defi/providers/geckoterminal.py +729 -0
- polyrob-1.7.0/tools/defi/providers/goplus.py +484 -0
- polyrob-1.7.0/tools/defi/providers/token_audits.py +279 -0
- polyrob-1.7.0/tools/defi/reconcile.py +390 -0
- polyrob-1.7.0/tools/defi/retire.py +178 -0
- polyrob-1.7.0/tools/defi/solana_swap_verb.py +859 -0
- polyrob-1.7.0/tools/defi/survivability.py +395 -0
- polyrob-1.7.0/tools/defi/swap_verb.py +383 -0
- polyrob-1.7.0/tools/defi/token_screen.py +977 -0
- polyrob-1.7.0/tools/defi/trade_params.py +442 -0
- polyrob-1.7.0/tools/defi/trade_tool.py +1396 -0
- polyrob-1.7.0/tools/defi/wallet_intel.py +312 -0
- polyrob-1.7.0/tools/descriptors.py +370 -0
- polyrob-1.7.0/tools/gate_effective.py +104 -0
- polyrob-1.7.0/tools/harness_view.py +134 -0
- polyrob-1.7.0/tools/http_request/__init__.py +4 -0
- polyrob-1.7.0/tools/http_request/tool.py +271 -0
- polyrob-1.7.0/tools/intel/cache.py +94 -0
- polyrob-1.7.0/tools/mcp/README.md +49 -0
- polyrob-1.7.0/tools/mcp/config.py +393 -0
- polyrob-1.7.0/tools/mcp/http_reply.py +136 -0
- polyrob-1.7.0/tools/mcp/inventory.py +79 -0
- polyrob-1.7.0/tools/mcp/mcp_tool.py +1442 -0
- polyrob-1.7.0/tools/mcp/operator_home.py +104 -0
- polyrob-1.7.0/tools/mcp/probe.py +128 -0
- polyrob-1.7.0/tools/mcp/protocol.py +1485 -0
- polyrob-1.7.0/tools/mcp/user_mcp_service.py +879 -0
- polyrob-1.7.0/tools/mcp/user_servers.py +356 -0
- polyrob-1.7.0/tools/shell/process_tool.py +379 -0
- polyrob-1.7.0/tools/shell/tool.py +472 -0
- polyrob-1.7.0/tools/status_harness.py +99 -0
- polyrob-1.7.0/tools/tool_disclosure.py +525 -0
- polyrob-1.7.0/tools/wallet_sign/__init__.py +38 -0
- polyrob-1.7.0/tools/wallet_sign/store.py +172 -0
- polyrob-1.7.0/tools/wallet_sign/tool.py +754 -0
- polyrob-1.7.0/tools/web_fetch/fetcher.py +211 -0
- polyrob-1.7.0/webview/contributions.py +65 -0
- polyrob-1.7.0/webview/copy/en.py +1452 -0
- polyrob-1.7.0/webview/goal_board_routes.py +369 -0
- polyrob-1.7.0/webview/pages_new.py +1838 -0
- polyrob-1.7.0/webview/static/app/app.css +637 -0
- polyrob-1.7.0/webview/static/app/verbs.en.json +430 -0
- polyrob-1.7.0/webview/static/app/work-create.js +92 -0
- polyrob-1.7.0/webview/static/app/work-goals.js +804 -0
- polyrob-1.7.0/webview/static/app/work-now.js +663 -0
- polyrob-1.7.0/webview/static/css/pages/admin.css +719 -0
- polyrob-1.7.0/webview/static/js/admin/user_detail.js +331 -0
- polyrob-1.7.0/webview/static/js/admin/users.js +160 -0
- polyrob-1.7.0/webview/templates/admin/user_detail.html +207 -0
- polyrob-1.7.0/webview/templates/admin/users.html +103 -0
- polyrob-1.7.0/webview/templates/work.html +443 -0
- polyrob-1.6.0/CHANGELOG.md +0 -2022
- polyrob-1.6.0/PKG-INFO +0 -637
- polyrob-1.6.0/README.md +0 -519
- polyrob-1.6.0/agents/task/agent/conversation.py +0 -106
- polyrob-1.6.0/agents/task/agent/core/construction.py +0 -1362
- polyrob-1.6.0/agents/task/agent/core/conversational_exit.py +0 -75
- polyrob-1.6.0/agents/task/agent/core/episodic_digest.py +0 -445
- polyrob-1.6.0/agents/task/agent/core/llm_provisioning.py +0 -261
- polyrob-1.6.0/agents/task/agent/core/next_action_internal.py +0 -1625
- polyrob-1.6.0/agents/task/agent/core/result_processing.py +0 -583
- polyrob-1.6.0/agents/task/agent/core/run_loop.py +0 -814
- polyrob-1.6.0/agents/task/agent/core/step_execution.py +0 -467
- polyrob-1.6.0/agents/task/agent/core/user_ingress.py +0 -436
- polyrob-1.6.0/agents/task/agent/messages/builders.py +0 -344
- polyrob-1.6.0/agents/task/agent/messages/filters.py +0 -620
- polyrob-1.6.0/agents/task/agent/messages/persistence.py +0 -519
- polyrob-1.6.0/agents/task/agent/messages/retrieval.py +0 -713
- polyrob-1.6.0/agents/task/agent/orchestrator.py +0 -924
- polyrob-1.6.0/agents/task/agent/prompts.py +0 -1062
- polyrob-1.6.0/agents/task/goals/board.py +0 -1213
- polyrob-1.6.0/agents/task/goals/board_deps.py +0 -261
- polyrob-1.6.0/agents/task/goals/goal_run.py +0 -1007
- polyrob-1.6.0/agents/task/goals/rail_answers.py +0 -245
- polyrob-1.6.0/agents/task/session/cleanup.py +0 -859
- polyrob-1.6.0/agents/task/task_agent_delivery.py +0 -1098
- polyrob-1.6.0/agents/task/task_agent_support.py +0 -262
- polyrob-1.6.0/agents/task/telemetry/service_detect.py +0 -47
- polyrob-1.6.0/agents/task_agent_lite.py +0 -978
- polyrob-1.6.0/api/a2a/agent_card.py +0 -347
- polyrob-1.6.0/api/admin_endpoints.py +0 -1489
- polyrob-1.6.0/api/auth_endpoints.py +0 -478
- polyrob-1.6.0/api/mcp_models.py +0 -282
- polyrob-1.6.0/api/openai_compat/router.py +0 -316
- polyrob-1.6.0/api/payment_endpoints.py +0 -430
- polyrob-1.6.0/api/task_http_api.py +0 -1876
- polyrob-1.6.0/cli/commands/chat.py +0 -1111
- polyrob-1.6.0/cli/commands/config.py +0 -749
- polyrob-1.6.0/cli/commands/doctor.py +0 -1476
- polyrob-1.6.0/cli/commands/identity.py +0 -126
- polyrob-1.6.0/cli/commands/init.py +0 -675
- polyrob-1.6.0/cli/commands/keys.py +0 -220
- polyrob-1.6.0/cli/commands/model.py +0 -193
- polyrob-1.6.0/cli/commands/run.py +0 -547
- polyrob-1.6.0/cli/commands/service.py +0 -629
- polyrob-1.6.0/cli/commands/wallet.py +0 -1838
- polyrob-1.6.0/cli/commands/wallet_lp.py +0 -120
- polyrob-1.6.0/cli/config_store.py +0 -321
- polyrob-1.6.0/cli/keys.py +0 -103
- polyrob-1.6.0/cli/ui/commands/h_config.py +0 -366
- polyrob-1.6.0/cli/ui/commands/h_inbox.py +0 -136
- polyrob-1.6.0/cli/ui/commands/h_mcp.py +0 -242
- polyrob-1.6.0/cli/ui/commands/h_money_verbs.py +0 -155
- polyrob-1.6.0/cli/ui/commands/handlers.py +0 -1765
- polyrob-1.6.0/cli/ui/model_selector.py +0 -532
- polyrob-1.6.0/config/.env.development.template +0 -291
- polyrob-1.6.0/core/CHANGELOG.md +0 -2022
- polyrob-1.6.0/core/cli_tool_tables.py +0 -104
- polyrob-1.6.0/core/config.py +0 -745
- polyrob-1.6.0/core/config_policy/profiles.py +0 -191
- polyrob-1.6.0/core/config_policy/rigs.py +0 -166
- polyrob-1.6.0/core/config_policy/spend_lane.py +0 -403
- polyrob-1.6.0/core/config_service.py +0 -867
- polyrob-1.6.0/core/constants.py +0 -126
- polyrob-1.6.0/core/copy/en.py +0 -86
- polyrob-1.6.0/core/cron_lanes.py +0 -304
- polyrob-1.6.0/core/db_manifest.py +0 -258
- polyrob-1.6.0/core/event_kinds.py +0 -250
- polyrob-1.6.0/core/event_log.py +0 -432
- polyrob-1.6.0/core/flags_catalog.py +0 -1396
- polyrob-1.6.0/core/goal_vocab.py +0 -61
- polyrob-1.6.0/core/lazy_closures/docs.docx.txt +0 -187
- polyrob-1.6.0/core/lazy_closures/docs.pdf.txt +0 -7
- polyrob-1.6.0/core/lazy_closures/media.gif.txt +0 -235
- polyrob-1.6.0/core/lazy_closures/media.qr.txt +0 -10
- polyrob-1.6.0/core/lazy_closures/memory.vector.txt +0 -232
- polyrob-1.6.0/core/lazy_closures/provider.anthropic.txt +0 -296
- polyrob-1.6.0/core/lazy_closures/provider.gemini.txt +0 -594
- polyrob-1.6.0/core/lazy_closures/server.api.txt +0 -1720
- polyrob-1.6.0/core/lazy_closures/surface.telegram.txt +0 -904
- polyrob-1.6.0/core/lazy_closures/tool.anysite.txt +0 -340
- polyrob-1.6.0/core/lazy_closures/voice.transcribe.txt +0 -402
- polyrob-1.6.0/core/lifecycle.py +0 -705
- polyrob-1.6.0/core/mcp_admin.py +0 -206
- polyrob-1.6.0/core/money/authorize.py +0 -239
- polyrob-1.6.0/core/money/hooks.py +0 -157
- polyrob-1.6.0/core/money/limits.py +0 -183
- polyrob-1.6.0/core/money_verbs.py +0 -108
- polyrob-1.6.0/core/open_positions.py +0 -837
- polyrob-1.6.0/core/packs/loader.py +0 -637
- polyrob-1.6.0/core/runtime_config.py +0 -336
- polyrob-1.6.0/core/self_context_writer.py +0 -672
- polyrob-1.6.0/core/self_evolution.py +0 -1001
- polyrob-1.6.0/core/signer/protocol.py +0 -265
- polyrob-1.6.0/core/signer/remote.py +0 -297
- polyrob-1.6.0/core/signer/server.py +0 -920
- polyrob-1.6.0/core/signer/shadow.py +0 -262
- polyrob-1.6.0/core/signer/store.py +0 -204
- polyrob-1.6.0/core/status_money.py +0 -517
- polyrob-1.6.0/core/status_render.py +0 -372
- polyrob-1.6.0/core/status_sections.py +0 -146
- polyrob-1.6.0/core/status_snapshot.py +0 -281
- polyrob-1.6.0/core/status_types.py +0 -175
- polyrob-1.6.0/core/surfaces/cards.py +0 -1319
- polyrob-1.6.0/core/surfaces/group_admin.py +0 -378
- polyrob-1.6.0/core/surfaces/message_router.py +0 -628
- polyrob-1.6.0/core/surfaces/owner_intent.py +0 -69
- polyrob-1.6.0/core/surfaces/owner_thread.py +0 -747
- polyrob-1.6.0/core/surfaces/room_actions.py +0 -1134
- polyrob-1.6.0/core/surfaces/room_label.py +0 -91
- polyrob-1.6.0/core/surfaces/turn_reply.py +0 -121
- polyrob-1.6.0/core/token_check_hook.py +0 -32
- polyrob-1.6.0/core/tool_capabilities.py +0 -538
- polyrob-1.6.0/core/tool_catalog.py +0 -230
- polyrob-1.6.0/core/tool_gates.py +0 -177
- polyrob-1.6.0/core/verb_policy_rows.py +0 -614
- polyrob-1.6.0/core/verbs.py +0 -564
- polyrob-1.6.0/core/wallet/__init__.py +0 -46
- polyrob-1.6.0/core/wallet/buy_target.py +0 -321
- polyrob-1.6.0/core/wallet/token_pins.py +0 -410
- polyrob-1.6.0/core/wallet/token_provenance.py +0 -302
- polyrob-1.6.0/core/wallet/token_trust.py +0 -450
- polyrob-1.6.0/core/wallet/tx_guard_steps/turn.py +0 -223
- polyrob-1.6.0/cron/digest.py +0 -341
- polyrob-1.6.0/cron/jobs.py +0 -521
- polyrob-1.6.0/cron/read_job.py +0 -490
- polyrob-1.6.0/cron/runner.py +0 -857
- polyrob-1.6.0/cron/service.py +0 -478
- polyrob-1.6.0/data/prompts/skills/dca/SKILL.md +0 -87
- polyrob-1.6.0/data/prompts/skills/defi-bridge/SKILL.md +0 -121
- polyrob-1.6.0/data/prompts/skills/defi-liquidity/SKILL.md +0 -64
- polyrob-1.6.0/data/prompts/skills/exits/SKILL.md +0 -122
- polyrob-1.6.0/data/prompts/skills/memecoin-scouting/SKILL.md +0 -244
- polyrob-1.6.0/data/prompts/skills/polyrob-user-guide/references/configuration.md +0 -693
- polyrob-1.6.0/data/prompts/skills/polyrob-user-guide/references/surfaces.md +0 -125
- polyrob-1.6.0/data/prompts/skills/polyrob-user-guide/references/verbs.md +0 -167
- polyrob-1.6.0/data/prompts/skills/position-journal/SKILL.md +0 -80
- polyrob-1.6.0/data/prompts/skills/robinhood-chain/SKILL.md +0 -109
- polyrob-1.6.0/data/prompts/skills/self-deploy/SKILL.md +0 -175
- polyrob-1.6.0/data/prompts/skills/sizing-and-risk/SKILL.md +0 -102
- polyrob-1.6.0/data/prompts/skills/token-identity/SKILL.md +0 -158
- polyrob-1.6.0/data/prompts/skills/token-launch/SKILL.md +0 -177
- polyrob-1.6.0/data/prompts/skills/trade-execution/SKILL.md +0 -114
- polyrob-1.6.0/data/prompts/skills/treasury-trading/SKILL.md +0 -351
- polyrob-1.6.0/data/prompts/skills/treasury-trading/references/executing.md +0 -31
- polyrob-1.6.0/data/prompts/skills/verified-tooling/SKILL.md +0 -62
- polyrob-1.6.0/data/prompts/system/mcp_tools.md +0 -50
- polyrob-1.6.0/docs/CONFIGURATION.md +0 -1387
- polyrob-1.6.0/docs/guide/api.md +0 -670
- polyrob-1.6.0/docs/guide/architecture.md +0 -248
- polyrob-1.6.0/docs/guide/cli.md +0 -911
- polyrob-1.6.0/docs/guide/configuration.md +0 -828
- polyrob-1.6.0/docs/guide/console.md +0 -206
- polyrob-1.6.0/docs/guide/conversation.md +0 -64
- polyrob-1.6.0/docs/guide/deployment-postures.md +0 -347
- polyrob-1.6.0/docs/guide/feishu-dingtalk.md +0 -109
- polyrob-1.6.0/docs/guide/getting-started.md +0 -434
- polyrob-1.6.0/docs/guide/groups.md +0 -611
- polyrob-1.6.0/docs/guide/instances.md +0 -250
- polyrob-1.6.0/docs/guide/migration/from-hermes.md +0 -224
- polyrob-1.6.0/docs/guide/migration/from-openclaw.md +0 -228
- polyrob-1.6.0/docs/guide/operate-the-service.md +0 -126
- polyrob-1.6.0/docs/guide/owner-controls.md +0 -395
- polyrob-1.6.0/docs/guide/packs.md +0 -174
- polyrob-1.6.0/docs/guide/payments.md +0 -1590
- polyrob-1.6.0/docs/guide/profiles.md +0 -182
- polyrob-1.6.0/docs/guide/security-model.md +0 -619
- polyrob-1.6.0/docs/guide/self-hosting.md +0 -487
- polyrob-1.6.0/docs/guide/skills.md +0 -375
- polyrob-1.6.0/docs/guide/streams.md +0 -241
- polyrob-1.6.0/docs/guide/upgrading.md +0 -261
- polyrob-1.6.0/docs/guide/x-twitter.md +0 -173
- polyrob-1.6.0/migrations/README.md +0 -397
- polyrob-1.6.0/migrations/version_manager.py +0 -241
- polyrob-1.6.0/modules/auth/api_key_manager.py +0 -177
- polyrob-1.6.0/modules/auth/identity_mapper.py +0 -220
- polyrob-1.6.0/modules/auth/tier_manager.py +0 -166
- polyrob-1.6.0/modules/cards/cards.py +0 -396
- polyrob-1.6.0/modules/database/user_profiles.py +0 -522
- polyrob-1.6.0/modules/llm/__init__.py +0 -96
- polyrob-1.6.0/modules/llm/adapters.py +0 -1138
- polyrob-1.6.0/modules/llm/available_models.py +0 -109
- polyrob-1.6.0/modules/llm/deepseek_client.py +0 -561
- polyrob-1.6.0/modules/llm/llm_client_registry.py +0 -291
- polyrob-1.6.0/modules/llm/llm_factory.py +0 -300
- polyrob-1.6.0/modules/llm/llm_manager.py +0 -858
- polyrob-1.6.0/modules/llm/model_catalog.py +0 -1591
- polyrob-1.6.0/modules/llm/model_registry.py +0 -427
- polyrob-1.6.0/modules/llm/openrouter_reasoning.py +0 -110
- polyrob-1.6.0/modules/llm/profiles.py +0 -607
- polyrob-1.6.0/modules/llm/provider_spec.py +0 -1316
- polyrob-1.6.0/modules/memory/models.py +0 -183
- polyrob-1.6.0/modules/memory/recall_rank.py +0 -98
- polyrob-1.6.0/modules/x402/invoice_jitter.py +0 -358
- polyrob-1.6.0/packs/x/polyrob_x/cron_delivery.py +0 -67
- polyrob-1.6.0/packs/x/polyrob_x/skills/x-engagement/SKILL.md +0 -154
- polyrob-1.6.0/packs/x/polyrob_x/twitter_tool.py +0 -2824
- polyrob-1.6.0/polyrob/app/autonomy_runtime.py +0 -1286
- polyrob-1.6.0/polyrob/app/bootstrap.py +0 -820
- polyrob-1.6.0/polyrob/app/initialization.py +0 -993
- polyrob-1.6.0/polyrob.egg-info/PKG-INFO +0 -637
- polyrob-1.6.0/polyrob.egg-info/SOURCES.txt +0 -1870
- polyrob-1.6.0/polyrob.egg-info/requires.txt +0 -121
- polyrob-1.6.0/pyproject.toml +0 -180
- polyrob-1.6.0/requirements.lock +0 -5357
- polyrob-1.6.0/surfaces/telegram/admin_verbs.py +0 -440
- polyrob-1.6.0/surfaces/telegram/harness.py +0 -2911
- polyrob-1.6.0/surfaces/telegram/identity_ops.py +0 -175
- polyrob-1.6.0/surfaces/telegram/lifecycle_ops.py +0 -182
- polyrob-1.6.0/surfaces/telegram/nft_ops.py +0 -262
- polyrob-1.6.0/surfaces/telegram/owner_ops.py +0 -1037
- polyrob-1.6.0/surfaces/telegram/prefs_ops.py +0 -256
- polyrob-1.6.0/surfaces/telegram/token_ops.py +0 -317
- polyrob-1.6.0/tests/test_board_create_grant_ratchet.py +0 -75
- polyrob-1.6.0/tests/test_effect_classification_ratchet.py +0 -327
- polyrob-1.6.0/tests/test_file_size_ratchet.py +0 -222
- polyrob-1.6.0/tests/test_flag_count_ratchet.py +0 -80
- polyrob-1.6.0/tests/test_prompt_surface_golden.py +0 -116
- polyrob-1.6.0/tests/test_room_safety_ratchet.py +0 -205
- polyrob-1.6.0/tests/test_status_silence_ratchet.py +0 -151
- polyrob-1.6.0/tools/README.md +0 -575
- polyrob-1.6.0/tools/__init__.py +0 -406
- polyrob-1.6.0/tools/agent_nft/tool.py +0 -433
- polyrob-1.6.0/tools/agent_nft/view.py +0 -343
- polyrob-1.6.0/tools/agent_nft/withdraw.py +0 -211
- polyrob-1.6.0/tools/alchemy/__init__.py +0 -5
- polyrob-1.6.0/tools/alchemy/alchemy_tool.py +0 -393
- polyrob-1.6.0/tools/base_tool.py +0 -526
- polyrob-1.6.0/tools/code_exec/tool.py +0 -380
- polyrob-1.6.0/tools/collabland/__init__.py +0 -5
- polyrob-1.6.0/tools/collabland/collabland_tool.py +0 -436
- polyrob-1.6.0/tools/controller/action_registration.py +0 -1831
- polyrob-1.6.0/tools/controller/agent_status_action.py +0 -251
- polyrob-1.6.0/tools/controller/approval_queue.py +0 -1442
- polyrob-1.6.0/tools/controller/delegation.py +0 -208
- polyrob-1.6.0/tools/controller/execution.py +0 -1002
- polyrob-1.6.0/tools/controller/introspection.py +0 -322
- polyrob-1.6.0/tools/controller/mcp_gate.py +0 -47
- polyrob-1.6.0/tools/controller/mcp_registrar.py +0 -256
- polyrob-1.6.0/tools/controller/send_message_route.py +0 -129
- polyrob-1.6.0/tools/controller/service.py +0 -403
- polyrob-1.6.0/tools/controller/tool_management.py +0 -475
- polyrob-1.6.0/tools/cronjob_tools.py +0 -731
- polyrob-1.6.0/tools/dapp_browser/bridge.py +0 -799
- polyrob-1.6.0/tools/dapp_browser/tool.py +0 -452
- polyrob-1.6.0/tools/defi/book.py +0 -373
- polyrob-1.6.0/tools/defi/buy_screen.py +0 -104
- polyrob-1.6.0/tools/defi/data_holdings.py +0 -540
- polyrob-1.6.0/tools/defi/data_params.py +0 -171
- polyrob-1.6.0/tools/defi/data_reconcile.py +0 -273
- polyrob-1.6.0/tools/defi/data_render.py +0 -788
- polyrob-1.6.0/tools/defi/data_tool.py +0 -1331
- polyrob-1.6.0/tools/defi/identity_gate.py +0 -398
- polyrob-1.6.0/tools/defi/lp_v4.py +0 -291
- polyrob-1.6.0/tools/defi/positions_view.py +0 -280
- polyrob-1.6.0/tools/defi/providers/alchemy_index.py +0 -170
- polyrob-1.6.0/tools/defi/providers/base.py +0 -179
- polyrob-1.6.0/tools/defi/providers/geckoterminal.py +0 -699
- polyrob-1.6.0/tools/defi/providers/goplus.py +0 -474
- polyrob-1.6.0/tools/defi/providers/token_audits.py +0 -233
- polyrob-1.6.0/tools/defi/reconcile.py +0 -379
- polyrob-1.6.0/tools/defi/solana_swap_verb.py +0 -783
- polyrob-1.6.0/tools/defi/swap_verb.py +0 -370
- polyrob-1.6.0/tools/defi/token_screen.py +0 -974
- polyrob-1.6.0/tools/defi/trade_params.py +0 -409
- polyrob-1.6.0/tools/defi/trade_tool.py +0 -1376
- polyrob-1.6.0/tools/defi/wallet_intel.py +0 -308
- polyrob-1.6.0/tools/descriptors.py +0 -384
- polyrob-1.6.0/tools/intel/cache.py +0 -90
- polyrob-1.6.0/tools/mcp/README.md +0 -48
- polyrob-1.6.0/tools/mcp/config.py +0 -357
- polyrob-1.6.0/tools/mcp/mcp_tool.py +0 -1456
- polyrob-1.6.0/tools/mcp/protocol.py +0 -1693
- polyrob-1.6.0/tools/mcp/user_mcp_service.py +0 -954
- polyrob-1.6.0/tools/shell/process_tool.py +0 -373
- polyrob-1.6.0/tools/shell/tool.py +0 -466
- polyrob-1.6.0/tools/tool_disclosure.py +0 -469
- polyrob-1.6.0/tools/web_fetch/fetcher.py +0 -159
- polyrob-1.6.0/webview/contributions.py +0 -64
- polyrob-1.6.0/webview/copy/en.py +0 -1356
- polyrob-1.6.0/webview/pages_new.py +0 -1827
- polyrob-1.6.0/webview/static/app/app.css +0 -593
- polyrob-1.6.0/webview/static/app/verbs.en.json +0 -430
- polyrob-1.6.0/webview/static/app/work-create.js +0 -91
- polyrob-1.6.0/webview/static/app/work-now.js +0 -661
- polyrob-1.6.0/webview/static/css/pages/admin.css +0 -766
- polyrob-1.6.0/webview/static/js/admin/user_detail.js +0 -391
- polyrob-1.6.0/webview/static/js/admin/users.js +0 -162
- polyrob-1.6.0/webview/templates/admin/user_detail.html +0 -224
- polyrob-1.6.0/webview/templates/admin/users.html +0 -105
- polyrob-1.6.0/webview/templates/work.html +0 -288
- {polyrob-1.6.0 → polyrob-1.7.0}/LICENSE +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/MANIFEST.in +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/base_agent.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/character.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/character_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/characters/polyrob.character.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/persona_render.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/persona_resolver.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/prompt/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/README_PATH_MANAGEMENT.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/agent_state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/async_delegation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/autonomy_state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/background_review.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/budget_notice.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/call_quality.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/chat_regime.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/construction_helpers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/correspondent_gate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/curator.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/env_context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/error_recovery.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/exhaustion_summary.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/history_io.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/live_health.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/llm_runner.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/logging_io.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/loop_detection.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/memory_prefetch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/memory_writer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/metering_failure_log.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/model_introspection.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/model_swap.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/output_truncation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/output_validation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/owner_thread_inject.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/project_context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/resources.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/result_budget.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/result_offload.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/run_budget.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/run_state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/runtime_catalog.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/safety_lifecycle.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/self_wake.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/session_control.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/session_metadata.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/step.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/step_telemetry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/timeout_reroute.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/token_budget.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/tool_availability.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/untrusted_render.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/hitl_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/log_sanitize.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/tool_call_builder.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/tool_message_repair.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/compactor.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/context_references.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/foundation_layers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/foundation_replay.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/guidance.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/sqlite_persistence.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/token_counter.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/profile_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/profile_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/profile_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/prompt_memory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/session.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/skill_allowed_tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/skill_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/sub_agent_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/tool_call_tracker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/billed_request.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/constants.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/conversation_resume.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/gif_utils.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/board_asks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/board_types.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/claim_liveness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/completion_judge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/deliverables.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/dispatcher.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/escalation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/goal_tool_gates.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/group_service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/memory_scope.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/preflight.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/knowledge_export.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/logging_config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/browser_views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/controller_types.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/dom_history_service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/dom_history_view.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/dom_views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/execution_context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/registry_views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/path.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/robust_parse_config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/acceptance_checks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/acceptance_schema.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/edit_verify.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/evidence.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/metering_gate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/run_as_session.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/run_outcome.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/stop_reason.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/browser_pool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/execution.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/feed.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/hitl_ingress.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/hooks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/workspace.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session_class.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session_route.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/sqlite_session_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/task_agent_chat.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/task_agent_control.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/task_agent_lifecycle.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/agent_graph.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/feed_reads.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/formatters.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/live_progress.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/memory_events.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/narrate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/run_activity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/sequence.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/templates.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/tool_defaults.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/utils.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/utils_json.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/utils_webview.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/workspace_context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/TASK_API_DOCS.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/endpoints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/streaming.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/task_handler.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/account_access.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/api_docs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/api_key_auth.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/app.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/auth_constants.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/auth_state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/base_url.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/chat_via_task.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/contributions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/dependencies.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/eip8004_endpoints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/jwt_middleware.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/kb/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/kb/endpoints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_serve/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_serve/handlers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_serve/router.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/middleware.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/money_contributions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/errors.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/model_map.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/pack_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/payment_verification.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/pricing_endpoints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/request_limits.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/server_boot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/session_preflight.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/session_routing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/skill_endpoints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/task_workspace.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/tenant_tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/upload_sniff.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/upload_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/webhooks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/x402_advertisement.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/api/x402_endpoints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/assets/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/assets/brand/polyrob-avatar-512.png +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/assets/brand/polyrob-mark-256.png +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/assets/fonts/dejavu/DejaVuSans-Bold.ttf +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/assets/fonts/dejavu/DejaVuSans.ttf +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/assets/fonts/dejavu/LICENSE +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/_admin_home.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/_doctor_members.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/_flag_warn.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/agent_child_gate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/attachments.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_bootstrap.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_errors.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_grouped.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_lifecycle.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_lifecycle_boot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_options.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_service_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_session_control.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_surface_runner.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/approvals.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/apps.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/auth.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/autonomy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/avatar.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/browser.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/cron.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/dashboard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/datagen.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/discord.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/email.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/finance.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/gateway.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/goals.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/journey.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/kb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/knowledge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/owner.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/owner_memory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/pack.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/persona.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/profile.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/profile_dist.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/profile_transfer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/serve.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/session.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/signal.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/skill_hub.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/skill_install.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/skills.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/slack.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/soul.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/subagents.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/surfaces.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/telegram.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/todos.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/uninstall.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/update.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/whatsapp.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/workers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/delegation_receipts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/git_child_env.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/gitignore.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/inventory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/persona.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/polyrob.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/profile_review.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/session_paths.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/surfaces_config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/toolset.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/activity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/app.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/approval_prompt.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/autonomy_live.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/autonomy_poll.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/banner.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/blocks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/bootstrap_notice.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/candy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_a23.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_approve.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_attach.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_autonomy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_avatar.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_cards.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_check.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_contributed.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_diag.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_files.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_finance.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_gates.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_goal_one.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_goals_view.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_help.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_holdings.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_job.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_journey.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_kb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_learn.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_lifecycle.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_mode.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_owner.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_owner_reach.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_pending.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_persona.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_prefs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_profile.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_reject.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_rooms.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_run.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_self.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_send.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_skills.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_skills_hub.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_steer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_swap.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_token.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_view_cells.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_workers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/window.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/config_picker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/dialog.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/event_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/event_specs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/events.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/first_run_notice.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/hints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/history.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/identity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/input_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/json_renderer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/lifecycle.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/line_layout.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/literal.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/live_hooks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/log_squelch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/persistent_loop.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/plain_renderer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/renderer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/rich_renderer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/secrets.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/slash_highlight.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/statusbar.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/streaming.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/terminal_title.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/theme.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/agent_state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/detect.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/engine.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/extras.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/packs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/process_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/restore.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/runners.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/snapshot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/versions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/action_names.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/action_receipt.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/activity_class.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/activity_evidence.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/admin_data_home.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/approval.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/egress.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/env_scan.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/fingerprint.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/nginx.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/owner_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/snapshot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/supervisor.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/approval_input.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/approved_actions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/artifacts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/assets.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/async_bridge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/autonomy_control.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/autonomy_marker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/avatar.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/backoff.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/base_component.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/billing_context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/book.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/boot_reconcilers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/bootstrap_marker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/capability_verdict.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/_env.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/autonomy_config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/autonomy_mode.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/autonomy_posture.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/builder_mode.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/capability_toggles.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/compute_posture.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/flag_defaults.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/flag_enums.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/goal_flags.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/live_apply.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/local_profile.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/members.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/memory_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/money_regime.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/payment_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/payment_tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/posture_card.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/retired_flags.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/runtime_gates.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/container.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/container_hardening.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/context_fences.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/contract_writer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/copy/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/copy/_engine.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/copy/glossary.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/credential_verdicts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/credit_sentinel.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/cron_rearm.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/dapp_session_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/data_perms.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/delivery_channels.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/doc_age.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/doc_claims.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/doc_kind.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/effects.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/embedding.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/env.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/env_file.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/error_classifier.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/eval_manifest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/exceptions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/exec_identity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/extras_spec.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/file_lock.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/flags.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/gitignore.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_board_render.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_legibility.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_owner_verbs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_suppressions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/home_migration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/identity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/inference_context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/install_facts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/instance.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/instruction_surfaces.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/interactive_gate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/kb_grammar.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/key_suggest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_closures/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_deps.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_installer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/legacy_data_tree.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/errors.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/base.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/device_code.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/loopback_pkce.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/manual_paste_pkce.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/health.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/inference.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/resolve.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/lock_closure.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/logging.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/maintenance_proposals.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/money/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/money/authority.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/money/classify.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/money/ledger.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/money/regime.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/money/valuation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/optional_extras.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/owner_create.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/owner_doc_writer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/owner_remedy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/index.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/index.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/manifest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/removed.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/retire.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/sdk.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/spec.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/pairing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/path_safety.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/paths.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/payment_config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/payments/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/payments/assets.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/payments/quote.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/prefs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/profiles.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/prompt_manifest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/prompt_text.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/publish.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/rate_limit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/recap.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/remedy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/rules_sweep.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/run_control.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/runtime_paths.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/schedule.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/seams.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/secret_patterns.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/secret_scan.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/secret_scrub.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/secrets.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/agent_child.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/api_keys.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/bip39_english.txt +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/browser_origin.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/browser_rail.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/command_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/confined_read.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/confined_write.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/custody_env.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/document_archive.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/encryption.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/forged_turns.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/host_execution.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/http_probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/internal_events.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/owner_turn.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/pinned_resolver.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/pinned_transport.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/policy_order.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/process_hardening.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/redaction.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/refusals.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/secret_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/secret_material.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/session_tokens.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/settings.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/taints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/threat_report.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/turn_facts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/untrusted_wrap.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/url_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security/workspace_io.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security_digest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security_logging_filter.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/security_speakers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/self_events.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/session_control.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/session_gc.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/session_retention.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/ship_tree.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/sidecar_relocate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/approvals.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/attest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/caps.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/deployed_mode.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/peer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/provision.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/review.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/runtime.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/catalog.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/frontmatter.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/scopes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/sqlite_util.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_custody.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_delivery.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_economics.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_identity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_knowledge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_liquidity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_live.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_loops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_packs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_rails.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_room_actions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_rooms.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_rules.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_session.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/status_work.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/access.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/access_log.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/act.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/actions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/address_key.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/attachments.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/binding.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/bootstrap.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/bot_pair_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/card_groups.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/catalog.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/chat_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/circuit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/command_reply.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/continuity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/conversations.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/correspondents.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/dead_targets.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/deep_link.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/dispatcher.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/envelopes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/error_notices.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/gc.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_allowlist.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_ledger.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_roles.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_turn.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/health.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/idempotency.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbound_attachments.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbound_webhook.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbox.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbox_render.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/ledger_ingest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/llm_outage_notice.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/media.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/media_access.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/missed.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_allowlist.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_dispatcher.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_mirror.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_queue.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_target.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_address.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_admin.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_target.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_turn.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/path_links.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/poll_health.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/proactive.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/progress.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/quiet_hours.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/rendering.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_action_admin.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_action_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_caps.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_focus.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_keys.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/seed.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/send_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/sent_posts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/serialize.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/session_chat_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/session_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/speech_out.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/spill.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/tappable.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/transcription.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/user_delivery.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/voice_echo.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/voice_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/tickers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/token_denylist.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/tool_grants.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/verb_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/version.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wake_queue.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/abi.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/account_journal.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/activity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/address_kind.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/address_lookalike.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/addresses.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/agent_wallet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/audit_sink.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/authority.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/balance_cache.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/bridge_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/bridge_status.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/bridge_watcher.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/broadcast/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/broadcast/evm.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/broadcast/receipt_validation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/chains.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_mint.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_reveal.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_trust.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/config.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/contracts/FixedSupplyToken.sol +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/deploy_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/derivation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/dex_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/erc6551.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/erc8004.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/evm_facts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/factory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/infra_error.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/journal_log.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/jupiter_v6_schema.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/lifi_calldata.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/liquidity_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/nft_account.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/nft_holdings.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/onchain.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/own_addresses.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/public_identity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/relay_svm.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/rpc_response.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/signer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/signer_envelope.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/simulation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_onchain.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_rail.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_signer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_simulation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_strays.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_swap_bounds.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_tx_inspect.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_x402.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/spl_facts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/spl_token.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_journal.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_recovery.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_release.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/token_origin.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/token_template.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tokens.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/trade_index.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/treasury_balance.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/measure.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/shape.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/value.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_notify.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/univ3_math.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/view.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/x402_expiry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/approval_defer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/credential_preflight.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/delivery.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/owner_rules_overlay.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/preflight.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/remedy_streak.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/rig_edit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/room_service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/schedule.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/scheduler.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/wake_gate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/cron/write_job.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/analyst.character.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/coder.character.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/default.character.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/ops.character.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/researcher.character.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/writer.character.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/adversarial-consensus/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/adversarial-consensus/references/round-briefs.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/browser-automation/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/build-failure-triage.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/cleanup-passes.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/debugging-method.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/review-lenses.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/crypto-trading-safety/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/document-writing/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/email-comms/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/file-data-ops/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/get-paid-for-work/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/incident-response/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/incident-response/references/incident-record.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/market-research-brief/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/pay-for-work/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/person-analyzer/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/autonomy.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/money-and-safety.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/setup-interview.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/skills-and-learning.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/wallet-and-identity.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/post-trade-verify/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/pre-trade-check/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/presentation-creator/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/project-analyzer/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/secret-handling/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/skill-authoring/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/skill-security-review/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/stable-cash/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/task-planning/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/treasury-trading/references/chains.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/treasury-trading/references/learning-the-meta.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/treasury-trading/references/nfts.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/web-research/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/x402-pay/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/actions.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/agency.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/communication.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/communication_contract.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/filesystem.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/identity.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/input_format.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/message_shape.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/owner_instructions.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/response_format.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/rules.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/security.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/source_precedence.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/subtask_delegation.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/surface.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/using_your_tools.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/vision.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/web_access.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/data/subscription_channels.json +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/assemble.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/batch_runner.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/bulk_export.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/capture.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/formats.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/record.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/scrub.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/datagen/toolset_distributions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/docs/guide/migration/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/docs/guide/rails-verification.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/boot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/migrate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_0_0_baseline.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_10_0_usage_records_cache_creation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_1_0_user_mcp_servers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_2_0_den_token_bonuses.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_3_0_billing_failures.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_4_0_polymarket_credentials.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_5_0_usage_records_request_id.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_6_0_x402_tx_hash_unique.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_7_0_x402_subscription_pending_unique.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_8_0_x402_tx_hash_case_normalize.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_9_0_x402_payment_asset_columns.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/auth/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/auth/siwe_auth.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/avatar/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/avatar/push.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/base_module.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/cards/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/balance_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/balances.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/cost_utils.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/pricing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/reservations.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/unified_ledger.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/usage_rollup.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/usage_tracker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/audit_log.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/auth_tables.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/connection.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/conversation_contexts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/database_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/user_mcp_servers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/x402_tables.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/contracts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/feedback_replays.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/payment_proof.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/reputation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/validation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/anthropic_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/anthropic_images.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/anthropic_sampling.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/aux_metering.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/billing_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/brain_scrubber.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/cache_hints.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/compat_anthropic.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/compat_clients.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/credit_errors.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/deferred_tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/gemini_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/gemini_parts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/llm_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/manager_inventory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/messages.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/model_catalog_recent.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/model_pricing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/model_types.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/nvidia_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/openai_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/openrouter_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/openrouter_routing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/output_budget.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/prefix_stamp.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/recovery_boundary.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/responses_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/retry_log.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/sdk_caps.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/seat_probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/think_scrubber.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/token_counter.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/usage_extract.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/backend_factory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/cache_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/episodic.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/fts_terms.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/local_vector_memory_provider.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/memory_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/provider.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/recall_consolidation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/retention.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/scope.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_curated_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_episodes_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_kb_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_memory_provider.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_recall.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_scope_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/storage_limits.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/context_retriever.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/hierarchical_memory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/lexical_retriever.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/null_context_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/phase_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/reflection_service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/semantic_retriever.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/task_context_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/threat_scan.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/wikilinks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/deposit_monitor.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/networks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/price_oracle.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/treasury_sweeper.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/wallet_generator.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/migration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/seed.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/skill_usage.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/writer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/transcription/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/transcription/base.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/transcription/faster_whisper_transcriber.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/_db.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/artifact.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/facilitator.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/inbound_receipts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/income_chains.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoice_assets.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoice_sizing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoice_status.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoicing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoicing_note.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/middleware.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/onchain_probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/response_outcome.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_attempt.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_holds.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_notify.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_reputation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_scan.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_subscriptions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_watcher.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/solana_settlement.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/subscriptions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/x402_integration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/daytona/polyrob_daytona/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/daytona/polyrob_daytona/backend.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/daytona/polyrob_daytona/pack.toml +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/anysite/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/anysite/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/anysite/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/pack.toml +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/perplexity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/skills/lead-research/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/skills/web-scraping/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/http_seat.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/api_models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/remote_signing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/store_models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/order_safety.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/order_submission.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/pack.toml +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/api_models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/clob_adapter.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/fees.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/store_models.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/risk_limits.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/hyperliquid-account-review/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/hyperliquid-market-data/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/hyperliquid-trading/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/polymarket-market-research/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/polymarket-portfolio-review/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/polymarket-trading/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/trade_gate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/modal/polyrob_modal/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/modal/polyrob_modal/backend.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/modal/polyrob_modal/pack.toml +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/singularity/polyrob_singularity/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/singularity/polyrob_singularity/backend.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/singularity/polyrob_singularity/pack.toml +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/vercel_sandbox/polyrob_vercel_sandbox/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/vercel_sandbox/polyrob_vercel_sandbox/backend.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/vercel_sandbox/polyrob_vercel_sandbox/pack.toml +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/commands/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/commands/x.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/commands/x_account.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/console_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/dm_watermark.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/gate_reason.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/handle_ids.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/owner_verbs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/pack.toml +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/post_spacing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/skills/social-discovery/SKILL.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/status.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/poller.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/write_budget.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/driver.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/escalation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/session_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/signup.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_chat_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_login_flow.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_oauth2.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/app/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/app/bot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/app/card_wake.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/sdk.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob.egg-info/dependency_links.txt +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob.egg-info/entry_points.txt +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/polyrob.egg-info/top_level.txt +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/setup.cfg +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_actor.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_shared.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/card_builder.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/events.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/stream.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/gateway.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/dedup.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/fetchers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/inbound.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/cards.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/events.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/webhook.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/ws.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/inbox_sources.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/socket_mode.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/actions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/approval_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/apps_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/card_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/check_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/claim_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/contacts_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/dapp_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/dedup.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/dev_rail.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/group_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/history_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/holdings_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/inbound.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/interactive_tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/job_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/kb_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/lp_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/media.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/moderation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/pay_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/poll_backoff.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/poll_batch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/rate_limit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/room_moderator.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/room_turn.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/send_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/skills_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/status_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/swap_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/triggers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/usage_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/voice.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/why_ops.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/harness.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/inbound.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/launch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/probe.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/window.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_a2a_protocol.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_accessibility_snapshot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_autonomy_control_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_base_deps_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_bool_env_parse_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_browser_launch_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_changelog_release.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_collection_roots.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_config_doc_work_item_ids.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_conftest_operator_env_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_constants_shim_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_core_platform_boundary.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_core_server_boundary.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_dynamic_pricing.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_embedder_needed.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_event_kind_contract.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_flag_retirement.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_foundation_order_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_gemini_fixes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_harness_actor_claims_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_history_mutation_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_home_binding_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_import_layering.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_imports_declared.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_instruction_surface_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_knowledge_section_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_layering_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_lazy_embedder.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_limit_single_source_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_llm_timeout_ssot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_mcp_tool_fix.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_numeric_env_parse_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_operator_pin_reader_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_owner_context_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_pack_sdk_facade.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_paid_room_action_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_path_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_private_cleanup_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_provider_registry_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_public_docs_links.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_public_files_present.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_public_release_surface.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_rate_limiter_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_remedy_grammar_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_rename_tail.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_retired_pack_dist_names_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_rule_render_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_runtime_text_names_no_private_file.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_schema_version.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_step_budget_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_supply_format_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_verb_kind_drift_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_verb_policy_literal_ratchet.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_version_consistency.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/adopt.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/core_verbs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/guarded.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/journal_write.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/reveal.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/app_service/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/app_service/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/avatar_sources.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/_flags.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/actions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/browser.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/browser_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/child_env.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/context.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/downloads.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/launch_security.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/nav_schemes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/playwright_utils.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/SANDBOX_SECURITY.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backend.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backend_cache.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/_proc.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/bounded_capture.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/docker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/local_subprocess.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/remote_sandbox.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/ssh.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/egress_proxy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/env_policy.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/kernel.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/limits.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/pack_backends.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/result.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/sandbox_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/tool_rpc.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/edit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/lsp.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/search.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/snapshot.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/textio.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/_helpers.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/approval.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/approval_interactive.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/autonomy_control_action.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/avatar_action.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/card_actions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/command_guard_hook.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/doc_authoring.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/effect_hooks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/emit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/grant_card.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/hooks.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/insights_action.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/message_delete.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/message_send.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/owner_ask_action.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/policy_chain.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/arg_cleanup.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/schema_generators.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/schema_sanitizer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/room_moderate_action.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/room_read_action.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/self_transfer.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/skill_manage.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_call_bridge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_error_class.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_load_report.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_search_actions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/turn_origin.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/wallet_authority.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/worker_manage_action.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/credential_cache.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/dapp_browser/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/dapp_browser/js.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/dapp_browser/registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/account_mode.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/agent_registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/approve_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_evm_leg.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_price.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_token_origin.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/call_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/data_chain_reads.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/data_lp.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/data_quote.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/deploy_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_abi.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_reads.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_receipts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_v4_verbs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_valuation.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_verbs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/nft_verbs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/payment_quote.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/pool_metrics.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/pool_screen.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/price_sources.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/_http.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/dexscreener.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/jupiter.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/jupiter_price.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/relay_bridge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/routes/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/routes/lifi.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/routes/univ3_route.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/univ3.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/receipt_wait.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/refusal_repeat.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/send_order.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/signer_entry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/solana_rail_adapters.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/solana_send_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/spl_deploy_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/token_identity_ask.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/transfer_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/wrap_verb.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/document_parser.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/document_worker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/dom/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/dom/buildDomTree.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/dom/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_mailbox.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_providers/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_providers/agentmail.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_providers/mime.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/exceptions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem_doc_kind.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem_docproc.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem_pdf.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/git/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/git/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/github/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/github/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/github/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/goal_tools.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/broker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/digest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/reconcile.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/intel/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/intel/model.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/intel/price.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/kb_autoingest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/knowledge_ingest.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/knowledge_inventory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/late_tool_mode.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/execute.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/pons.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/pons_abi.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/provenance.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/registration.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/catalog.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/child_env.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/oauth_bridge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/param_coercion.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/rate_limit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/security.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/self_install.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/server_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/subscriptions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/validation_tracker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/views.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/file_store.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/provider.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/providers/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/providers/generic_oauth2.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/publish/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/publish/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/rails/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/rails/verification.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/self_env/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/self_env/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/backend_pool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/discipline.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/executor.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/executor_protocol.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/host_executor.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/jobs.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/loopback_allow.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/output.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/process_registry.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/receipts.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/remote_executor.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/state.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/sudo.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/watch.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/ship_common.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/task_tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/tool_search.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/user_directory.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/wallet_holder.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/web_fetch/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/web_fetch/render.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/web_fetch/tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/discovery.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/invoice_tool.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/net_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/notifications.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/real_client.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/spend_gate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/README.md +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/auth_utils.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/bounded_collections.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/circuit_breaker.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/path_validator.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/rate_limit_manager.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/result_size.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/utils/time_utils.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/activity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/apps_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/artifacts_api.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/audit.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/cards_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/chat_open.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/config_view.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/console_commands.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/copy/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/cors.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/emit_api.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/error_page.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/feed_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/host_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/inbox.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/job_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/knowledge.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/login_limits.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/owner_auth.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/owner_login_flow.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/pack_console.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/pages.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/posture_guard.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/posture_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/repair_sessions.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/serve_tokens.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/server.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/server_launcher.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/session_access.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/session_catalog.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/session_identity.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/socket_auth.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/socket_limits.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/agent.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/cards.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/chat-open.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/chats.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/file-attach.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/format.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/http.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/inbox.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/live.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/money-move.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/money-tokens.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/money.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/palette.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/pause.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/settings-control.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/socket-client.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/transcript.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/work-apps.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/worklog.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/workpane.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/components.css +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/fonts.css +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/pages/signin.css +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/style.css +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/variables.css +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/webgate.css +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/JetBrainsMono-Medium.woff2 +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/JetBrainsMono-Regular.woff2 +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/LICENSE-JetBrainsMono +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/LICENSE-VT323 +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/VT323-Regular.woff2 +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/img/favicon.ico +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/admin/activity.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/admin/dashboard.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/admin/utils.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/constants.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/error-handler.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/error-page.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/ethers.min.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/signin.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/socket.io.min.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/status-uptime.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/theme.js +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/stats_service.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/template_globals.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/__init__.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/admin/activity.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/admin/dashboard.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/agent.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/chat.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/error.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/inbox.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/layout.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/money.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/owner_login.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/shell.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/signin.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/status.html +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/theme.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/tokens_routes.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/wallet_reader.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/webgate.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/worklog_api.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/workspace_paths.py +0 -0
- {polyrob-1.6.0 → polyrob-1.7.0}/webview/workspace_routes.py +0 -0
|
@@ -0,0 +1,2094 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to POLYROB are documented here. The format is based on
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/), and this project adheres to
|
|
5
|
+
[Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
This is the full technical record. Entries use only the six Keep a Changelog
|
|
8
|
+
headings and describe shipped behavior; the rules are in `RELEASING.md`. The
|
|
9
|
+
short, user-facing notes for each release are on its GitHub Release page.
|
|
10
|
+
|
|
11
|
+
## [Unreleased]
|
|
12
|
+
|
|
13
|
+
## [1.7.0] — 2026-10-29
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- Operational self-awareness: `agent_status(tool=)` says why a tool is missing, who fixes it and when;
|
|
18
|
+
`propose_setting` gives the owner a one-tap fix card; `http_request` writes JSON over HTTP; `/update now`
|
|
19
|
+
skips the owner-quiet wait.
|
|
20
|
+
- Console Work › Goals: a goal board with one lane per live status, the open decisions, dependencies, sub-goals,
|
|
21
|
+
cost against the run limit and a detail with runs and history; actions use the existing goal verbs and the
|
|
22
|
+
Inbox decider; the goal form takes `depends_on`.
|
|
23
|
+
- `wallet_sign`: the agent signs a site's login or challenge text (EIP-191, SIWE, SIWS) once a classifier, re-run
|
|
24
|
+
in the signer, binds it to the site; permits, orders and blind bytes refuse; site keys are stored encrypted.
|
|
25
|
+
- Trading mandate: one owner card (`/trade start`) starts a hunt, a daily review and an exit job per position;
|
|
26
|
+
code arms and cancels exits, $0 prechecks watch, entry-only breakers latch, `/trade status|pause|stop|release`.
|
|
27
|
+
- Discovery reads say ok / empty / unavailable, and `token_info` carries survivability fields with a tier ceiling
|
|
28
|
+
(missing is unknown, one tier lower); `/book retire` and `defi_data.retire_row` close a measured zero or dust row.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- Operator MCP servers belong in `~/.polyrob/mcp.json`; `config/mcp_config.json` ships defaults only, and a
|
|
33
|
+
deployed tree copies its servers there once at startup.
|
|
34
|
+
- DeepSeek is a native provider: a `DEEPSEEK_API_KEY` alone runs the agent on DeepSeek's own API (`deepseek-flash`,
|
|
35
|
+
`deepseek-v4-pro`) with tool calls, thinking-mode reasoning replay, cache hits and the peak-hour price; the
|
|
36
|
+
bespoke client, its adapter and the old same-role message merge are removed.
|
|
37
|
+
- No default chain: every `defi_trade`, `defi_data`, `dapp_browser` and `agent_nft` verb requires `chain`, the wallet,
|
|
38
|
+
identity and LP CLI commands require `--chain`, and `/nft`, `/identity` and `/deploy` require `on <chain>`.
|
|
39
|
+
- A trading-mandate entry costs at most its promotion stage's ticket ($1 probe, then half, then full) and needs an
|
|
40
|
+
exit plan before any quote; the status snapshot and the digest gain a $0 Trading block (positions, exit coverage,
|
|
41
|
+
breaker, realized P&L with close reasons, LLM cost).
|
|
42
|
+
- After a chat turn's first reply-only step the agent is told the reply was delivered (finish with `done()` or keep
|
|
43
|
+
working), so it stops repeating a reply in the extra step the conversational-exit allowance grants.
|
|
44
|
+
- Solana swaps write the position book, a major↔stable swap books P&L, one $1 dust line is shared, and the
|
|
45
|
+
`exits`, `treasury-trading`, `sizing-and-risk` and `position-journal` skills lose their job templates and ledger text.
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- The agent gets the true cause: a tool that cannot run is gated with its remedy, `load_tool` returns the
|
|
50
|
+
recorded reason, the retry wall quotes the last error and resets per owner turn; `/mcp add` works.
|
|
51
|
+
- `wallet_sign`: one call fetches (POST/GET), signs and submits with the challenge's cookie; an unsent signature
|
|
52
|
+
says so and a second one refuses; SIWE without expiry, nonce-only sites, sibling hosts and disclaimers sign.
|
|
53
|
+
- `cronjob_edit` no longer reports a value the job already has as an edit: a call that changes nothing now refuses
|
|
54
|
+
with the way to add task text (old_text and new_text), so an agent cannot loop on a no-op "Edited cron job".
|
|
55
|
+
|
|
56
|
+
- `twitter_get_mentions` returns each mention's `author_id` and `author_username`; without them the model guessed
|
|
57
|
+
an author and tagged the wrong account in a reply.
|
|
58
|
+
- `wallet_holdings`, `wallet_activity` and `token_origin` list `chain` as required in the schema the model sees (a 0x address
|
|
59
|
+
needs it), so a model stops omitting it; in-process calls for base58 addresses are unchanged.
|
|
60
|
+
- The controller's retry key treats an omitted argument, an explicit `None` and stray whitespace as the same call, and the
|
|
61
|
+
retry-wall refusal carries a `retry_wall` flag instead of being recognised by its wording.
|
|
62
|
+
- A step made only of "Maximum retries exceeded" refusals now counts as a failed step, so a run that keeps re-asking for a
|
|
63
|
+
dead operation stops after `max_failures` such steps instead of burning its whole step budget.
|
|
64
|
+
- `defi_data wallet_holdings` on a 0x address with no chain now answers with a ready-to-copy call naming a chain, so a
|
|
65
|
+
model stops repeating the chain-less call that cost a 150-step run.
|
|
66
|
+
- A short `message` caption no longer hides an earlier `send_message` text from the repeat-reply guard: the guard now
|
|
67
|
+
checks every text the turn spoke, so the owner stops receiving the same reply twice.
|
|
68
|
+
- The CLI no longer stops with `PermissionError` when it runs from a directory its user cannot read (the retired
|
|
69
|
+
key-backfill hint stats a relative `config/.env.*`).
|
|
70
|
+
- Every X tweet read carries `reposts_and_quotes` (retweets + quotes, the figure X's app shows as reposts), so a
|
|
71
|
+
repost goal no longer reads the retweet count alone and keeps pushing a target it has already met.
|
|
72
|
+
|
|
73
|
+
### Removed
|
|
74
|
+
|
|
75
|
+
- `polyrob service status` no longer checks the systemd unit for the pre-1.4.0 `RestartForceExitStatus=75` hint.
|
|
76
|
+
- The NFT `holder` tier and its token gate: the Collab.Land and Alchemy check tools, admin `verify-token`,
|
|
77
|
+
the `den_token_count` and `requires_den_token` API fields, and six flags. A `holder` row migrates to `free_access`.
|
|
78
|
+
- The one-goal `/trade` verb: `/trade` now opens and runs the trading mandate.
|
|
79
|
+
|
|
80
|
+
### Security
|
|
81
|
+
|
|
82
|
+
- Dependency floors for new advisories: `certifi>=2026.10.19`, `pillow>=13.0.0`, `pypdf>=6.21.2`; the lock also
|
|
83
|
+
takes the fixed `filelock`, `msgpack`, `opentelemetry-api` and `setuptools`.
|
|
84
|
+
|
|
85
|
+
## [1.6.0] — 2026-10-20
|
|
86
|
+
|
|
87
|
+
### Added
|
|
88
|
+
|
|
89
|
+
- The agent continues by itself once the owner has decided every card it raised: one wake per card group with each
|
|
90
|
+
card's outcome; a quote, extra-check or recovery card stays in the group; a failed confirm offers its extra check as
|
|
91
|
+
a card, and Refresh works on an expired quote.
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
|
|
95
|
+
- Goal, cron, delegated and worker runs stop at one operator step cap, `AUTONOMOUS_MAX_STEPS` (150), and at
|
|
96
|
+
`AUTONOMOUS_RUN_BUDGET_USD` ($2.00) of spend, sub-agents included; at the cap they report once, and a run that stops
|
|
97
|
+
before `done()` names why in its record, the CLI and the session status.
|
|
98
|
+
|
|
99
|
+
### Fixed
|
|
100
|
+
|
|
101
|
+
- The interactive-terminal log formatter interpolates %-style arguments instead of printing a literal `%s`.
|
|
102
|
+
- The money simulation no longer runs a built transaction at its placeholder 120k gas limit: every aggregator swap
|
|
103
|
+
ran out of gas in simulation ("execution reverted", data 0x) and was refused.
|
|
104
|
+
- The owner-thread delta keeps the newest rows and names the rest; the owner's commands, card taps and their results
|
|
105
|
+
no longer read as the agent's own or an autonomous run's; a pinned stablecoin keeps its peg when one source is
|
|
106
|
+
outvoted.
|
|
107
|
+
|
|
108
|
+
### Removed
|
|
109
|
+
|
|
110
|
+
- The `max_steps` argument of `goal_create`, `delegate_task` and `worker_manage`, the console goal form's step field,
|
|
111
|
+
`polyrob workers new/edit --max-steps`, `polyrob cron edit --max-steps` and the `GOAL_DEFAULT_MAX_STEPS` flag.
|
|
112
|
+
|
|
113
|
+
### Security
|
|
114
|
+
|
|
115
|
+
- `aiohttp` is raised to 3.14.4 or later (locked 3.14.5) for the keepalive-timeout, unbounded-memory and Secure-cookie
|
|
116
|
+
advisories.
|
|
117
|
+
- A payout-shaped call or endowed deploy needs the owner tap on every lane, a seed in a readable `.env` refuses host
|
|
118
|
+
code runs, owner money jobs need a card, and x402 books the signed amount.
|
|
119
|
+
|
|
120
|
+
## [1.5.0] — 2026-10-18
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
|
|
124
|
+
- `polyrob job edit --tools a,b,c` sets a job's explicit toolset (`payload.tools`, `none` clears it), validated against the
|
|
125
|
+
core and first-party pack tool ids, so a posting job can be kept off the spending tools.
|
|
126
|
+
- A cron job or goal write that pins an unknown skill id is refused (the lane gate's one validator); a pinned skill missing at
|
|
127
|
+
run time is named in the first line of the run's instructions.
|
|
128
|
+
- A run record's `meta` says how its skills loaded: `skills_auto` (pinned at session start) beside `skills_loaded`, and
|
|
129
|
+
`skills_regime`; the rest were loaded with `load_skill`. Measurement only: nothing retires a skill.
|
|
130
|
+
- Bundled skills are seeded into `<data_home>/skills/bundled/` and served from there: a fix is the agent's pending draft the owner
|
|
131
|
+
accepts, with no deploy; an update replaces only unmodified copies and its report names the kept ones.
|
|
132
|
+
- Every shipped skill has a `metadata.polyrob-when` line (at most 60 chars) that the skill index shows after its id; a skill write
|
|
133
|
+
with a longer one is refused, and a test checks the shipped library.
|
|
134
|
+
- A skill change ledger in `skill_usage.db` (action, actor, before/after sha, archive path, `absorbed_into`); archived bodies are
|
|
135
|
+
content-addressed; `rollback_skill` restores one through the write gate; a background or curator delete names its absorber.
|
|
136
|
+
- `tests/golden/prompt_surface/` holds the system text and `tools[]` the model receives on eight surfaces (owner Telegram DM and
|
|
137
|
+
REPL, cron, goal, room, correspondent, leaf, prod-posture owner DM) with sizes per layer; a prompt change regenerates it: `python devtools/gen_prompt_surfaces.py`.
|
|
138
|
+
- `/job stop <id> --forever` stops the job's lane (pinned skill, else rig): no non-owner job there until `/job allow`; a per-turn
|
|
139
|
+
`<operations>` block shows live jobs, goals, pauses and stops and outranks owner.md and recall; owner.md promote rebases.
|
|
140
|
+
- `/usage [days]` on every seat (spend by model, kind, job and day, cache %, $ per useful run) and a "Top AI cost" digest line; a cron
|
|
141
|
+
`payload.precheck` skips a quiet watch tick with no model call; `model_call_quality` and `prompt_manifest` events; `polyrob doctor` billed-vs-catalog line.
|
|
142
|
+
- `HEAVY_MODEL`: a money-class cron job or goal (`priority=money`, or a money tool in its toolset or rig) that pins no model runs on this
|
|
143
|
+
model on the pinned provider, through a `model_tier` column of `REGIME_POLICY`, so a box keeps a cheap default for chat and routine runs.
|
|
144
|
+
- `/inbox` reads every decision list (open cards, signer approvals, agent-written jobs and goals); `/pending` is its view and the console API
|
|
145
|
+
agrees; `/missed` names the cap only when the cap was the cause.
|
|
146
|
+
- Telegram and the console gain `/model` (the model, each pin and its source; a write goes through the config oracle), `/skills` and
|
|
147
|
+
`/config get|explain`; the REPL-only verbs are rows of `core/verbs.py` (`seats=("repl",)`). The `/approve list|add|remove` alias is removed.
|
|
148
|
+
- `agent_status` (health, next runs, release notes) is on every posture; `AGENT_STATUS_TOOL` gates only wallet/ledger/config. The identity
|
|
149
|
+
names `POLYROB <version>, instance <name>`; episodes keep `meta.skills_loaded`; the guide skill gains a generated `references/verbs.md`.
|
|
150
|
+
|
|
151
|
+
### Changed
|
|
152
|
+
|
|
153
|
+
- `cronjob_edit` reports the job's next run, and both it and `cronjob_show` name any other live job firing at the SAME
|
|
154
|
+
minute, so a judge meant to run "24h after the announce" cannot silently share the announce's schedule.
|
|
155
|
+
- A `prompt_manifest` row carries `estimate_gap` (provider `prompt_tokens` minus the slot estimates); the deploy log prints
|
|
156
|
+
the bundled-skill seed lines; `knowledge_export` moves from `core/` to `agents/task/` (no upward edge).
|
|
157
|
+
- `skill_manage create` needs a `when` index line (<= 60 chars, written into the frontmatter); the skill writer and the REST
|
|
158
|
+
skill API no longer write keyword triggers into a tenant rule.
|
|
159
|
+
- `skill_manage` `patch`/`edit`/`delete` carry the sha256 `load_skill` returns (a stale one refuses with the current sha); `create`
|
|
160
|
+
never overwrites; new `edit` and `rollback` actions; the scan and lint check only the lines a write adds.
|
|
161
|
+
- `treasury-trading` fits the pin budget: a 19K core with the NO ROUTE rule in its head; the chain table, execution order, NFTs and
|
|
162
|
+
learning-the-meta move to `references/`. A test holds every shipped skill body to 20,000 chars.
|
|
163
|
+
- Skills load on purpose: only pinned skills (a job's or goal's `payload.skills`, persona seeds, their `requires`) load at session
|
|
164
|
+
start; every other session gets a short index and calls `load_skill`. The keyword matcher and per-turn re-match are deleted.
|
|
165
|
+
- One block owns tool status: with `<tool-catalog>` pinned, its lines carry each gate (flag, unmet posture limb) and
|
|
166
|
+
`<tool-availability>` keeps only the goal line; an owner seat pins the catalog without `POLYROB_LOCAL`.
|
|
167
|
+
- A session resumed for a correspondent runs on `filesystem`, `task` and `message` instead of the ambient grant
|
|
168
|
+
(75 to 39 tool schemas): the capability gate refuses every high-impact tool there anyway.
|
|
169
|
+
- Owner chat runs on the cron shape: the `owner` rig and granted money tools eager, `<tool-catalog>` + `load_tool` always,
|
|
170
|
+
the `tool_call` bridge, one catalog / load / not-loaded text on every seat; prod-posture owner DM 58K to 39K tokens.
|
|
171
|
+
- An active user skill's reviewed revision lives in `skill_usage.db`, not the tenant `rules.json`; a legacy hash there
|
|
172
|
+
still verifies until the skill's next write moves it.
|
|
173
|
+
- The system prompt's prose moved out of `prompts.py` (1,467 → 1,062 lines) into `data/prompts/system/<block>.md`, read by `core/prompt_text.py`;
|
|
174
|
+
Python keeps the conditions and the order; each block has a size ceiling, and the owner-facing texts pass the glossary.
|
|
175
|
+
- A skill's SKILL.md frontmatter is its only metadata source: the builtin and pack `rules.json` files are gone,
|
|
176
|
+
the rule index is built from `metadata.polyrob-*` (the `tool_ids` gate, priority, auto-activate, and the new `polyrob-requires`).
|
|
177
|
+
- `<owner-instructions>`, the standing-goals line and the live-state line render only on an owner seat (owner chat, and live state on
|
|
178
|
+
autonomous runs), never in a room, a correspondent chat or a sub-agent; the prompt golden's leaf is built as `delegate_task` builds it.
|
|
179
|
+
- The session's workspace path left `<environment>` for its own foundation row, and it and the task now come after the skill and tool
|
|
180
|
+
catalogs, so two runs of one cron job or goal share the cached prefix through the catalogs.
|
|
181
|
+
- One gate text per tool: `core/tool_gates.py::REMEDIES` holds every remedy, a gate row (core or `pack.toml`) names a key,
|
|
182
|
+
and `<tool-availability>` and `<tool-catalog>` render the same text; the trading venues no longer say "never autonomous".
|
|
183
|
+
- One home for the skill catalog: `core/skills` holds frontmatter, scopes with one `resolve` (two non-builtin skills
|
|
184
|
+
with one name and different bodies are refused) and the gate predicates; the writer and migration move to `modules/skills`.
|
|
185
|
+
- The system prompt no longer lists every action in `<available-actions>` (about 3K tokens): in native tool mode `tools[]` is the one list;
|
|
186
|
+
the JSON fallback keeps it, and the action index lists an aliased action once.
|
|
187
|
+
- The system prompt states each rule once (done vs send_message, the memory field, paths, live state; pause and work only in `<operations>`),
|
|
188
|
+
names `web_fetch_fetch_url` and no `polyrob …` command, and calls a model-written rule a draft; the SOUL template drops its approval lines.
|
|
189
|
+
- Agent steps: OpenRouter sends `tool_choice=required`; an empty completion retries in the call; a tool name is repaired; an autonomous
|
|
190
|
+
run that acted ends on a text reply; owner chat compacts on an 80k history budget and keeps the current request; tool disclosure is on for autonomous runs.
|
|
191
|
+
- One session-regime table (`REGIME_POLICY`) decides pinning, recall rank, owner memory and run records per session kind;
|
|
192
|
+
`OWNER_THREAD_TAIL_HOURS` defaults to 24; memory filter v4 drops step narration (the purge reruns, backup first).
|
|
193
|
+
- Jobs: `/jobs` (next run, last outcome, author) and `/job new|show|edit|pause|resume|run|stop` on every seat, `polyrob job …` (`polyrob cron` an
|
|
194
|
+
alias for one release); a paused job shows no next run; a stop records its seat; one scheduler-off sentence; `/cron` is removed.
|
|
195
|
+
- Goals: `/goal new|show|retry|pause|stop [--forever]` on every seat (`/goal ready|resume|cancel` deleted); `paused` is a status; stop is once unless
|
|
196
|
+
`--forever`, the same on chat, CLI, console and `goal_cancel`; console Work lists stored goals and jobs when off.
|
|
197
|
+
- `CHANGELOG.md` ships in the wheel (`core/CHANGELOG.md`); on a deploy `release_notes('latest')` leads with `[Unreleased]`; the guide and
|
|
198
|
+
its skill explain standing work as job / goal / decision / pause with one which-one table, and retire rail, objective and stream.
|
|
199
|
+
- Status names the next 5 runs or why none runs, and says IDLE (not RUNNING) while autonomy is off; a blocked
|
|
200
|
+
goal names its error; runtime cost names its window; digest, `/recap`, `/journey` name a failed read.
|
|
201
|
+
- The holdings read values the native coin as money: its row shows the USD value and what is spendable above the chain's fee reserve (`ChainRow.fee_reserve`, e.g. 0.002 ETH on an L2), and a `total incl. native` line counts it; an unpriced native is named, never counted.
|
|
202
|
+
|
|
203
|
+
### Removed
|
|
204
|
+
|
|
205
|
+
- Dead skill code: the `action_names` trigger (no shipped rule could fire on it), `SkillContext`, the second frontmatter parser,
|
|
206
|
+
the unused scope list, `scripts/skills_frontmatter_sync.py` and the `adopt` keyword. The guide states the real skill precedence.
|
|
207
|
+
- The unread prompt constants in `agents/prompt` and every mention of the retired `OWNER_RULES_IMMEDIATE` env in code comments and tests; the docstrings now say a model-written rule is a draft the owner confirms.
|
|
208
|
+
- Text-guessing gates: read taint, refusal taint, the financial-claim gate, `authored_by`/`/adopt`, the memory write filter and cron's
|
|
209
|
+
job-text regexes. Unattended money needs a non-`supervised` money regime at the verb; 4 flags retire.
|
|
210
|
+
- One way to pick the model: `CHAT_PROVIDER`/`CHAT_MODEL` retire to `DEFAULT_PROVIDER`/`DEFAULT_MODEL`, `COMPACTION_AUTO_AUX` to
|
|
211
|
+
`AUX_AUTO`; `POLYROB_<PROVIDER>_MODEL` is no longer read. `polyrob doctor` names each retired line still set.
|
|
212
|
+
- Rails, objectives, streams and the planner: `/rail`, `polyrob rails`, `/goal objective`, the `streams`/`planner`
|
|
213
|
+
pause scopes, `polyrob owner pause-streams`; 11 flags retire. A recurring need is a scheduled job.
|
|
214
|
+
|
|
215
|
+
### Fixed
|
|
216
|
+
|
|
217
|
+
- A 1.4.0 server data home (`<POLYROB_DATA_DIR>/data`) moves up into the data home at first start, under a lock;
|
|
218
|
+
nothing is merged, overwritten or deleted, and `polyrob doctor` names what stayed. Before, the upgrade opened an empty `bot.db`.
|
|
219
|
+
- `propose_action`'s `replaces` closes only the owner's own proposal cards, never a quote waiting for Confirm, a choice
|
|
220
|
+
card or another user's card.
|
|
221
|
+
- Telegram `/model` checks both halves of the pin before it writes either, so a higher layer that pins only
|
|
222
|
+
`DEFAULT_MODEL` no longer gets a provider of another model family.
|
|
223
|
+
- REPL `/usage` still shows this chat's usage when the data home cannot be read; the spend view says "could not read".
|
|
224
|
+
- Console Inbox Approve/Reject on a signer approval goes to the signer's decider (it answered "unknown pending kind").
|
|
225
|
+
- `/goal stop <id> --forever` typed with a phone dash (`—forever`) switches the goal off; `/goal retry` help says it
|
|
226
|
+
re-queues a blocked or paused goal, and a pause then retry no longer runs two copies of the goal.
|
|
227
|
+
- `python -m migrations.migrate status` reads the same `bot.db` that `upgrade` writes.
|
|
228
|
+
- The "MCP is off" refusal names what the owner sets, not an internal key.
|
|
229
|
+
- Rolling back a bundled skill after an update works; accepting a bundled fix no longer deletes a newer draft, is refused
|
|
230
|
+
when its ledger row cannot be written, and a partial first seed keeps serving the packaged library.
|
|
231
|
+
- Recap and the daily digest say the episode store could not be read, instead of reporting no activity.
|
|
232
|
+
- Console job create answers a named 503 when the job store cannot be read; a job edit no longer loses a pause or an
|
|
233
|
+
outcome written at the same time.
|
|
234
|
+
- REPL `/skills <query>` filters on the whole query, as Telegram does; `polyrob-requires` accepts a JSON string, a YAML
|
|
235
|
+
list or a number/null.
|
|
236
|
+
- Memory: while the store is full, the retry queue keeps only the newest summaries that fit one row and logs each drop.
|
|
237
|
+
- The rate-guard deferral cap counts deferrals in a row, not over the goal's life.
|
|
238
|
+
- Compaction keeps message ages (an old money receipt no longer keeps its full text) and adds no "[HISTORY CUT]"
|
|
239
|
+
note when nothing was cut; a rejected call's correction note no longer stacks up.
|
|
240
|
+
- A reused sub-agent's new run no longer takes its opening plan as the final report.
|
|
241
|
+
- A mistyped tool name is no longer repaired into a different money or outbound action (`launchpad_claim` ran as
|
|
242
|
+
`launchpad_sell`); the call gets the normal refusal instead.
|
|
243
|
+
- A goal run stopped by its spend budget is recorded as a failure; it is no longer deferred and re-run at full cost.
|
|
244
|
+
- When the compaction summariser fails, the owner's newest in-chat instructions stay instructions.
|
|
245
|
+
- `/send` sends any held token: with no spend-grade price it asks one extra step (`anyway`), owner lane only. Pinned
|
|
246
|
+
stables (USDG) price at their peg; an L2 WETH falls back to mainnet ETH; the agent now sees its session's verb replies.
|
|
247
|
+
- `goal_create` refuses a goal whose acceptance is the goal board itself ("a goal row exists", "goal_show
|
|
248
|
+
read-back"); no run can complete such a goal, and each judged failure bred more goals.
|
|
249
|
+
- `send_message` rewrites an `/approve_p_…` / `/reject_p_…` token the owner already decided as "(already
|
|
250
|
+
approved <time> — nothing to tap)" and adds one "(Correction: …)" line; a token still queued is left alone.
|
|
251
|
+
- A cron job's `payload.post_spacing_hours` (`polyrob job edit --post-spacing-hours`) is now enforced by the
|
|
252
|
+
X tool: a post, quote, thread or repost inside the window since that job's own last post is refused, so
|
|
253
|
+
pacing is no longer prose the model checks after posting.
|
|
254
|
+
- A swap Confirm whose fresh quote still clears the confirmed minimum re-requests the route at a tighter
|
|
255
|
+
slippage instead of refusing "the minimum received fell below the confirmed quote"; the floor never drops.
|
|
256
|
+
- Two first writers of a new session no longer raise "user_id cannot be determined": the session's user is recorded
|
|
257
|
+
before its directory exists. The REST skill API writes a tenant `rules.json` atomically, through the skill writer.
|
|
258
|
+
- A token the owner pinned (`/wallet trust`) passes a buy-screen check no provider answered (USDG on robinhood
|
|
259
|
+
never gets `is_honeypot`); hard failures and a high sell tax still refuse. A swap dry run now runs the screen.
|
|
260
|
+
- The unchecked-route refusal and the spend-limits brief now name the owner's pin verb
|
|
261
|
+
(`/wallet trust <chain> <address> <SYMBOL> go`) and say no setting raises the $5 ticket.
|
|
262
|
+
- A tool call that restates its own tool as an `action` arg (`twitter_whoami(action='whoami')`) no longer fails
|
|
263
|
+
validation; the arg is dropped only when the tool declares no `action` field.
|
|
264
|
+
- A scheduled run that found nothing new sends no message (the autonomous contract said "silence is a failure mode" and
|
|
265
|
+
no-op cron runs began to ping the owner every 2 hours); a job text that asks for a silent close binds.
|
|
266
|
+
- The bundled-skill seed runs when the service can write the data home through its group (prod is `root:polyrob-data`);
|
|
267
|
+
an owner-uid check refused it, so nothing was seeded. A root shell on a service-group home skips without an error.
|
|
268
|
+
- A one-shot cron job that ends `failed` is disabled in the same write, as `done` is; an old failed row with `enabled=1` is
|
|
269
|
+
disabled when the store opens.
|
|
270
|
+
- The deploy deletes skills that left the shipped library: stale pre-pack copies on the box were indexed as builtins,
|
|
271
|
+
so every pack skill was renamed `<pack>:<id>` and a pinned plain id served the old body.
|
|
272
|
+
- The `prompt_manifest` row is written after the first call, so it records the tool-schema cost and the first-step blocks (it read
|
|
273
|
+
0 and missed them), with a size per foundation layer and the provider's own `prompt_tokens`.
|
|
274
|
+
- A cron job that finishes as `done` is disabled in the same write, and the cron store clears old done-but-enabled rows and the dead `authored_by`/`adopted_skills_digest` payload keys when it opens; finished jobs no longer read as live rails.
|
|
275
|
+
- The owner/self doc writer refuses a second `## Superseded` heading and an agent write that would retire more than 3 active rules at once; a misplaced heading demoted 27 live owner rules twice in one morning.
|
|
276
|
+
- A `/send` proposal to an address that already has an open `/send` card is refused unless it names the cards it `replaces` (closed) or says `also_owed`; re-split payouts stacked ~$233 of cards on a $100 pool.
|
|
277
|
+
- A typed owner reply to an open `present_choice` card closes it at once ("replied in text", never parsed into a pick); before, the turn sat until the wait ran out.
|
|
278
|
+
- A service-user write into a setgid shared store (skills, identity) is group-shared 0660, not 0600; before, only root writes were.
|
|
279
|
+
- Self/owner identity docs are written 0660 (group-shared), not mkstemp's 0600 — a promote left `owner.md`/`self.md` unreadable to the `polyrob-data` group.
|
|
280
|
+
- `present_choice` gets at least its declared `wait_seconds` (+30 s) from the controller; the generic 180 s action timeout cut a 300 s owner choice short.
|
|
281
|
+
- A goal run a rate guard refused (`retry_after_sec=N`, e.g. the X post cooldown) is deferred, not failed: back to `ready` with `payload.not_before`, no failure counted, at most 3 deferrals in a row.
|
|
282
|
+
- A `tool_call` the target rejects now lists every parameter (type, required, description) and names empty `arguments`; the X post-cooldown hint names `cronjob_schedule`'s real `schedule` field.
|
|
283
|
+
- An unblocked goal is no longer held by the dispatcher's own "Unblock goal" ask: `GoalBoard.unblock` now releases it, as retry and the outage requeue already did.
|
|
284
|
+
- Recall and live limits survive a tool-free step; aux calls record tokens and billed cost; `AUX_AUTO` works on OpenRouter and reflection
|
|
285
|
+
runs; a live chat follows a moved model pin; the server no longer loads the code root's `AGENTS.md` as project context.
|
|
286
|
+
- Long owner chats: one compaction policy (the 90 % prune is gone); a prune keeps the summary and the latest owner message;
|
|
287
|
+
the first chat message is dated and the newest owner message wins; owner instructions survive compaction as instructions.
|
|
288
|
+
- Jobs and goals keep a run record on every exit (time cap, pause, step budget) and see `<previous-runs>`; a goal reads the
|
|
289
|
+
answers to its own asks; answers are consumed after a completed run; a plain owner reply reaches the job it answers.
|
|
290
|
+
- Memory recall ranks by recency and by the reader's regime (a job's own runs first), dates every hit, keeps `[unverified]`
|
|
291
|
+
through summaries, and says "could not read" on a failed read; a reload no longer re-writes old findings as new.
|
|
292
|
+
- Tool results over the wire cap are saved with a real read path; children report `incomplete` and their full text; a reload
|
|
293
|
+
re-renders changed rules/prompt/skills; `<live-health>` carries the live spend limits; a money denial names the caps.
|
|
294
|
+
- A deployed instance has one `<data home>/.env`, one env ladder and one data dir; a write `polyrob.env` pins is
|
|
295
|
+
refused naming that file; `explain` labels `env:systemd|file|shell`; `/restart` is promised only when it applies.
|
|
296
|
+
- A guard-refused money quote makes no card and no `go` hint; the per-tx refusal names its cap and the
|
|
297
|
+
`/config set` remedy; owner-verb replies and card taps (as the line confirmed) reach the owner thread.
|
|
298
|
+
- Money-verb results under 24 h keep full text through ageing; the step clock reads UTC; the compaction warning reads the 70/85 ladder; `cronjob_edit` says a new schedule runs a job sooner; an owner money QUESTION gets a quote and a card.
|
|
299
|
+
- A blocked goal put back to `ready` (owner retry, provider-outage requeue) closes the dispatcher's own "Unblock goal" ask; before, that open ask held the goal and nothing dispatched. An owner-decision ask still holds it.
|
|
300
|
+
- `defi_data.reconcile` compares only the chain it reads: a ledger row naming another chain (or one the rail store holds elsewhere) is skipped, a chainless row reading zero is "unscoped" (UNVERIFIED) not missing, a row marked CLOSED is closed, and an unbacked rail row names `/writeoff`.
|
|
301
|
+
- OpenRouter's in-flight 402 (`in_flight_budget_exceeded`: a funded account whose concurrent reservations pass the balance) backs off and retries like a rate limit; it no longer latches the credit sentinel, pauses autonomy for 6 h or fails a goal over to another provider.
|
|
302
|
+
|
|
303
|
+
### Security
|
|
304
|
+
|
|
305
|
+
- A goal or cron `target_token` is identity trust only with an explicit `target_authored_by: owner` stamp (owner seat or
|
|
306
|
+
verbatim owner turn); a row with a target and no stamp, such as one written before the stamp existed, is restrict-only.
|
|
307
|
+
- A multitenant console lists the instance's signer approvals only for the owner tenant.
|
|
308
|
+
- `POLYROB_SUPPORT_URL` and `POLYROB_SUPPORT_HANDLE` have no default (the link is hidden until set); shipped code, tests
|
|
309
|
+
and skills carry no instance identifier; the task-API access refusal is generic.
|
|
310
|
+
|
|
311
|
+
## [1.4.0] — 2026-10-13
|
|
312
|
+
|
|
313
|
+
**Upgrading from 1.3.x:** move posture-member lines (e.g. `SHELL_TOOLS_ENABLED=false`) into one
|
|
314
|
+
`POLYROB_OVERRIDES=...` line — a direct member line is now ignored; rename `BOT_INSTANCE_ID`,
|
|
315
|
+
`BOT_OWNER_USER_ID`, `MASTER_SEED` and `WEBGATE_MULTITENANT`, which now refuse to start; update imports
|
|
316
|
+
of the moved modules. A `DEFAULT_MODEL`/`CHAT_MODEL` pin now wins over `POLYROB_<PROVIDER>_MODEL` for the pinned
|
|
317
|
+
provider. `polyrob doctor` names each line to change; see [upgrading](docs/guide/upgrading.md).
|
|
318
|
+
|
|
319
|
+
### Added
|
|
320
|
+
|
|
321
|
+
- `polyrob service start|stop|restart|logs`, `/restart`, `/update`: finish the work, exit 75, restart, report back;
|
|
322
|
+
an update that never starts rolls back. `/status` names settings awaiting a restart.
|
|
323
|
+
- `defi_trade.bridge` bridges INTO Solana (native SOL or USDC). The arrival is proven by the delivering transaction's
|
|
324
|
+
own balance change for our account (a trade during the wait never counts as the bridge); Relay's Solana id is a registered alias.
|
|
325
|
+
- `defi_trade.bridge` takes the origin chain's pinned USDC as the origin (`token_in="usdc"`, `/bridge … from usdc`,
|
|
326
|
+
`--token-in`): on EVM an exact approve to the pinned Relay depository, then the guarded deposit, revoked on refusal.
|
|
327
|
+
- `polyrob.sdk`, the stable host API for packs; packs no longer import private host names.
|
|
328
|
+
|
|
329
|
+
### Changed
|
|
330
|
+
|
|
331
|
+
- The composition root (`bootstrap`, `initialization`, `autonomy_runtime`, `bot`) moved from `core/` to `polyrob/app/`;
|
|
332
|
+
`core/intel` and `core/rails` moved to `tools/`. Importers of the old paths must use the new ones (no shims).
|
|
333
|
+
- The agent loop's own types moved from `tools/` to `agents/task/loop_types/` (`tools.controller.types`,
|
|
334
|
+
`tools.browser.views`, `tools.dom.views`, `tools.controller.registry.views`, no shims), and
|
|
335
|
+
`agents.task.goals.autonomy_marker` is now `core.autonomy_marker`.
|
|
336
|
+
- The layering ratchet tiers cron, app, migrations, entry points, SDK and packs, counts `"pkg.mod:attr"` strings and
|
|
337
|
+
caps the largest import cycle (588 → 200 modules).
|
|
338
|
+
- The 51 posture-bundle member flags are set only by their bundle or by one `POLYROB_OVERRIDES=FLAG=value,...` line
|
|
339
|
+
(file access); a direct member line is ignored and `doctor` shows its replacement. Flags 722 → 672.
|
|
340
|
+
- Git, MCP stdio, lazy installs, coding snapshots, `self_env`, local `run_code` and third-party packs run beside the
|
|
341
|
+
wallet in every signer mode; the key is protected by isolation. The shell floor is judged per command segment.
|
|
342
|
+
- One owner-turn definition, one view of the three taints, one `TurnFacts` seat-context constructor and one policy
|
|
343
|
+
hook chain; HTTP `/execute` and `/lp` run the denylist, effect and refusal-taint hooks; `tx_guard` asks `authorize_spend`.
|
|
344
|
+
- Verb kinds (outbound, produced output, late send, read job, room-refused, background) are columns of the verb rows;
|
|
345
|
+
every gate and list derives from them.
|
|
346
|
+
- One database registry (`core/db_manifest.DB_REGISTRY`) feeds the backup set and the shell guard; named store-path
|
|
347
|
+
helpers replace open-coded `.db` joins.
|
|
348
|
+
- The money authorizer `tx_guard._authorize` is 25 ordered step functions over one `GuardContext`
|
|
349
|
+
(`core/wallet/tx_guard_steps/`); the step order and the exact decisions are pinned by tests. No behaviour change.
|
|
350
|
+
- The god files are split with no behaviour change: Telegram owner verbs use one seat table, each status section
|
|
351
|
+
has its own module, the defi tools use `*_verb.py` modules, GoalBoard is store mixins, and `Agent.__init__` is builders.
|
|
352
|
+
- `import core` no longer reconfigures the host's root logger; the process entry points set up logging.
|
|
353
|
+
- First-party packs inherit the core version, and the pyproject extras are the one dependency spec; a release
|
|
354
|
+
bump edits `pyproject.toml` only and the lazy-install pins derive from the extras.
|
|
355
|
+
- Console writability and secret masking come from a per-flag `Access` column in `docs/CONFIGURATION.md`, not
|
|
356
|
+
from name patterns; one "Posture bundles" table lists each bundle's members.
|
|
357
|
+
- The deploy reconciles every installed unit that `deployment/units.toml` declares, restores them on rollback and
|
|
358
|
+
ships only `scripts/ops/`; the host env templates are generated from the flags catalog.
|
|
359
|
+
- Private tests and lab harnesses live under `ops/`; shipped tests read no private file, `tests/unit/scripts` is
|
|
360
|
+
collected again, and one classifier (`scripts/public_export.sh`) builds and tests the public export in CI.
|
|
361
|
+
- The test suite runs in parallel (pytest-xdist; CI = a static ratchet job + five shards), the root conftest costs
|
|
362
|
+
~1 ms per test instead of ~7.6 ms, and the ratchets share one parse cache.
|
|
363
|
+
- Releases before 1.0.0 moved to `CHANGELOG-archive.md`.
|
|
364
|
+
|
|
365
|
+
### Removed
|
|
366
|
+
|
|
367
|
+
- `utils/user_utils.py`, the payment `__main__` runners, the `core.Bot`/`core.initialize_*` lazy exports and `MANAGER_METADATA`.
|
|
368
|
+
- The individual env rows for the 51 posture members and the `posture_flag`/`safe_local_flag` helpers.
|
|
369
|
+
- The unread `modules/database/schema.sql` and the dead `./.polyrob/.env` project-write code.
|
|
370
|
+
- The 43 flags marked "Retire after 1.4"; their default behaviour is permanent. `BOT_INSTANCE_ID`, `BOT_OWNER_USER_ID`,
|
|
371
|
+
`MASTER_SEED` or `WEBGATE_MULTITENANT=true` set alone refuse to start and name the rename; `doctor` lists retired names.
|
|
372
|
+
- 61 internal tuning env knobs are module constants with unchanged defaults, and four dead flag rows are gone.
|
|
373
|
+
- The Fly kit, `deployment/legacy/`, `CLEAN_DEPLOY.md` and the dead one-off scripts.
|
|
374
|
+
|
|
375
|
+
### Fixed
|
|
376
|
+
|
|
377
|
+
- `DEFAULT_MODEL`/`CHAT_MODEL` reach every run on the pinned provider (cron, goals, planner, clients, fallback), not only
|
|
378
|
+
chat; `core.runtime_config` is the one reader of the pin, and a blank `CHAT_` value no longer hides `DEFAULT_`.
|
|
379
|
+
- `polyrob update --apply` sees a live owner turn under the `polyrob service` user unit: the turn marker
|
|
380
|
+
follows the data home, not the unit's working directory.
|
|
381
|
+
- Owner rules: a patch edits only the active rules (Superseded history is never rewritten), duplicate Superseded
|
|
382
|
+
entries collapse, the cap is 24,000 chars, and an over-cap doc loads truncated with a warning, not dropped.
|
|
383
|
+
- Memory recall searches the turn's own words: a cron run its job text (not the owner-rules overlay), a goal its title
|
|
384
|
+
and body, a chat turn the newest owner message; FTS drops stopwords; one injection is capped at ~9k chars.
|
|
385
|
+
- Memory no longer stores tool-call echoes, strategic-clue hints or short run-status lines; a one-time curator purge
|
|
386
|
+
backs up memory.db, then cleans stored rows; unprotected cron/goal rows age out after 45 days.
|
|
387
|
+
- The X post gate says why a post needs the owner (the untrusted source read, or the agent-authored job and `/adopt`);
|
|
388
|
+
a write receipt no longer taints a run, and `cronjob_list` names each job's author.
|
|
389
|
+
- The X DM read resolves a handle from the inbox listing's id; a handle X does not know is a dead target, skipped
|
|
390
|
+
7 days; a token refresh, a late-approved send and a cron post close their X Chat client's session.
|
|
391
|
+
- In a scheduled or goal run, `send_message` refuses a line that starts with `@handle` and names `message()`; a
|
|
392
|
+
delivered send says it went to the owner's private chat, and so does the owner-thread line.
|
|
393
|
+
- Unknown-setting refusals (`preferences`, `polyrob config`, `/config`, the env typo audit) find the close key even
|
|
394
|
+
when its words are in another order; `preferences explain`/`set` name up to three.
|
|
395
|
+
- A provider credit refusal (z.ai 429 code 1113) is a named NO BALANCE error, not retried as a rate limit; failover
|
|
396
|
+
starts at once, and the SDK sends it once instead of three times.
|
|
397
|
+
- Telegram polling backs off 1 s → 30 s with jitter on a getUpdates failure streak instead of retrying every second.
|
|
398
|
+
- A gated tool a session re-requests is warned once per process; the MCP tool is not offered with no MCP server.
|
|
399
|
+
- An owner-approved X post sent after the asking run stopped waiting, and a cron job's X delivery, now initialize the Twitter tool they build; both failed "client is not constructed" and lost the approval.
|
|
400
|
+
- An owner buyback of a trusted token (own launch, owner pin or owner target) on a chain no price source covers is no longer capped at the $5 unchecked-route ticket; a disagreeing route and an untrusted token still are. An EVM swap dry run now reports that refusal instead of passing.
|
|
401
|
+
- The X browser rail was missing from the financial-claim gate and the evidence ledger (lists named `x_post`).
|
|
402
|
+
- The Telegram DM gate admits `POLYROB_OWNER_TELEGRAM_ID`; a shadow signer that never answered uses the local caps
|
|
403
|
+
with a notice, not $0.
|
|
404
|
+
- The HTTP KB, the server session tree and the owner verbs `soul`/`persona`/`knowledge`/`kb` use the deployed data home.
|
|
405
|
+
- Six fire-and-forget tasks, including the approval-queue owner wake, are retained; a failed `polyrob run` bootstrap
|
|
406
|
+
turns logging back on.
|
|
407
|
+
- An Agent built without a `memory_manager` keeps its chat persona; the memory fallback no longer replaces the
|
|
408
|
+
config the MessageManager reads `persona_block` from.
|
|
409
|
+
- `send_message` says it reaches only the session's own person (the owner in a scheduled run) and names
|
|
410
|
+
`message(target=…)` for rooms, so a room reply no longer lands in the owner's private chat.
|
|
411
|
+
- Env reads the flag catalog missed are documented, including `BYPASS_PAYMENT_FOR_ADMINS` (default on); nineteen
|
|
412
|
+
flags that read only the exact string `true` use the shared parser, and a test checks documented defaults.
|
|
413
|
+
- `bs4`, `yarl`, `eth-utils` and `eth-abi` are declared dependencies; a test fails on any undeclared import.
|
|
414
|
+
- Refusals, remedies and the profile unit no longer tell users to run `scripts/` or `deployment/` files.
|
|
415
|
+
- The migrations schema-version fallback names 1.10.0, the newest shipped migration, not 1.4.0.
|
|
416
|
+
- `VOICE_TRANSCRIPTION_ENABLED` is documented as default ON, which is what the code does; the docs and
|
|
417
|
+
`polyrob doctor --flags` said OFF while every voice note was transcribed.
|
|
418
|
+
- The console Activity stream reads telemetry from the one telemetry location (`core.event_log.telemetry_db_path`),
|
|
419
|
+
so it no longer shows an empty system feed after the sidecar move or with `TELEMETRY_EVENT_LOG_PATH` set.
|
|
420
|
+
- A large tool result offloaded during a run whose workspace is the project folder is written there, where
|
|
421
|
+
`filesystem_read_file` looks, instead of the session directory the read could never reach.
|
|
422
|
+
|
|
423
|
+
### Security
|
|
424
|
+
|
|
425
|
+
- One owner-set security settings table (`SECURITY_SETTINGS`, `core/security/settings.py`): every check that can refuse
|
|
426
|
+
natural work reads its row; the fixed floor rows are listed beside it and shown on the `custody` status line.
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
## [1.3.0] — 2026-10-09
|
|
430
|
+
|
|
431
|
+
### Added
|
|
432
|
+
|
|
433
|
+
- **Terminal parity:** host shell at posture 3 behind one command guard; jobs with stdin, PTY, notify and receipts;
|
|
434
|
+
sudo prompt; ssh, Podman, Modal, Daytona, Vercel and Singularity backends; egress proxy; tool-calling scripts and
|
|
435
|
+
a persistent Python kernel in `run_code`.
|
|
436
|
+
- **Full mailbox for the agent:** list, read, save attachment, threaded reply, forward, folders, mark, move and delete
|
|
437
|
+
to Trash; `email_send` gains cc, bcc, html and attachments, every recipient gated. `email_read_machine_mail` returns
|
|
438
|
+
activation links and codes from auto-generated mail only.
|
|
439
|
+
- **Room moderation:** `room_moderate` mutes, unmutes, bans, unbans and deletes messages in an allowlisted room; owner
|
|
440
|
+
and admins are never targets, and a room turn or tainted session cannot call it. `room_read` lines carry `{uid=… msg=…}`.
|
|
441
|
+
- **Telegram post deletion:** receipts carry a message id; `message(action="posts")` lists the agent's posts and
|
|
442
|
+
`message(action="delete")` removes them by row, id or last N on owner instruction (not past 48 h or others' posts).
|
|
443
|
+
- **`/adopt`:** the owner makes an agent-authored cron job or goal their own from an action card that shows the whole
|
|
444
|
+
task, every payload key and each pinned skill with a content digest, and binds them.
|
|
445
|
+
- **Procedure skills:** `incident-response`, `adversarial-consensus` (blind `delegate_task` panel, judged, never
|
|
446
|
+
averaged) and four `coding-workflow` references (review, triage, debugging, cleanup).
|
|
447
|
+
- **The agent knows the version it runs:** `<environment>`, status and `agent_status` show `get_version()` and the
|
|
448
|
+
deployed sha; `agent_status(release_notes=...)` reads the shipped CHANGELOG.md.
|
|
449
|
+
- `defi_data.wallet_activity` on another address lists our own recorded payments to it from the wallet audit ledger
|
|
450
|
+
(an unreadable ledger reads UNKNOWN).
|
|
451
|
+
|
|
452
|
+
### Changed
|
|
453
|
+
|
|
454
|
+
- **Wallet caps:** with a signer installed, every agent limit (per-tx, daily, x402 per-payment and window) clamps to
|
|
455
|
+
the signer's; the signer is the one envelope, raised only by root. Each limit flag has one resolver.
|
|
456
|
+
- **Shell defaults:** ceiling 300 → 600 s and a longer timeout becomes a background job; a gated `shell_run` waits for
|
|
457
|
+
the owner only on a dangerous command (`SHELL_APPROVAL_MODE=every` restores the old behavior).
|
|
458
|
+
- **One authorship rule for standing work:** owner authority reads a positive `authored_by=owner` stamp; an owner turn
|
|
459
|
+
that read outside text writes agent work and says so. Owner goals carry owner cron jobs' standing authority.
|
|
460
|
+
- **Fewer owner taps:** trusted Solana and EVM buys, Polymarket and plain Hyperliquid cancels, sends to the owner's or
|
|
461
|
+
own address, `$(…)`, relative `rm -r`, `env | grep`, workspace dev commands and 12 console settings need no approval.
|
|
462
|
+
- **Cron runs follow the owner:** a run opens with every newer owner rule marked as overriding the job text; an
|
|
463
|
+
approved answer to a run's ask re-runs the job now, and every seat says where the answer went.
|
|
464
|
+
- **Rules docs hold twice as much** (owner 16000, contract 8000, self 12000 chars), and a background run's patch of an
|
|
465
|
+
active rules doc lands a pending revision for `owner promote` instead of a refusal.
|
|
466
|
+
- `DEFAULT_TOOL_TIMEOUT_SECONDS` defaults to 180 s instead of 60 s, still below the step timeout.
|
|
467
|
+
- The unconfigured local data home is `~/.polyrob/data`, never `./.polyrob`; the Docker image uses `/app/.polyrob`.
|
|
468
|
+
|
|
469
|
+
### Removed
|
|
470
|
+
- The deprecated `/api/polymarket/*` and `/api/hyperliquid/*` mounts that 1.2.0 kept for one release; use
|
|
471
|
+
`/api/packs/markets/...` (the old paths now answer 404).
|
|
472
|
+
|
|
473
|
+
### Fixed
|
|
474
|
+
- A bare `pip install polyrob` could not import `tools` (and refused the `discovery` pack): `openai` 3.x moved to
|
|
475
|
+
`httpx2`, so `httpx` is now a direct base dependency.
|
|
476
|
+
|
|
477
|
+
- The agent's file tools read, copy, grep and edit a world-readable hard-linked file (uv/pnpm cache trees) and
|
|
478
|
+
app snapshots ship it; a link to a private file, every append and every store/ledger read stay refused.
|
|
479
|
+
- `defi_data.wallet_holdings` (an explicit, public address) is a read-job verb again.
|
|
480
|
+
- A measured insufficient balance/allowance (LP builders) and a vetted Solana simulation that reverted are
|
|
481
|
+
tagged preconditions and no longer taint the run; the LP node-rejected broadcast carries its kind.
|
|
482
|
+
- `polyrob autonomy on/off` and `config set` write the home `.env` the CLI reads; `--project` (a never-loaded
|
|
483
|
+
`./.polyrob/.env`) is refused and names that file. `init`/the REPL no longer create `./.polyrob/sessions`;
|
|
484
|
+
`uninstall`, profile and help texts name the real data home.
|
|
485
|
+
- An autonomous X post waits in-run for the owner's tap and ends inside the `twitter` action timeout; a late approval
|
|
486
|
+
sends exactly the approved parameters once. An untainted owner-authored cron job posts without a per-run approval.
|
|
487
|
+
- X DMs work on encrypted X Chat: unsigned sender keys read as `verified: false`, and plaintext is used only for a cold
|
|
488
|
+
open X Chat refuses, when the owner approval names it. An account with no tweets reads as an empty timeline.
|
|
489
|
+
- The agent can click and type in the browser again: the indexed element list reaches the prompt, and page extraction
|
|
490
|
+
uses `aria_snapshot()` since Playwright 1.63 removed `page.accessibility`.
|
|
491
|
+
- `defi_data.wallet_activity` and `token_origin` work again: an explicit param model reaches an unannotated or dotted
|
|
492
|
+
`params` argument as the model instead of splatted kwargs.
|
|
493
|
+
- `defi_data.reconcile` reuses an unchanged dust verdict (6 h), so airdrops no longer time out the money rails' gate;
|
|
494
|
+
a market or precondition error no longer taints a run's public rails.
|
|
495
|
+
- Jupiter swaps decode every v6 route variant and the `route_v2` layouts; Solana swaps resolve lookup tables; a declared
|
|
496
|
+
`max_spend_usd` asserts the value only, with the network fee charged to the caps.
|
|
497
|
+
- Wallet: an expired unsettled x402 payment resolves from chain state, our own bridge's arrival is not an "unmatched
|
|
498
|
+
payment", and the agent-NFT send card shows the holdings.
|
|
499
|
+
- `hf_deploy`/`app_deploy` refuse a file that changed after the last green `run_tests`; a delegated child stopped at
|
|
500
|
+
its step limit reads "stopped before finishing"; `done` turns back once while todos are open.
|
|
501
|
+
- A goal run whose `done()` opens with `BLOCKED:` is blocked, not done; a blocked goal has one open owner ask; goal
|
|
502
|
+
claims fence each run, so a stale run cannot overwrite its replacement.
|
|
503
|
+
- Scheduled jobs respect live edits and cancellations; stepped day fields such as `*/2` keep their days; `cronjob_show`
|
|
504
|
+
names when and via which surface a job was cancelled.
|
|
505
|
+
- A turn never delivers the same reply twice, and the LLM-timeout notice says the step is retrying instead of asking
|
|
506
|
+
the owner to resend (which could pay twice).
|
|
507
|
+
- A tool's deliberate `ServiceError` refusal reaches the agent without a traceback; the log keeps it.
|
|
508
|
+
- A failed lookup is not proof of absence: a not-found read names the path tried and offers same-name files; a finding
|
|
509
|
+
beside a failed tool call is stored `[unverified]`.
|
|
510
|
+
- The workspace note never invents an upload: relative paths, record-backed upload claims and declared `authored_by:`;
|
|
511
|
+
A2A peer messages are labelled as not the owner, and an unreadable self-context doc is named.
|
|
512
|
+
- SQLite opens tolerate a sidecar unlinked by another account, and the shared data root is never sticky, so the outbox
|
|
513
|
+
dispatcher no longer fails with "readonly database".
|
|
514
|
+
- Cancelled, failed and resumed autonomous runs release their sandbox; sandbox reapers skip when the Docker socket is
|
|
515
|
+
unreachable; the cross-session turn store has its own 100k-row bound.
|
|
516
|
+
- Room moderation no longer repeats (room posts join the room ledger, deleted lines are marked), and Telegram polling
|
|
517
|
+
logs one recovery line after an outage streak.
|
|
518
|
+
- `config set/unset` and `tools enable/disable` keep the home scope with `--global`; Microsoft 365
|
|
519
|
+
`Authentication-Results` that open with a result are read; owner CLI API-key creation works under the strict tier.
|
|
520
|
+
|
|
521
|
+
### Security
|
|
522
|
+
|
|
523
|
+
- Deployment: ops loops run as an unprivileged account; the agent never runs as root and its HOME leaves the data home;
|
|
524
|
+
root steps use pinned no-follow descriptors; rollbacks stay inside configured paths; console vhosts pin TLS and HSTS.
|
|
525
|
+
- Signer: its own venv; serves only a client's main process; keeps full approval details in a bounded queue; needs
|
|
526
|
+
on-box approval for owner-queue verdicts; Hyperliquid RPC signs cancellations only; clients refuse before cap check.
|
|
527
|
+
- The spend ledger is sealed with a seed-derived MAC; browser egress closes the host's own and special-use addresses;
|
|
528
|
+
`CODE_EXEC_SSH_KNOWN_HOSTS` pins the ssh backend's host key.
|
|
529
|
+
- CI and release: least-privilege workflows, SHA-pinned actions, digest-pinned base images, a checksummed gitleaks
|
|
530
|
+
download, a read-only build job and tag-only release; PyJWT and multidict floors rise.
|
|
531
|
+
- Console: owner authentication on local consoles including Socket.IO; session JWT audience, strict cookies and one
|
|
532
|
+
origin check; login budgets persist and group IPv6 by /64; logout is a same-origin POST; scripts are self-only.
|
|
533
|
+
- Console and API isolation: tenants cannot read MCP, health, telemetry or instance flags; trust and money flags are
|
|
534
|
+
file-only; `polyrob dashboard` boots with a one-time password; session feeds cannot join global rooms.
|
|
535
|
+
- API keys carry read/write scopes and bounded expiry (legacy keys are replaced via wallet sign-in); rate limits key on
|
|
536
|
+
an IPv6 /64; SIWE nonces, the A2A list page and live SSE streams per caller are bounded.
|
|
537
|
+
- Billing: credits reserve before inference and settle once; the compute tier gate covers every paid surface; unpriced
|
|
538
|
+
models are refused; billed sessions get standard step and tool bounds; continuations recheck payment admission.
|
|
539
|
+
- Payments: settlement validates hash, chain and replay; test-network invoices and deposits are never income; inbound
|
|
540
|
+
submissions persist before settlement; x402 recipients are bound at approval and signing.
|
|
541
|
+
- Spend accounting counts EVM gas, Solana fees and rent, rounds risk upward and keeps decimal deposit precision; direct
|
|
542
|
+
transfers need owner approval, and payees that look like a recent payee (address poisoning) are refused.
|
|
543
|
+
- Swaps, bridges and LPs verify LI.FI, Jupiter and v3 calldata minimums and recipients before signing; floors compare
|
|
544
|
+
against independent prices; Solana routes refuse unrelated outflows; positions size from simulated balance changes.
|
|
545
|
+
- Venue orders reserve at the network boundary, use live reference prices with a price band and worst-case slippage,
|
|
546
|
+
enforce exposure and leverage limits, and never book a rejected order; worst market fees count against the caps.
|
|
547
|
+
- Untrusted content: repository, filesystem, delegated and paid-server results are framed as data; forged control
|
|
548
|
+
fences are neutralized; room titles, blocked members' history and pool labels stay out of instructions.
|
|
549
|
+
- Provenance: model-created goals and cron jobs keep agent provenance; persistent rules and skills need owner review;
|
|
550
|
+
an `owner_ask` answer must quote the owner's turn; correspondent turns cannot keep private owner documents.
|
|
551
|
+
- Shell guard: newline boundaries, wrappers and brace groups are judged; wildcard grants over shell syntax are refused;
|
|
552
|
+
git takes plain branch names; non-Python `run_code` runs through the guard; owner-only CLI verbs refuse under the agent.
|
|
553
|
+
- Surfaces: non-owner DMs are denied on non-Telegram surfaces; the WhatsApp webhook secret is required; email senders
|
|
554
|
+
need an MX-authenticated From; IMAP verifies certificates; voice media is bounded; pairing codes expire.
|
|
555
|
+
- Filesystem: SQLite stores are created private and linked stores refused; publication, export and attachment reads are
|
|
556
|
+
confined; file tools use `O_NOFOLLOW` descriptors; CLI startup ignores project-local env and MCP files.
|
|
557
|
+
- Secrets: endpoint credentials are redacted in config listings, errors and logs; X cookies import through hidden
|
|
558
|
+
prompts; provider failures omit credential-bearing URLs; legacy unguarded Twitter writes are retired.
|
|
559
|
+
- Packs and updates: a third-party pack builds to a wheel with no outside files; index rows admit only plain names; a
|
|
560
|
+
profile review shows its env keys, MCP, cron and skill content; app deploys bind the approved directory and digest.
|
|
561
|
+
- Memory and identity: planner and recall writes stay scoped and new notes await owner review; correspondent sessions
|
|
562
|
+
write no owner episode; ERC-8004 identity selects only a self-minted token.
|
|
563
|
+
|
|
564
|
+
## [1.2.1] — 2026-10-03
|
|
565
|
+
|
|
566
|
+
### Changed
|
|
567
|
+
|
|
568
|
+
- **Agent-NFT snapshot, inspect, journal and bind run in core:** they no longer need the agent-NFT package, which keeps
|
|
569
|
+
only mint, adopt's pfp/positions/Brief and a collection's own view lines.
|
|
570
|
+
|
|
571
|
+
### Added
|
|
572
|
+
|
|
573
|
+
- **`VALUELESS_CHAIN_MONEY` (off):** the owner's opt-in to a core run on Robinhood Chain testnet 46630 — its native coin
|
|
574
|
+
is priced at $0, so the USD caps do not bind, and every fee stays bounded in wei.
|
|
575
|
+
- **`agent_nft_adopt`:** an owner-approved verb that reads an agent NFT's journal history from the chain, runs the
|
|
576
|
+
package's adopt, then writes a handover entry; a note with no action is now an on-chain journal entry too.
|
|
577
|
+
- **`/nft trust <collection>`:** the owner trusts an agent-NFT collection from chat — a read-only quote card, then `go`
|
|
578
|
+
writes an owner pin (no mint/reveal) beside the token pins; the root file stays for admin pins. `/nft` lists the trusted collections.
|
|
579
|
+
- **The agent-NFT journal goes on chain:** each account action carries its signed entry in the same `executeBatch`
|
|
580
|
+
(`JournalLog.log`); the next entry continues the chain read from the account's events. No site upload.
|
|
581
|
+
|
|
582
|
+
### Fixed
|
|
583
|
+
|
|
584
|
+
- **Reconcile gate timeout:** `defi_data.reconcile` prices the chain side from the batch prefetch (booked tokens
|
|
585
|
+
first) and values rows on a small pool; a 116-token treasury fell from >90 s (past the 60 s budget) to ~13 s.
|
|
586
|
+
- **Sandbox reapers:** both skip when the process cannot open the Docker socket (the agent identity is outside
|
|
587
|
+
`docker` by design), ending ~100 refused `docker ps` WARNING lines a day.
|
|
588
|
+
- **Identity doc caps:** owner facts rise 4000 → 8000 chars and SELF 2200 → 6000 (both had filled and refused a new
|
|
589
|
+
owner rule); tool descriptions quote the live caps.
|
|
590
|
+
- **X login:** building an X client no longer spends the rotating refresh token, refresh logs name
|
|
591
|
+
their process, and `/x login`/`/x status` say the 2-hour access token renews itself.
|
|
592
|
+
- **Holdings watch:** the scan runs off the event loop; the owner hears once after 6 failed passes in a row
|
|
593
|
+
and once when it works again.
|
|
594
|
+
- **`/journey`, `/recap` and `polyrob journey` default to 24 h** on every seat, and the REPL reads the deployed home.
|
|
595
|
+
- **Outbound delivery:** the auto-opened breaker probes and closes; a repeated message is sent, not swallowed; a
|
|
596
|
+
process drains only its own surfaces, on a lease; quiet holds keep target, files and full text in `digest.timezone`.
|
|
597
|
+
- **Money waits survive a cancel:** Ctrl-C during any receipt wait (send, swap, LP, claim, launch, deploy, call, NFT) records
|
|
598
|
+
the broadcast against the cap and `/book` and says the tx may have gone through; Telegram runs every `go` verb off the poll loop.
|
|
599
|
+
- **Console reads say when they fail:** identity, memory, Work › Log, pickers and the activity tail report "could not read"
|
|
600
|
+
instead of empty; the thread re-syncs after a reconnect or `feed_gap`; own_ops opens every listed chat; money cells format.
|
|
601
|
+
- **Seat parity:** bare `/approve` never decides; one `/kb` grammar; the REPL reads the deployed owner and instance; inline
|
|
602
|
+
approvals need a slash token; console typos get the help answer; quote-card Refresh re-quotes from the typed words.
|
|
603
|
+
- **Chat surfaces:** Discord stops on a fatal close code and no longer blocks its gateway; IMAP runs off the loop with a
|
|
604
|
+
timeout; harness replies split to the platform limit; WhatsApp/Feishu replays refused; email auto-replies ignored.
|
|
605
|
+
- **HTTP API:** `Bearer rob_…` keys and `X-Service-Token` authenticate; the JWT `user_id` claim wins; validation errors are 422;
|
|
606
|
+
`/v1` accepts content-part arrays and streams errors and usage in the OpenAI shape; A2A push-config reads and deletes work.
|
|
607
|
+
- **Agent-NFT journal entries are signed under `WALLET_SIGNER=remote`:** the signer's new `journal.sign`
|
|
608
|
+
op signs the account journal template and nothing else; before, no entry was ever written.
|
|
609
|
+
|
|
610
|
+
### Security
|
|
611
|
+
|
|
612
|
+
- Owner authority needs an `authored_by=owner` stamp (`python -m cron.stamp_authorship`); `/adopt` shows
|
|
613
|
+
all and binds pinned skills; the shell guard resolves symlinks and state-db writes; taint exemptions
|
|
614
|
+
are tagged at the source; an autonomous X post waits for the owner's tap, not "denied".
|
|
615
|
+
- Entry points run isolated; the data home never comes from the cwd; the shell guard sees through
|
|
616
|
+
wrappers; pack wheels, profile installs, git refs, app deploys and file ops are pinned; scrubbing,
|
|
617
|
+
the X lock, TLS and CI permissions are tightened.
|
|
618
|
+
- Deployment counters replace legacy agent-owned files atomically with private inodes,
|
|
619
|
+
preserving open aliases and refusing link redirection during upgrades.
|
|
620
|
+
|
|
621
|
+
- Require an approved USD ceiling for Hyperliquid orders and show venue USD amounts on every approval card; live price or slippage changes cannot exceed the approved ceiling.
|
|
622
|
+
|
|
623
|
+
- Bound Telegram chat dispatch and voice transcription; a cancelled or timed-out transcription retains its CPU slot until the worker finishes.
|
|
624
|
+
|
|
625
|
+
- Refuse third-party code packs when remote signing is available and refuse their installation as root, preventing pack builds from sharing signer privileges.
|
|
626
|
+
|
|
627
|
+
- Enforce atomic per-tenant memory row and content-size limits, preserving existing knowledge when an oversized replacement is refused.
|
|
628
|
+
|
|
629
|
+
- Publish profile backups atomically with owner-only permissions, refuse existing output links/files and clarify the limits of text redaction.
|
|
630
|
+
|
|
631
|
+
- Detect unlabelled English BIP-39 seed phrases by checksum and Solana key arrays by their public key before persistence or export.
|
|
632
|
+
|
|
633
|
+
- Default new-wallet welcome credits to zero and refresh stale access-token holder entitlement before access; unverifiable ownership fails closed.
|
|
634
|
+
|
|
635
|
+
- Broaden address-poisoning checks, refuse unreadable history and apply the same recipient check to agent-account NFT handovers.
|
|
636
|
+
|
|
637
|
+
- Mark settled x402 payments for refund review when HTTP-200 JSON reports an application failure, including JSON-RPC errors.
|
|
638
|
+
|
|
639
|
+
- Share durable hourly X write limits across API and browser tools, workers and sessions; reserve all thread posts before sending.
|
|
640
|
+
|
|
641
|
+
- Scrub episode content and structured metadata, and use the same scrubbed knowledge text for keyword storage and vector embedding.
|
|
642
|
+
|
|
643
|
+
- Verify the expected X account before persisting an OAuth callback; bind login links and refreshed credentials to that account ID.
|
|
644
|
+
|
|
645
|
+
- Keep Signal identity stable across phone-number privacy changes by requiring the daemon account UUID; legacy phone-based permissions need review on upgrade.
|
|
646
|
+
|
|
647
|
+
- Label human transcript authors without implying owner authority and keep different senders distinct.
|
|
648
|
+
|
|
649
|
+
- Validate local dependency overlays, retain root ownership of fresh browser installations, and run deployment imports and migrations as the agent service account.
|
|
650
|
+
|
|
651
|
+
- Bind profile installs and updates to reviewed content digests and immutable remote commits; reject linked, special and oversized source files.
|
|
652
|
+
|
|
653
|
+
- Disable generated mass mentions and application links across chat transports; keep private command replies out of rooms and bound denial notices.
|
|
654
|
+
|
|
655
|
+
- Require authentication for API docs, schema and model discovery; expose detailed health metrics only on the administrator route.
|
|
656
|
+
|
|
657
|
+
- Reject lossy session identifiers instead of stripping or truncating them; API and console data paths require canonical IDs.
|
|
658
|
+
|
|
659
|
+
- Keep automatically indexed agent documents in a separate unreviewed collection; only explicit ingestion adds them to default knowledge recall.
|
|
660
|
+
|
|
661
|
+
- Enforce the autonomous tool ceiling during progressive loading and show the same restriction in catalog, search and describe results.
|
|
662
|
+
|
|
663
|
+
- Preserve brain and reasoning scrub state across streamed chunks; public rooms receive only complete, scrubbed replies.
|
|
664
|
+
|
|
665
|
+
- Confine browser downloads, frame automation alerts as quoted reports, and require PKCE with expiring, principal-bound OAuth callback state.
|
|
666
|
+
|
|
667
|
+
- Pin portal Markdown dependencies to current releases and verify their CDN bytes with SHA-384 subresource integrity.
|
|
668
|
+
|
|
669
|
+
- Drop Fly startup privileges before loading volume code, refuse root checkout installs, and stop persisting or sourcing process secrets as shell text.
|
|
670
|
+
|
|
671
|
+
- Require hashed release wheels for legacy optional installs, run the API container without root, bind Compose to localhost, and disable the retired TLS-key copying script.
|
|
672
|
+
|
|
673
|
+
- Autonomous coding-agent launchers refuse root; workspace and coding I/O reject hard-link escapes.
|
|
674
|
+
- Room and correspondent findings cannot enter owner memory; explicit job tools obey the current agent ceiling,
|
|
675
|
+
resumed autonomous sessions retain their classification, and persona/toolset edits require owner review.
|
|
676
|
+
- API accounts obey administrator blocks across protected routes; tenant consoles cannot create owner-authored
|
|
677
|
+
work, MCP hints cannot disable effect gates, and shared X credentials are unavailable to delegates.
|
|
678
|
+
- Persisted text redacts quoted credential keys, Basic authentication, URL userinfo, cookies and GitHub tokens;
|
|
679
|
+
file guards cover Docker, Kubernetes, GitHub and Solana credential stores.
|
|
680
|
+
|
|
681
|
+
- **The REPL history keeps no secrets:** `/config set` of a secret key and any line with a 64-hex key are not
|
|
682
|
+
recorded, the file is `0600`, and the display scrubber redacts a labelled private key.
|
|
683
|
+
- **An edited Telegram message never runs again:** edits are dropped before routing, so a corrected old `/send … go` or
|
|
684
|
+
`/pay … go` cannot move money twice; Telegram dedup keeps 24 h and honours `retry_after`.
|
|
685
|
+
- **API keys cannot mint or revoke keys;** key validation is cached 60 s and revoked at once; x402 charges only a new A2A
|
|
686
|
+
`message/send`, and a post-settlement failure is marked refund-due; `/api/chat/message` is payment-gated; uploads refuse symlinks.
|
|
687
|
+
- **Room offer cancel is compare-and-set:** a cancel can no longer overwrite an offer the settlement watcher just marked paid.
|
|
688
|
+
- **Console hardening:** an empty `WEBGATE_HOST` no longer binds all interfaces; own_ops refuses to boot without login
|
|
689
|
+
config; refused socket joins stay rate-limited; `/logout` clears storage without inline script; no server text in `innerHTML`.
|
|
690
|
+
- **ERC-6909 approvals are seen:** the guard refuses an ERC-6909 grant and measures a claim-token move like an
|
|
691
|
+
NFT's; the account approval scan and `agent_nft_revoke_all` cover ERC-6909 allowances and operators.
|
|
692
|
+
- **Agent-NFT account calls are held to the pinned collection:** the account's `token()` must be a pinned
|
|
693
|
+
collection with unchanged code; no asset may go to the account of an unminted token; and nothing may move
|
|
694
|
+
on the treasury side of an account call except the account paying its owner.
|
|
695
|
+
|
|
696
|
+
## [1.2.0] — 2026-10-02
|
|
697
|
+
|
|
698
|
+
### Added
|
|
699
|
+
|
|
700
|
+
- **Telegram avatar push.** `polyrob avatar push --telegram [--telegram-chat ID]` now sets the bot photo
|
|
701
|
+
(`setMyProfilePhoto`, JPEG) and each named group's photo (`setChatPhoto`); hash-idempotent, falls back
|
|
702
|
+
to the BotFather steps.
|
|
703
|
+
- **Check any wallet or token.** New read verbs `wallet_holdings`, `wallet_activity` and
|
|
704
|
+
`token_origin` (Solana and EVM), `positions` (the agent's own P&L), the `/check` command, and
|
|
705
|
+
cron price watches with an alert threshold.
|
|
706
|
+
- **One owner word per concept.** A glossary of owner words (chat, goal, scheduled job, decision,
|
|
707
|
+
holdings, limit, network, abilities, permissions and more) is now checked across the console, the
|
|
708
|
+
command help, Telegram and the terminal; the number of strings with an old word can only fall.
|
|
709
|
+
- **`/run` on Telegram and in the terminal:** list what runs in the background now, numbered, and
|
|
710
|
+
pause, resume or stop ONE run (`/run pause 2`). Before, only the `polyrob session` command could
|
|
711
|
+
do this. Refused inside a group.
|
|
712
|
+
- **Agent NFTs:** `/nft` lists the owned NFTs with their accounts, balances and open approvals;
|
|
713
|
+
`/nft send <id> <to> [go]` gives one away; a watch tells the owner when one arrives or leaves.
|
|
714
|
+
Sends, swaps, claims and portfolio reads take `account=` or `nft=`. Needs `AGENT_NFT_ENABLED`.
|
|
715
|
+
- **Agent NFTs:** the `agent_nft` tool (inspect, journal, revoke, mint, reveal, withdraw)
|
|
716
|
+
behind `AGENT_NFT_ENABLED` (default off). The treasury acts through an NFT's ERC-6551
|
|
717
|
+
account only as the NFT's owner; positions take `account=`.
|
|
718
|
+
- **NFT collections:** the owner pins one in `/etc/polyrob/agent_nft_collections.json`
|
|
719
|
+
(empty by default: every mint and reveal refuses). `tx_guard` checks exact mint and reveal
|
|
720
|
+
shapes; `AGENT_NFT_REVEAL_MAX_GAS_USD` (1.00) caps a reveal.
|
|
721
|
+
- **Cron write jobs:** `payload.write_verb` runs one allowlisted write verb (the collection
|
|
722
|
+
reveal) with no model turn, through its own gates and `tx_guard`. Off unless
|
|
723
|
+
`CRON_WRITE_JOBS_ENABLED=true`; only an owner-authored job may carry one.
|
|
724
|
+
- **Cron read jobs and pause windows:** `payload.read_verb` runs one allowlisted read verb
|
|
725
|
+
with no model turn (`deliver_on` `alert`, `always` or `never`); a tick inside
|
|
726
|
+
`payload.pause_windows` is skipped at $0. Read and write jobs may recur every minute.
|
|
727
|
+
- **Uniswap v4 liquidity:** `defi_data.pool_metrics` monitors a Pons v4 pool, `lp_pool_info`
|
|
728
|
+
and `lp_quote` read one, and `defi_trade.lp_add(protocol='v4')` adds a full-range
|
|
729
|
+
position. New caps `LP_ETH_CAP` (default 0), `LP_ETH_DAILY_CAP` and `LP_ETH_FLOOR`.
|
|
730
|
+
- **X login from chat:** `/x login` renews the agent's X API login from any owner seat
|
|
731
|
+
through a one-time authorize link (needs `X_OAUTH2_REDIRECT_URI`); `/x status`, `/status`
|
|
732
|
+
and `polyrob doctor` show the login state.
|
|
733
|
+
- **Packs:** optional extensions (`polyrob.packs` entry points, `pack.toml`) add tools,
|
|
734
|
+
verbs, routes and skills; `polyrob pack list|info|doctor|enable|disable|install|remove`,
|
|
735
|
+
`POLYROB_PACKS_DISABLED`.
|
|
736
|
+
- **Cron:** a job whose rail needs a credential only the owner can fix (an expired X login,
|
|
737
|
+
an X API 402) is skipped at $0 instead of running a model turn; the owner is told once.
|
|
738
|
+
- **Cron:** a job that names the same owner-only remedy on 3 runs in a row raises one owner
|
|
739
|
+
question: I will run it, or retire this job.
|
|
740
|
+
- **Owner money verbs:** `/send`, `/swap`, `/pay <url>`, `/writeoff` and `/unquarantine` on
|
|
741
|
+
Telegram and the REPL. The bare form quotes; `go` acts within the quote (+5%, or `max
|
|
742
|
+
<usd>`). The chain is never guessed; a token is an address. Not in rooms.
|
|
743
|
+
- **Action cards:** a money quote is a card with Confirm / Refresh / Cancel
|
|
744
|
+
(`/card_<id>_ok|re|no`); Confirm runs the quoted line once, with every gate. `/cards`
|
|
745
|
+
lists open cards; bare `/send` or `/swap` and the console's *Make a move* build the order.
|
|
746
|
+
- **Agent tools:** `present_choice(question, options)` shows 2–6 buttons and returns the
|
|
747
|
+
owner's pick; `propose_action(command, why)` puts a money verb to the owner as a card.
|
|
748
|
+
Both are refused in rooms, in sub-agents and in correspondent sessions.
|
|
749
|
+
- **Token trust:** `/wallet tokens`, `/wallet trust|untrust`, `polyrob wallet
|
|
750
|
+
pin-token|unpin-token|pins` and console Money › Book. A buy of an unproven look-alike asks
|
|
751
|
+
the owner once; a token this instance launched is trusted.
|
|
752
|
+
- **Buy targets:** a goal or cron job may declare `target_token: {chain, address}`; the run
|
|
753
|
+
then acquires no other non-canonical token, and the work it creates inherits the target.
|
|
754
|
+
- **Solana sends:** `defi_trade.solana_transfer` sends SOL or an SPL token by mint, creates
|
|
755
|
+
a missing token account, defaults to `dry_run`, and refuses Token-2022 transfer fees,
|
|
756
|
+
hooks and unknown extensions.
|
|
757
|
+
- **Wallet submissions:** `polyrob wallet submissions` lists unresolved submissions (one
|
|
758
|
+
blocks every send); `polyrob wallet release-submission <ref>` releases one only by booking
|
|
759
|
+
its worst-case charge (`--charge-usd`, or `--never-sent --reason`).
|
|
760
|
+
- **Wallet caps:** `polyrob doctor`, `/status` and `polyrob wallet set-cap` say when the
|
|
761
|
+
agent's cap is above the signer's hard cap in `signer.toml`, and name both remedies.
|
|
762
|
+
- **x402:** `x402_pay` joins the autonomous toolset when `DEFI_AGENT_AUTONOMY` is armed: up
|
|
763
|
+
to `X402_AUTONOMOUS_MAX_USD` it pays and reports, above it waits for `/approve`.
|
|
764
|
+
`x402_fetch` takes `request_id`, so a retry never pays twice.
|
|
765
|
+
- **Trading skills:** ten procedure skills (`token-identity`, `pre-trade-check`,
|
|
766
|
+
`trade-execution`, `exits`, `dca` and more); `treasury-trading` is split into five smaller
|
|
767
|
+
skills; `hyperliquid-trading` and `polymarket-trading` teach the basics.
|
|
768
|
+
- **Skills:** a skill's `requires` list pulls in at most two prerequisite skills past
|
|
769
|
+
`max_skills`; a disabled skill is never pulled back in.
|
|
770
|
+
- **Chat:** `/why [n]` lists the last gate refusals (default 5, at most 20) with the tool
|
|
771
|
+
and the gate's reason, on Telegram, the REPL and the console.
|
|
772
|
+
- **Chat:** `/cron list|show|add|edit|cancel` on Telegram and the REPL alike; `add` takes
|
|
773
|
+
`tools=` and `target=<address> chain=<chain>`, and `edit` changes the schedule or the
|
|
774
|
+
task.
|
|
775
|
+
- **Chat:** an owner question with lettered options (`A) … or B) …`) carries one answer
|
|
776
|
+
button per option on Telegram.
|
|
777
|
+
- **Cron:** `cronjob_show` returns a job's full definition; `cronjob_edit` changes a live
|
|
778
|
+
job in place (task, schedule, cap, rig, delivery, skills). An autonomous run may edit only
|
|
779
|
+
its own jobs.
|
|
780
|
+
- **Outward acts:** every outward act is one `external_write` telemetry row by class
|
|
781
|
+
(social, comms, public, money, code, self, network); an autonomous write in a class the
|
|
782
|
+
owner paused is refused. `EXTERNAL_WRITE_TELEMETRY` and `EXTERNAL_WRITE_PAUSE_GATE` (on).
|
|
783
|
+
- **Security ledger:** rate-limit trips are recorded and ranked. `scripts/security_scan.py`
|
|
784
|
+
runs pip-audit, gitleaks and host checks (exit 0 clean, 1 findings, 2 incomplete, 3
|
|
785
|
+
error); the verdict shows on the `security` status line.
|
|
786
|
+
- **Memory scopes:** a goal tree or a cron job can keep its memory in its own scope
|
|
787
|
+
(`AUTONOMY_MEMORY_REGIME` `shared`|`scoped`|`sealed`, default `scoped`); `polyrob owner
|
|
788
|
+
memory scopes`. Behind `MEMORY_SCOPES_ENABLED` (default off).
|
|
789
|
+
- **Rails:** standing work is configuration: a rail is an objective with a recurrence,
|
|
790
|
+
managed with `/rail` and `polyrob rails` (new, edit, on/off, grant, revoke, export,
|
|
791
|
+
import). A money grant stays inert unless money is armed.
|
|
792
|
+
- **Workers:** `delegate_task(profile="<id>")` runs an owner-approved worker with its own
|
|
793
|
+
brief, budget, model and tools; `polyrob workers` and `/workers`. The agent can only
|
|
794
|
+
propose a worker. Behind `WORKERS_ENABLED` (default off).
|
|
795
|
+
- **Wallet signer:** `polyrob-signer` is a separate process that holds the seed, re-runs the
|
|
796
|
+
money guard, signs only known shapes and holds anything above its caps in
|
|
797
|
+
`/etc/polyrob/signer.toml`. `WALLET_SIGNER=local|shadow|remote` (default `local`).
|
|
798
|
+
- **Files:** `filesystem_append_file` takes `after_anchor` and inserts after the one line
|
|
799
|
+
that contains it; no match or more than one match writes nothing.
|
|
800
|
+
- **Feishu / Lark surface:** set `FEISHU_APP_ID` and `FEISHU_APP_SECRET` (long connection,
|
|
801
|
+
extra `[feishu]`) or `FEISHU_TRANSPORT=webhook`; `OWNER_FEISHU_ID` makes it an owner seat.
|
|
802
|
+
In a group it answers only when @-mentioned.
|
|
803
|
+
- **DingTalk surface:** Stream Mode (no public URL, no extra), text in DMs and on an
|
|
804
|
+
@-mention in groups. Credentials `DINGTALK_CLIENT_ID` / `DINGTALK_CLIENT_SECRET`.
|
|
805
|
+
- **Surfaces:** `polyrob surfaces list | add | probe` shows each surface's flag and
|
|
806
|
+
credentials, stores a credential in the env file, and proves it with a read that never
|
|
807
|
+
sends.
|
|
808
|
+
- **Surfaces:** Discord, Slack and Signal read the owner's photos and files like Telegram
|
|
809
|
+
and email; a contact's files are named but never downloaded.
|
|
810
|
+
- **Telegram:** approval notices and `/pending` carry approve/reject buttons (a press counts
|
|
811
|
+
as the presser typing the command); the "/" menu comes from the verb table.
|
|
812
|
+
- **Telegram voice replies:** with `/prefs set voice.replies true` the agent also answers a
|
|
813
|
+
DM with a voice note (OpenAI speech or local espeak-ng). Off by default.
|
|
814
|
+
- **Chains:** Optimism as a read-only chain (token screens, prices, balances); no money
|
|
815
|
+
moves on it.
|
|
816
|
+
- **Pause:** `/pause release` holds the release train.
|
|
817
|
+
- **Money claims:** an outbound message that says money moved ("I paid $5") is refused as
|
|
818
|
+
`financial_claim_unverified` unless the wallet audit log or a settled invoice holds a
|
|
819
|
+
matching record. `FINANCIAL_CLAIM_GATE_ENABLED` (default on).
|
|
820
|
+
- **Custody status:** a `custody` status section says whether the process is non-dumpable
|
|
821
|
+
and its env scrubbed, and shows the lazy-install mode and the installed features.
|
|
822
|
+
- **Prompt cache:** `ANTHROPIC_CACHE_TTL` (`auto`|`5m`|`1h`, default `auto`): a 1h cache for
|
|
823
|
+
an interactive turn and 5m for an autonomous run, on the Anthropic API only. `/status`
|
|
824
|
+
economics shows cache `writes` (migration `v1.10.0`).
|
|
825
|
+
- **Knowledge:** a `knowledge` status section; the knowledge base indexes what the agent
|
|
826
|
+
writes (`KB_AUTO_INGEST_ARTIFACTS`, `polyrob kb reindex`); sessions expire after
|
|
827
|
+
`SESSION_RETENTION_DAYS` (90, `polyrob sessions prune`); repeated recall becomes one note.
|
|
828
|
+
- **Install:** `install.sh` installs POLYROB on Linux, macOS and WSL2 in one command
|
|
829
|
+
(`--uninstall` keeps your data). New `polyrob setup`, `service`, `uninstall`, `config
|
|
830
|
+
edit` and `tools enable|disable`; an optional extra installs on first use.
|
|
831
|
+
|
|
832
|
+
### Changed
|
|
833
|
+
|
|
834
|
+
- **Agent NFTs:** `agent_nft_withdraw_token` requires `to=`; it and `agent_nft_revoke_all` work
|
|
835
|
+
without the optional agent-NFT package.
|
|
836
|
+
- **The owner sign-in page and its errors read in plain words** ("Sign in to Rob").
|
|
837
|
+
- **Live-update refusals show a plain console sentence,** never the server's text.
|
|
838
|
+
- **The console nav says Chat and Rob;** the chats button has a visible name ("Chats ⌘K"), the
|
|
839
|
+
pause button says "Pause Rob", and the head lines are short and plain.
|
|
840
|
+
- **The avatar is an image slot.** Every new instance starts with the polyrob mark; set your own
|
|
841
|
+
from a file, a URL or an NFT (`polyrob avatar set`, `/avatar set`, `agent_avatar set_from` on an
|
|
842
|
+
owner turn). Every surface shows it.
|
|
843
|
+
- **Inbox cards say how long they have waited,** and when they expire if they can.
|
|
844
|
+
- **Rob > Overview shows each permission as a question with a Yes or No answer,** names what it
|
|
845
|
+
could not check in plain words, and says where memory is kept in words.
|
|
846
|
+
- **The console no longer shows labels in capital letters.**
|
|
847
|
+
- **The console no longer shows developer source footers;** the Inbox says in one line whether
|
|
848
|
+
every list answered.
|
|
849
|
+
- **Token reads:** prices come from DexScreener, GeckoTerminal and Jupiter and block a trade only
|
|
850
|
+
when they differ by more than 10 % (25 % on thin pools); the `token_info` screen adds on-chain
|
|
851
|
+
facts, Jupiter, RugCheck and Honeypot.is in a short summary. `DEFI_DATA_ENABLED` is on by default.
|
|
852
|
+
- **Replies:** the agent speaks to its user only with `send_message`; `done(text)` is the
|
|
853
|
+
run record. A cron `deliver` gets the run's last `send_message` (none sent, none
|
|
854
|
+
delivered); `style.verbosity=detailed` appends the record for the owner.
|
|
855
|
+
- **Prompts and tool text:** the model notes, the sub-agent contract, the output judge and
|
|
856
|
+
the tool descriptions match the code: `send_message` then `done`, `propose_action` for a
|
|
857
|
+
money move, `present_choice` for a choice, and the real units and limits.
|
|
858
|
+
- **Persona:** a chat seat renders the persona in `PERSONALITY_DEFAULT_CHARACTER`.
|
|
859
|
+
- **Skills:** the money, markets, X, discovery and general skills match the code and name
|
|
860
|
+
chat verbs, never a `polyrob …` command; money triggers no longer fire on common words,
|
|
861
|
+
and `secret-handling`, `person-analyzer` and others have narrower triggers.
|
|
862
|
+
- **First-party packs:** `discovery`, `markets` and `x` ship inside the `polyrob` wheel. ⚠️
|
|
863
|
+
Their SDKs stay extras (`polyrob[twitter]`, `[anysite]`, `[crypto]`); without one, the
|
|
864
|
+
pack's tools are withheld with the remedy. `install.sh --packs` adds them.
|
|
865
|
+
- **Markets pack:** the Polymarket and Hyperliquid tools are the `markets` pack; their
|
|
866
|
+
routes moved to `/api/packs/markets/polymarket/*` and `/api/packs/markets/hyperliquid/*`.
|
|
867
|
+
- **Owner authority:** in a genuine owner turn (chat, or `/send … go`, `/bridge … go`,
|
|
868
|
+
`/pay`) the autonomy pause and the autonomous ceiling do not apply; the caps and the
|
|
869
|
+
simulation bind everyone. An owner approval now sends, not re-queues.
|
|
870
|
+
- **Refusal taint:** after a money action fails or a gate refuses it, the rest of that run
|
|
871
|
+
cannot post to a public or non-owner destination; a public cron `deliver` goes to the
|
|
872
|
+
owner instead. A genuine owner turn clears the taint.
|
|
873
|
+
- **Token identity:** `defi_trade.swap`, `solana_swap` and `launchpad_buy` check WHICH
|
|
874
|
+
contract they buy before any quote: a symbol pinned to another address, a second contract
|
|
875
|
+
for a tracked symbol and an unverified token above $5 are refused.
|
|
876
|
+
- **Book:** `/book` and `defi_data.reconcile` warn when one symbol has more than one
|
|
877
|
+
contract, show positions the ledger does not list and each position's status, and no
|
|
878
|
+
longer claim trading is halted on a disagreement.
|
|
879
|
+
- **Copy:** owner-facing refusals name chat verbs (`/resume`, `/pending`), a daily-cap
|
|
880
|
+
refusal says when the cap frees, and the agent may not claim an act is queued or sent
|
|
881
|
+
without a tool result.
|
|
882
|
+
- **Telegram:** `/config set` shows where a flag write applies.
|
|
883
|
+
- **Lean base install:** `pip install polyrob` carries 24 base dependencies (was 36) and one
|
|
884
|
+
provider SDK; the rest moved to extras (`gemini`, `anthropic`, `memory-vector`, `docs`,
|
|
885
|
+
`media`, `server`). ⚠️ Without `server` an upload is refused with 503.
|
|
886
|
+
- **Goals:** `/goal cancel <id>` means never again (`--once` stops only this run; `/goal
|
|
887
|
+
allow` turns it back on). `/goals` shows what is off, who asked for each goal, and a `NOW
|
|
888
|
+
· STUCK · NEXT · OVER` summary.
|
|
889
|
+
- **Config:** `polyrob config set`, the REPL `/config set` (now with `--global`) and the
|
|
890
|
+
console validate and report the same way; a REPL write of a live-safe autonomy flag
|
|
891
|
+
applies at once, and `/autonomy on|off` needs no restart.
|
|
892
|
+
- **Owner rules:** `OWNER_RULES_IMMEDIATE` defaults on (a rule stated in chat binds on that
|
|
893
|
+
turn), `OWNER_DOC_MAX_CHARS` goes 1600 → 4000, a replaced rule moves under `##
|
|
894
|
+
Superseded`, and a `rules` status section names anything not loaded.
|
|
895
|
+
- **Records:** a workspace `.md` declares `kind: instruction | record`, and the file verbs
|
|
896
|
+
refuse to rewrite or delete a record (`DOC_KIND_ENFORCED`, default on). A cron job or goal
|
|
897
|
+
can pin its skills (`skills=[…]`).
|
|
898
|
+
- **Surfaces:** `polyrob gateway` starts Discord, Slack, Signal, WhatsApp and every new
|
|
899
|
+
surface once its credentials are set (`*_SURFACE_ENABLED=false` keeps one off); new
|
|
900
|
+
options `--skip`, `--no-autonomy`, `--idle-when-empty`, `--host`.
|
|
901
|
+
- **Webhooks:** a webhook surface can answer a platform challenge and ack before the turn
|
|
902
|
+
runs (replayed once after a restart); bodies are capped (64 KB, WhatsApp 3 MB) and a bot
|
|
903
|
+
is capped at 20 lines a minute.
|
|
904
|
+
- **Money regime:** the posture card shows `supervised`, `autonomous` or `armed` and names
|
|
905
|
+
what is missing; `AUTONOMOUS_RIG_DEFAULT=money_rail` no longer gives `defi_trade` to
|
|
906
|
+
agent-authored work outside `armed`.
|
|
907
|
+
- **Prices:** `token_info` names the pool behind a price and grades confidence on that
|
|
908
|
+
pool's depth; the busiest pool by 24h volume is picked; an unknown price stays unknown,
|
|
909
|
+
never `0.0`.
|
|
910
|
+
- **Prompt cache:** `TOOL_SCHEMA_STABLE_ORDER`, `STABLE_AUTONOMOUS_TOOLSET`,
|
|
911
|
+
`TOOL_RESULT_MAX_TOKENS` (6000) and `OPENROUTER_PROMPT_CACHE` default on; a restart
|
|
912
|
+
replays the rendered prompt (`FOUNDATION_REPLAY`) and catalog changes arrive at the tail.
|
|
913
|
+
- **Late tools:** a tool loaded mid-session grows `tools[]` (default), is deferred on an
|
|
914
|
+
Anthropic model that supports it (`ANTHROPIC_DEFERRED_TOOLS`, on), or goes through the
|
|
915
|
+
`tool_call` bridge (`TOOL_SCHEMAS_FROZEN`, off).
|
|
916
|
+
- **Preferences:** `voice.transcript_echo`, `stream.telegram` and
|
|
917
|
+
`delivery.lifecycle_daily_cap` are owner preferences.
|
|
918
|
+
- **Context:** a tool result reaches the model once; compaction thresholds are 70/85/95 %
|
|
919
|
+
(`COMPACTION_*_PCT`), old long tool results shrink to a pointer first, and old images
|
|
920
|
+
retire in batches. `/context` reads the provider's own token count.
|
|
921
|
+
- **Context:** the project-context file cap follows the model window (4%, 4,000–40,000
|
|
922
|
+
tokens); `MAX_EXTRACTED_CONTENT_SIZE` drops to 100,000 characters and
|
|
923
|
+
`MAX_EXTRACTED_CONTENT_TURN_SIZE` (200,000) bounds a turn.
|
|
924
|
+
- **Billing:** on OpenRouter the billed `usage.cost` outranks the catalog estimate; an
|
|
925
|
+
absent cost is `None`, never `0.0`.
|
|
926
|
+
- **Update:** `polyrob update --apply` reinstalls the extras you have under
|
|
927
|
+
`requirements.lock` and waits up to `--wait-idle` (1800 s) for running work (`--no-wait`,
|
|
928
|
+
`--force`).
|
|
929
|
+
- **Models:** an unknown `claude*` id resolves by family (`opus`, `sonnet`, `fable`,
|
|
930
|
+
`haiku`, bare `claude`) instead of a 200K sonnet row.
|
|
931
|
+
|
|
932
|
+
### Deprecated
|
|
933
|
+
|
|
934
|
+
- The venue API paths `/api/polymarket/*` and `/api/hyperliquid/*` still answer for one
|
|
935
|
+
release with a `Deprecation` header. Move clients to `/api/packs/markets/...`; 1.3.0
|
|
936
|
+
removes the old paths.
|
|
937
|
+
- `LAZY_DEPS_ENABLED` is a deprecated alias of `LAZY_DEPS_MODE` (`true` = `trusted`, `false`
|
|
938
|
+
= `off`).
|
|
939
|
+
|
|
940
|
+
### Removed
|
|
941
|
+
|
|
942
|
+
- **The Mindprint avatar generator.** `polyrob pfp` (generate, randomize, keep, say, studio), the
|
|
943
|
+
console's `/pfp.*` routes and the live terminal face are gone. A kept face is not carried over:
|
|
944
|
+
the slot shows the polyrob mark until you run `polyrob avatar set <image>`.
|
|
945
|
+
- **Dead prompt code:** the unused system-prompt managers and the shipped
|
|
946
|
+
`data/prompts/system_prompts.json` and `autov2_prompts.json`;
|
|
947
|
+
`send_message.timeout_seconds` left the schema (a call that passes it still works).
|
|
948
|
+
- **Separate first-party pack distributions,** `PROD_PACKS` and the per-pack closure files.
|
|
949
|
+
`install.sh`, `polyrob update` and `python -m migrations.migrate upgrade` retire a
|
|
950
|
+
leftover one.
|
|
951
|
+
- **Plain chat text is never a command.** A sentence that starts with stop, pause or resume
|
|
952
|
+
is chat; use `/pause` (`/halt`) and `/resume`. The plain-word approve/reject and the
|
|
953
|
+
`pause.phrases` preference are gone; use `/approve`, `/reject` or the tap tokens.
|
|
954
|
+
- The `VOICE_TRANSCRIPT_ECHO`, `TELEGRAM_INCREMENTAL_STREAM` and
|
|
955
|
+
`USER_DELIVERY_LIFECYCLE_DAILY_CAP` env flags (now owner preferences).
|
|
956
|
+
- The agent-writable `project/.pylibs` lazy-install directory.
|
|
957
|
+
- The unused `CompactionManager` policy and the dead `AUTO_KNOWLEDGE_RETENTION_DAYS`
|
|
958
|
+
setting.
|
|
959
|
+
|
|
960
|
+
### Fixed
|
|
961
|
+
|
|
962
|
+
- **Honest avatar replies.** `agent_avatar set_from` and Telegram `/avatar set` no longer claim the new
|
|
963
|
+
image is on every surface; they say the X/Telegram profile photos change only on `polyrob avatar push`.
|
|
964
|
+
- **`/x status` says what each X credential unlocks and how to restore it**: the API login
|
|
965
|
+
covers DMs (`/x login`); the browser session covers posts and outreach (`polyrob x-account capture-session`).
|
|
966
|
+
- **`polyrob dashboard` no longer creates `./data/task` in the folder it runs from:** with no
|
|
967
|
+
`DATA_ROOT`/`POLYROB_DATA_DIR`, its session tree is `<data home>/sessions`, the tree `polyrob`
|
|
968
|
+
writes. `HEAD /avatar.png` answers 200 instead of 405.
|
|
969
|
+
- **A console run that ended without a closing event no longer reads "Working for …" forever:** it
|
|
970
|
+
says "Stopped after … without a final word.", and the Timeline counts steps, not "actions".
|
|
971
|
+
- **`defi_data.positions` lists holdings open only in the position ledger** (bought before the rail
|
|
972
|
+
book) as LEDGER-ONLY with basis unknown, read-only; an unreadable ledger says "could not read".
|
|
973
|
+
- **The position-ledger reader keeps the first row per address**, so superseded rows left in the
|
|
974
|
+
`## Open positions` table no longer count twice or show up as reconcile mismatches.
|
|
975
|
+
- **Anthropic and Anthropic-compatible providers work again with `anthropic` 1.6:** a call no longer
|
|
976
|
+
fails with "unexpected keyword argument 'temperature'"; a third-party endpoint still receives the
|
|
977
|
+
sampling settings.
|
|
978
|
+
- **`launchpad_claim` labels its dollar line as the claim's gas fee** (`cost:`), not as the value
|
|
979
|
+
of what is claimed.
|
|
980
|
+
- **`polyrob wallet init` with no `--data-dir` writes the derivation scheme under `<home>/wallet`,**
|
|
981
|
+
where the running agent reads it; before, a bip44 wallet could resolve to a different address.
|
|
982
|
+
- **An operator-pinned Solana payment mint keeps its case;** before, the asset store lowercased it
|
|
983
|
+
and named an account that does not exist.
|
|
984
|
+
- **An unknown console address shows the error page instead of raw JSON;** it says what happened in
|
|
985
|
+
plain words and keeps the details behind "Show details".
|
|
986
|
+
- **`cronjob_show` names the job's provider pin** — `provider: (owner's seat)` or `<pin> (pinned)`,
|
|
987
|
+
and for a credit-dead pin, the seat it reroutes to (or that runs are skipped).
|
|
988
|
+
- **The console no longer shows a stuck rate-limit banner after a few page loads;** live updates
|
|
989
|
+
resume by themselves.
|
|
990
|
+
- **A credit top-up now unlatches the provider on its own.** At most once per 5 minutes the goal
|
|
991
|
+
dispatcher re-checks a latched seat's balance (OpenRouter `/credits`) and releases the seat only
|
|
992
|
+
when the provider reports a positive balance.
|
|
993
|
+
- **The chat page no longer clips the file pane or covers it with the message box;** on a phone the
|
|
994
|
+
pane opens as a drawer ("Files and steps").
|
|
995
|
+
- **A chat's Files list shows only the files that chat wrote,** plus what you gave it; the
|
|
996
|
+
shared project folder is behind one link with its size.
|
|
997
|
+
- **The chat's file list reads at most 500 entries four folders deep** and no longer re-reads the
|
|
998
|
+
folder every 30 seconds while live updates work.
|
|
999
|
+
- **Starting a task where no language model is available now fails with a clear reason** (503
|
|
1000
|
+
`no_model`) instead of an empty chat; the console keeps your text and names Telegram and the terminal.
|
|
1001
|
+
- **A chat shows your question even when the run failed;** a scheduled job's run says it is not a
|
|
1002
|
+
chat, with its task behind a disclosure. A bound chat's tab says Chat, not New.
|
|
1003
|
+
- **The chats list names who started each chat,** tells a failed chat from a stopped one, shows
|
|
1004
|
+
finished chats in a neutral colour and shows times in your time zone.
|
|
1005
|
+
- **The chats list no longer shows raw file errors.** A row with a part that would not read says
|
|
1006
|
+
"Part of this chat is missing."; the rows say "Done", "Unknown", "Untitled chat" and "Watch only".
|
|
1007
|
+
- **Reopening a long chat shows its newest events,** not its oldest.
|
|
1008
|
+
- **The chat no longer draws a step twice** or misses one that happened while the page loaded.
|
|
1009
|
+
- **Messages you add while Rob works now show in the chat.**
|
|
1010
|
+
- **A chat that failed now says so;** a chat waiting for your answer no longer shows as stopped.
|
|
1011
|
+
- **The chat no longer lists sending a reply or finishing as steps,** draws each reply under its
|
|
1012
|
+
own steps, and ends each turn with its own summary.
|
|
1013
|
+
- **Chat step times and the turn duration show real times** instead of 0:00 and 0s, and a
|
|
1014
|
+
receipt says "1 step", not "1 actions".
|
|
1015
|
+
- **On a phone, the Schedule table labels its first column** ("What it does") again.
|
|
1016
|
+
- **The Work pane names a partial file read** instead of drawing a blank line.
|
|
1017
|
+
- Token reads: Arbitrum and Polygon had no price, Solana holdings lost decimals and Token-2022,
|
|
1018
|
+
Alchemy read one page, `reconcile` never said CLEAN on an airdropped wallet, and an unknown
|
|
1019
|
+
cost basis was stored as $0.
|
|
1020
|
+
- Every tool call now records its completion. Before, the console, the REPL fallback and
|
|
1021
|
+
Telegram progress never saw a tool finish, because the completion was written only on a code
|
|
1022
|
+
path that never ran.
|
|
1023
|
+
- Session feed folders no longer fill with lock files.
|
|
1024
|
+
- A reply could fail to appear live in the console until a reload.
|
|
1025
|
+
- Events of a session resumed after a restart no longer overwrite its first events.
|
|
1026
|
+
- Rob no longer stores the conversation context it is given as a memory of its own.
|
|
1027
|
+
- **ERC-8004 identity:** `read_agent_id` works on a registry that is not ERC721Enumerable
|
|
1028
|
+
(the Robinhood Chain registries), so the double-registration check no longer says "could
|
|
1029
|
+
not check"; agentId 0 is a real id.
|
|
1030
|
+
- **Money figures:** `defi_data.portfolio` values canonical and pinned tokens first, so the
|
|
1031
|
+
wallet's own position no longer shows as raw units; `launchpad_claim` prints what a claim
|
|
1032
|
+
is worth. The agent gives the owner only tool-printed money figures.
|
|
1033
|
+
- **Stall reports:** each stall of the goal pipeline names itself (`stall #N` and the time),
|
|
1034
|
+
so a later stall is no longer dropped as a duplicate.
|
|
1035
|
+
- **Prompts:** the per-step reminder, the correspondent DM framing, the browser and
|
|
1036
|
+
Polymarket blocks and `<owner-instructions>` name only what the session really has; the
|
|
1037
|
+
background reviewer now sees the work it reviews.
|
|
1038
|
+
- **Browser:** `search_google` URL-encodes the query; a `&`, `#` or `%` no longer cuts it.
|
|
1039
|
+
- **Apps:** the approve hints name `/apps approve` and the console, not a shell command.
|
|
1040
|
+
- **Tools:** `session_search(collection=…)` says so when the knowledge base is off or
|
|
1041
|
+
failing.
|
|
1042
|
+
- **Skills:** a cron-only session no longer gets `dca` or `exits`, matched skills are
|
|
1043
|
+
delivered first and can be loaded again after compaction, and one malformed user rule no
|
|
1044
|
+
longer drops every skill.
|
|
1045
|
+
- **Runtime nudges:** the planning, empty-action, loop and verify-before-done nudges enter
|
|
1046
|
+
history as control messages, not as a user turn, so a nudge can no longer become the
|
|
1047
|
+
active task; the texts name only registered actions.
|
|
1048
|
+
- **X OAuth 2.0:** a refused refresh token records a re-login verdict naming `/x login` and
|
|
1049
|
+
is not re-sent; two processes no longer spend the same refresh token; DMs fall back to the
|
|
1050
|
+
OAuth 1.0a keys on a 401.
|
|
1051
|
+
- **X posts:** a new tweet that is not readable yet is reported as X lag, not as a failed
|
|
1052
|
+
post.
|
|
1053
|
+
- **`polyrob x-account`:** on a deployed box it acts on the deployed data home and refuses
|
|
1054
|
+
when a key it needs is missing; before, it wrote a record the agent could not read.
|
|
1055
|
+
- **Deploy:** `RESTART_ONLY=1` restarts every unit that reads `/etc/polyrob/polyrob.env`.
|
|
1056
|
+
- **Approvals:** a decided Telegram button is removed; the REPL and the console chat box run
|
|
1057
|
+
the tap tokens (`/approve_p_<hex>`, `/fulfill_<ask>_<letter>`); the fallback grant card
|
|
1058
|
+
carries one-tap tokens.
|
|
1059
|
+
- **Money:** a send whose outcome is unknown says "outcome unknown — do not send again",
|
|
1060
|
+
never "NOT sent"; such a bridge stays `in_flight`.
|
|
1061
|
+
- **Packs:** a pack's money verbs can register, pack faults are isolated per pack, and
|
|
1062
|
+
`polyrob update` installs the `markets` pack for a `crypto` install.
|
|
1063
|
+
- **Wallet:** `defi_trade.transfer` sends the native gas asset (`token='native'`); a repeat
|
|
1064
|
+
`/send` to a Solana address is no longer a replay; a run that can never sign no longer
|
|
1065
|
+
raises an approval.
|
|
1066
|
+
- **Wallet:** an unreadable pin or position store reads as UNREADABLE, not empty; chain
|
|
1067
|
+
names are case-insensitive; `approve_token` clamps a near-balance amount; armed goal runs
|
|
1068
|
+
can transfer, not only swap.
|
|
1069
|
+
- **x402:** a payment above $1 is no longer refused by the SDK's default; a multi-network
|
|
1070
|
+
challenge is paid on Base USDC; a metered URL is payable more than once; the replay key is
|
|
1071
|
+
stored whole before signing.
|
|
1072
|
+
- **Chat:** a cron job created from chat gets `CRON_DEFAULT_MAX_DURATION_SEC`; "resume",
|
|
1073
|
+
"continue" or "restart" never pause.
|
|
1074
|
+
- **Coding:** the verify-before-done and ship-what-was-tested gates fire again and no longer
|
|
1075
|
+
fire on prose edits or a refused `run_tests`; `run_tests` writes its full output to a log
|
|
1076
|
+
and gets 300 s.
|
|
1077
|
+
- **Coding:** edits keep CRLF, BOM, mode and hard links, refuse binary and read-only files
|
|
1078
|
+
and write atomically; `apply_patch` matches hunks more reliably; TypeScript checks use the
|
|
1079
|
+
nearest `tsconfig.json`.
|
|
1080
|
+
- **Telegram:** `/bridge … go` above the autonomous ceiling no longer freezes the bot; it
|
|
1081
|
+
reports when it lands.
|
|
1082
|
+
- **Publishing:** `publish` accepts a directory such as `dist/`, swaps in a complete new
|
|
1083
|
+
version of a live page and reports a failed promotion.
|
|
1084
|
+
- **Hyperliquid:** agent approval, leverage changes and order cancellations enter the owner
|
|
1085
|
+
approval queue in both payment modes.
|
|
1086
|
+
- **Skills:** skill provenance is per tenant; chained `patch_skill` edits make one pending
|
|
1087
|
+
item; a queued owner rule offers a tappable `/approve_p_<hex>`.
|
|
1088
|
+
- **Autonomy:** rails keep a money-free base, seeders recheck due state, direct cron room
|
|
1089
|
+
delivery respects the pause, and a failed database read is unreadable, not empty.
|
|
1090
|
+
- **Console:** the wallet views show the submission journal again, and Money's Cash and
|
|
1091
|
+
Limits say when the ledger could not be read instead of showing zeros.
|
|
1092
|
+
- **X:** the startup self-test uses the credential the client really carries (no false `403
|
|
1093
|
+
Forbidden`).
|
|
1094
|
+
- **Owner thread:** records the true surface and refuses a cron `deliver_target` that is not
|
|
1095
|
+
the owner's own address.
|
|
1096
|
+
- **Webhooks:** failed turns are kept and pending events retry on redelivery.
|
|
1097
|
+
- **Runtime:** admin token checks and billing reconciliation work again; X cooldown
|
|
1098
|
+
telemetry no longer raises `NameError`; speech converters get no credentials and are
|
|
1099
|
+
stopped on timeout.
|
|
1100
|
+
- **MCP:** a cached MCP resource read no longer fails.
|
|
1101
|
+
- **Uninstall:** `polyrob uninstall --purge` names and deletes both homes behind a typed
|
|
1102
|
+
confirmation; `polyrob doctor` reads system units too.
|
|
1103
|
+
- **Install:** `requirements.lock` serves Python 3.11 again; a missing extra is named
|
|
1104
|
+
instead of a raw `ModuleNotFoundError`; `polyrob update` no longer reads a `pid: 0` marker
|
|
1105
|
+
as a live turn.
|
|
1106
|
+
- **Context:** the emergency prune keeps at least the last 3 messages with complete tool
|
|
1107
|
+
pairs.
|
|
1108
|
+
- **Console Inbox:** a `tool_approval` card shows the full grant card, not a 160-character
|
|
1109
|
+
preview.
|
|
1110
|
+
- **REPL approvals:** `[s]ession` and `[a]lways` no longer widen a money action to every
|
|
1111
|
+
later amount; a money action offers only once, deny or never.
|
|
1112
|
+
- **Console:** `/send … go` or `/bridge … go` in the chat box answers "started" at once; the
|
|
1113
|
+
result arrives as a notice.
|
|
1114
|
+
- **Cron:** a job is no longer skipped as an X DM job because its task text quotes or
|
|
1115
|
+
forbids a DM.
|
|
1116
|
+
|
|
1117
|
+
### Security
|
|
1118
|
+
|
|
1119
|
+
- **Feishu/Lark webhooks are signed or refused:** an event outside a ±5-minute timestamp
|
|
1120
|
+
window is refused, and token-only mode (no `FEISHU_ENCRYPT_KEY`) refuses every event unless
|
|
1121
|
+
`FEISHU_WEBHOOK_ALLOW_UNSIGNED=true`.
|
|
1122
|
+
- **A cross-chain bridge from an EVM chain pays only Relay's pinned deposit contracts:** a quote
|
|
1123
|
+
naming any other `to` refuses before signing (the Solana origin already pinned the program).
|
|
1124
|
+
- **`polyrob-signer` spends an owner's over-cap grant when a send may have left**, so one approval
|
|
1125
|
+
cannot carry a second over-cap send after an unknown outcome or a failed ledger write.
|
|
1126
|
+
- **An installed skill's reference files get the same Unicode and bidi-override scan as its
|
|
1127
|
+
`SKILL.md`.**
|
|
1128
|
+
- **Agent NFTs:** a pinned collection's token leaves a wallet only when its account has no open
|
|
1129
|
+
approval, and `tx_guard` re-checks the collection's `runtime_sha256` on every mint, reveal
|
|
1130
|
+
or move; an unreadable or changed check refuses.
|
|
1131
|
+
- **Token-bound accounts:** `tx_guard` refuses the Tokenbound forwarder, an account selector
|
|
1132
|
+
at any calldata offset (including `executeNested`), and any move of an NFT into an account
|
|
1133
|
+
of its own collection; only one exact approve, call, reset `executeBatch` passes.
|
|
1134
|
+
- **NFT sale safety:** the open-approval scan covers ERC-20, ERC-721 and Permit2 grants of
|
|
1135
|
+
an NFT's account, with guarded ERC-721 and Permit2 revoke shapes. A read-only
|
|
1136
|
+
`robinhood-testnet` chain (`DEFI_EVM_RPC_ROBINHOOD_TESTNET`) serves the account reads.
|
|
1137
|
+
- **Money and outbound rails:** launchpad `slippage_bps` is capped at 1000; `email_send` has
|
|
1138
|
+
the same forged-turn gate as `message`; a leaf sub-agent cannot ask the owner; the markets
|
|
1139
|
+
pack's own-account reads are blocked for correspondents.
|
|
1140
|
+
- **Skills:** a user skill can never take a builtin or pack skill id (before,
|
|
1141
|
+
`secret-handling` could be replaced).
|
|
1142
|
+
- **Correspondent sessions:** memory recall, the digests, the continuity bridges and the
|
|
1143
|
+
health note are skipped in a session whose output goes to a third party.
|
|
1144
|
+
- **Untrusted framing:** browser, MCP and web results, recalled summaries, delegated parent
|
|
1145
|
+
context and attached text files are wrapped as untrusted data on every path.
|
|
1146
|
+
- **Packs:** a manifest cannot grant itself first-party privileges; third-party code packs
|
|
1147
|
+
are refused while the process holds the wallet seed.
|
|
1148
|
+
- **Money:** only the owner's own approval lifts the autonomous ceiling; a dapp page's
|
|
1149
|
+
transaction is never an owner turn; a failed pause probe or ledger result refuses.
|
|
1150
|
+
- **Wallet:** the agent's file tools cannot write the owner pin and token-provenance stores.
|
|
1151
|
+
- **Publishing and coding:** published pages carry the vhost's security headers (re-run
|
|
1152
|
+
`scripts/setup_publish_vhost.sh`); `coding.grep` applies the read policy to every file.
|
|
1153
|
+
- **Custody:** the custody process is non-dumpable and the seed variables leave
|
|
1154
|
+
`os.environ`, so a child cannot read them; a mistyped seed never reaches a log; the wallet
|
|
1155
|
+
audit files are `0600`. ⚠️ No core dumps and no `py-spy`/`gdb` attach.
|
|
1156
|
+
- **Installs:** every install is hash-pinned by `requirements.lock`. Lazy installs go
|
|
1157
|
+
through one trusted installer (`LAZY_DEPS_MODE` `off|trusted|legacy`, default `trusted`).
|
|
1158
|
+
⚠️ A server without custody now installs lazily; `LAZY_DEPS_MODE=off` keeps the refusal.
|
|
1159
|
+
- **Approvals:** an approve counts as an exit only to a pinned route spender; the approval
|
|
1160
|
+
card shows every money field and a calldata digest.
|
|
1161
|
+
- **Swaps:** every EVM swap asserts its minimum output; `solana_swap` checks the simulated
|
|
1162
|
+
output and refuses an unobserved output mint.
|
|
1163
|
+
- **Solana guard:** every top-level token and system instruction is decoded (authority
|
|
1164
|
+
changes, closes, durable nonces and a fee above 0.01 SOL refuse), and the Solana bridge
|
|
1165
|
+
requires the pinned Relay program.
|
|
1166
|
+
- **Generic call and dapp:** position managers, v4 pool managers, Permit2 and Pons contracts
|
|
1167
|
+
are reachable only through their typed verbs; Permit2 grants are refused.
|
|
1168
|
+
- **Deploy:** `deploy_token` refuses `vanity` / `salt` and must mint exactly the supply to
|
|
1169
|
+
the wallet; the ERC-8004 agentId comes from the receipt and a second registration in
|
|
1170
|
+
flight is refused.
|
|
1171
|
+
- **Payments:** the deposit monitor credits only the increase; every EVM invoice gets a
|
|
1172
|
+
random sub-cent tail; a canceled subscription is never reactivated; an x402 authorization
|
|
1173
|
+
over 600 s is refused.
|
|
1174
|
+
- **Gates:** wallet reads are owner-scoped; Hyperliquid and Polymarket bind the tenant per
|
|
1175
|
+
call; `/pause trading` binds every entry verb; a forwarded Telegram message taints the
|
|
1176
|
+
turn.
|
|
1177
|
+
- **Runtime:** money verbs run off the event loop; a reverted swap writes no position; LP
|
|
1178
|
+
add and remove check the pool price and cap slippage at 1000 bps; the bridge re-authorizes
|
|
1179
|
+
after an owner wait.
|
|
1180
|
+
|
|
1181
|
+
## [1.1.0] — 2026-09-21
|
|
1182
|
+
|
|
1183
|
+
### Fixed (interface deep audit — 2026-09-21)
|
|
1184
|
+
Five parallel audits of the console, the HTTP/A2A/OpenAI-compat API, the CLI, the
|
|
1185
|
+
REPL, Telegram/email and cross-surface parity found ~270 defects; all are closed in
|
|
1186
|
+
this pass. The behaviour-visible ones:
|
|
1187
|
+
- **Console** — `GET /api/webgate/pending` renders the same composer as the Inbox
|
|
1188
|
+
(a locked queue is NAMED, never a shorter list); Work › Now reads `live.goals`
|
|
1189
|
+
(un-windowed) and dedupes against `session_id`; an ask can be ANSWERED in writing
|
|
1190
|
+
(`{"answer"}` rides through `GoalBoard.decide_ask(answer=)` into the retry prompt);
|
|
1191
|
+
a Pause/Resume control in the shell header; app Kill/Logs, file links, the chat
|
|
1192
|
+
file picker, Keep for the avatar; `command_reply` rendered for a slash verb (and a
|
|
1193
|
+
verb typed on the cold open no longer becomes a session task); knowledge/worklog/
|
|
1194
|
+
artifacts/invoices/live readers carry typed error/partial/`filtered_out`/
|
|
1195
|
+
`outstanding_*` fields; the `/pending` and `/profile` pages, `/api/sessions`
|
|
1196
|
+
(a 1,790-dir synchronous walk), `/api/session/{id}/stats`, the CDN script tags,
|
|
1197
|
+
and 19 dead assets are gone; `docs/guide/console.md` and the README match the tree.
|
|
1198
|
+
- **API** — ONE public-path allow-list shared by both auth gates (`api/auth_constants.py`;
|
|
1199
|
+
SIWE, the agent card, x402 challenge/pay and pricing were 401 whenever `API_SECRET`
|
|
1200
|
+
was set, and a settled x402 payment then got a 401 with no refund); x402 settles
|
|
1201
|
+
ONLY on the gated routes; `rob_xxx` API keys validate without `ENABLE_AUTH`;
|
|
1202
|
+
`API_AUTH_TOKEN` is a `service` role on `X-Service-Token` (not admin; `X-API-KEY`
|
|
1203
|
+
works one more release with a WARN) and `GET /api/test-auth` is deleted;
|
|
1204
|
+
`/api/task/metrics` is admin-only; `/health` can be degraded; A2A artifacts have a
|
|
1205
|
+
real tenant-scoped `GET …/workspace/{path}`, `initializing` is WORKING, push URLs
|
|
1206
|
+
pass the SSRF validator, every session op routes through `guard_remote`, `cancel`
|
|
1207
|
+
checks ownership; `polyrob serve --workers N>1` refuses unless
|
|
1208
|
+
`API_AUTONOMY_RUNTIME=false`; `/v1/chat/completions` threads `temperature`,
|
|
1209
|
+
400s (OpenAI-shaped) on unsupported params, marks `usage.estimated`; ERC-8004
|
|
1210
|
+
`trustMode: onchain` needs a real agent_id + registry; docs corrected.
|
|
1211
|
+
- **CLI** — every owner/admin verb reads the deployed data home
|
|
1212
|
+
(`admin_data_dir`) and the owner tenant (`keys`, `wallet init|book|bridges|overview`,
|
|
1213
|
+
`owner invoices|settle|sub|correspondents|approve`, `approvals`, `apps`, `cron`,
|
|
1214
|
+
`session`, `subagents`, `finance` were on a shell/CWD home — a confident zero over a
|
|
1215
|
+
live store); `goals list|tree` read `list_recent`/`status_counts`; `surface list`
|
|
1216
|
+
reads the real dead-target store; EIP-55 kept on `wallet asset add`; `doctor --json`
|
|
1217
|
+
is the typed snapshot; `wallet set-cap` writes the live pref; new verbs
|
|
1218
|
+
`wallet claim|nft|dapp`, `identity register|set-uri`, `owner correspondents --history`,
|
|
1219
|
+
`owner paid enable|disable|price|asset|offers`, `owner groups admins`.
|
|
1220
|
+
- **REPL** — addresses/paths/tx hashes are no longer redacted; `/approve <id>`
|
|
1221
|
+
DECIDES on every seat (`/gates` manages the gates); `/reject` reads the union;
|
|
1222
|
+
`/cron list|add|cancel`; `/groups /mute /unmute /ban /unban /paid /cancel /new
|
|
1223
|
+
/start /claim /nft /dapp /contacts /identity`; `/apps <verb>`; `/status` is the
|
|
1224
|
+
snapshot and `/meter` the token meter; full session ids; one empty grammar.
|
|
1225
|
+
- **Telegram** — help is RENDERED from `core.verbs` (one SSOT, contract-tested);
|
|
1226
|
+
a room admin can no longer self-grant `admin`; `blocked` fails CLOSED; a paired
|
|
1227
|
+
sender on a forgeable surface (email) is never OWNER; free `/mute /ban` no longer
|
|
1228
|
+
raise; `/bridge /launch /deploy /lp` no longer block the polling loop; `/goal <id>`
|
|
1229
|
+
resolves without `board.list`; `/wallet balances` shows the LIVE caps and the
|
|
1230
|
+
cap note names `/config set budget.wallet_per_tx_usd`; `/paid cancel` is
|
|
1231
|
+
room-scoped; `/missed` is unclipped; a correspondent's attachment is named;
|
|
1232
|
+
`/cron /goal /fulfill` refused from a room; room toolset is a closed allowlist.
|
|
1233
|
+
- **Email + delivery rails** — see the D-section of the review (BODY.PEEK, dedup
|
|
1234
|
+
after dispatch, honest queue outcomes, pause gate on `email_send`, secret scrub,
|
|
1235
|
+
IMAP verdicts, attachments on AgentMail, HTML-only bodies, thread anchors).
|
|
1236
|
+
- **Parity contract** — `tests/unit/test_surface_parity.py` scans every console
|
|
1237
|
+
router, carries 27 new rows (six of them all-`None` on purpose), and gains
|
|
1238
|
+
`test_repl_covers_every_telegram_owner_verb` + `test_board_view_never_calls_list`
|
|
1239
|
+
+ `test_repl_help_group_matches_core_verbs`.
|
|
1240
|
+
- **Revalidation pass (same day)** — four fresh reviewers re-read the eight commits and
|
|
1241
|
+
their dependents; ~45 more defects closed. The ones that mattered: the workers>1 refusal
|
|
1242
|
+
lived only in the CLI (the systemd entry `main.py` skipped it — now in `server_boot`);
|
|
1243
|
+
`require_service`'s 503 was unreachable (the container accessor RAISES, so `/api/hyperliquid|
|
|
1244
|
+
mcp|polymarket|admin` and SIWE answered 500); `X-Service-Token` could not pass CORS
|
|
1245
|
+
preflight and the console still proxied the operator token under `X-API-KEY`; the `/v1`
|
|
1246
|
+
OpenAI envelope skipped middleware-level 401/413; `/health` could 500 on a non-numeric
|
|
1247
|
+
metric; the agent-callable `read_emails` still used `RFC822` (which set `\Seen` and
|
|
1248
|
+
emptied the surface's inbound queue); the new outbound-queue status line looked for
|
|
1249
|
+
`outbox.db` on the wrong axis; a queued cross-process delivery was journalled `failed`;
|
|
1250
|
+
the AgentMail outage verdict could never clear; `/help gates` said "unknown command"; a
|
|
1251
|
+
room admin's `blocked` grant and the paired-email rule re-proven; `/fulfill <id> [answer]`
|
|
1252
|
+
and `/approve <id> <answer>` carry the owner's words on every seat; every CLI money ACTION
|
|
1253
|
+
spent under the SHELL's tenant while every VIEW read the deployed one; a `/dapp` READ
|
|
1254
|
+
created `dapp_sessions.db`; `KV_RE` never claimed `private_key`/`mnemonic`/`seed_phrase`/
|
|
1255
|
+
`passphrase`/`keystore` (they survived every scrubber verbatim); `refund_due` (a settled
|
|
1256
|
+
machine payment we owe back) now has one status vocabulary (`modules/x402/invoice_status.py`),
|
|
1257
|
+
a ledger line, a status WARN, a critical-lane owner notice and a listing filter on every seat;
|
|
1258
|
+
paid-room remedies are seat-aware; six REPL help groups matched to `core.verbs`; the
|
|
1259
|
+
`GROUP_TURN_TOOLS`/`INBOUND_MEDIA_ENABLED`/`API_AUTH_TOKEN` flag rows corrected (+regen).
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
### Added (057 — runtime structural upgrade, implemented 2026-09-20)
|
|
1263
|
+
All flag-gated and default-inert unless noted; prod arms them per the proposal's
|
|
1264
|
+
§4 defaults. Full flag table in `docs/CONFIGURATION.md` (24 new rows).
|
|
1265
|
+
- **WS-A tool rigs** — `core/config_policy/rigs.py` (the ONE table `money_rail` /
|
|
1266
|
+
`social` / `research` / `ops` / `full`, fixed id order); `payload.rig` on cron jobs
|
|
1267
|
+
and goals, `polyrob cron edit --rig`, `AUTONOMOUS_RIG_DEFAULT`;
|
|
1268
|
+
`AUTONOMOUS_TOOL_DISCLOSURE` lets an autonomous session widen a narrow rig;
|
|
1269
|
+
`STABLE_AUTONOMOUS_TOOLSET` + `TOOL_SCHEMA_STABLE_ORDER` keep the cached prompt
|
|
1270
|
+
prefix byte-stable; the email tool's catalog status reads `gated:credentials-rejected`.
|
|
1271
|
+
- **WS-B budgets by session class** — `agents/task/session_class.py` is the ONE
|
|
1272
|
+
answer to "is this session autonomous"; `AUTONOMOUS_CONTEXT_BUDGET_TOKENS` makes
|
|
1273
|
+
compaction reachable; `TOOL_RESULT_MAX_TOKENS`, `AUTONOMOUS_READ_PAGE_LINES`,
|
|
1274
|
+
`AUTONOMOUS_MAX_OUTPUT_TOKENS`, `LLM_OUTPUT_TRUNCATION_RETRY` (+ the
|
|
1275
|
+
`llm_output_truncated` event), `LLM_TIMEOUT_BY_OUTPUT` (timeout sized by expected
|
|
1276
|
+
output, not input), `LLM_TIMEOUT_REROUTE`, `AUTONOMOUS_SCREENSHOT_ON_BROWSER_ONLY`;
|
|
1277
|
+
`write_file`/`append_file` results carry `size_bytes` + `sha256`.
|
|
1278
|
+
- **WS-C pre-empt without discarding** — `payload.preempts` (default = money) is the
|
|
1279
|
+
pre-emption property; the yield is scoped to the goal holding the workspace (the
|
|
1280
|
+
planner is never cancelled), attaches artefacts before the cancel unwinds, and is
|
|
1281
|
+
a `goal_run yielded` event; `GOAL_YIELD_GRACE_SEC`, `GOAL_RESUME_SAME_SESSION`
|
|
1282
|
+
(+ `goal_run resumed`), `GOAL_PREFLIGHT_ENABLED`/`_STEP_SEC` (056 WS5 2b),
|
|
1283
|
+
`GOAL_YIELD_AGEING`, `CRON_DEFAULT_MAX_DURATION_SEC`; deferrals are `goal_run
|
|
1284
|
+
deferred` events; the yield probe runs inside the TickLock; the change gate never
|
|
1285
|
+
gates a money job; `polyrob cron prune`, `cron list` hides cancelled; the goal
|
|
1286
|
+
dispatcher reads the cross-process turn marker.
|
|
1287
|
+
- **WS-D provenance** — `source=`/`observed_at=` on `owner_doc_manage` /
|
|
1288
|
+
`self_context_manage` (changed lines stamped ` [from: <source> <date>]`),
|
|
1289
|
+
`DOC_CLAIM_PROVENANCE_REQUIRED` (a FORMAT guard on claim-shaped lines), the
|
|
1290
|
+
foundation block states the docs' age, and a room's allowlist note renders as a
|
|
1291
|
+
dated LABEL, never its name (`core/surfaces/room_label.py`; `group_allowlist.updated_at`).
|
|
1292
|
+
- **WS-E verification** — `core/rails/verification.py` is the ONE per-rail proof table
|
|
1293
|
+
(x_post / x_reply / telegram_channel / telegram_group / email / onchain), rendered
|
|
1294
|
+
on the `message`, `x_post`/`x_reply` and `email_send` results, cited by
|
|
1295
|
+
`room_read`, generated into `docs/guide/rails-verification.md`; the corrupted
|
|
1296
|
+
bullet in the `x-engagement` skill is repaired.
|
|
1297
|
+
- **WS-F durable rail verdicts** — `core/credential_verdicts.py` is a store
|
|
1298
|
+
(`verdicts.db`, `first_seen`/`last_seen`/`count`, shared by every unit); the email
|
|
1299
|
+
surface polls IMAP without the SMTP probe; the X API 402 is a durable
|
|
1300
|
+
`x_api_rejected` event; a missing key is a verdict warned once per process.
|
|
1301
|
+
- **WS-G identities** — `polyrob doctor --perms [--strict]` over `core/data_perms.py`;
|
|
1302
|
+
the deploy's ownership pass covers the whole data home; the three ops-loop units
|
|
1303
|
+
join `polyrob-data` with `UMask=0002`; a root euid refuses owner-CLI writes on a
|
|
1304
|
+
deployed box (`--as-root` / `POLYROB_ALLOW_ROOT_CLI`).
|
|
1305
|
+
- **WS-H deploy + shutdown** — `deploy_when_idle.sh` fails closed, parses the marker
|
|
1306
|
+
as JSON and carries a daily budget (`DEPLOY_DAILY_MAX`, 6); console/API turns hold
|
|
1307
|
+
the turn gate (`SURFACE_OWNER_TURN`, ON); on SIGTERM the in-flight cron/goal run
|
|
1308
|
+
gets an ending (`AUTONOMY_SHUTDOWN_DRAIN`, ON) and `TimeoutStopSec=90`.
|
|
1309
|
+
- **WS-I economics** — the status snapshot's `economics` section (calls, $/day,
|
|
1310
|
+
cached share, uncached/output per call, p50/p90 latency, truncations, first-call
|
|
1311
|
+
cache hits, `budget_runway` when a balance was read) from `usage_records`; the
|
|
1312
|
+
loops section renders standing rail verdicts with a SINCE clock, `rail_cut_repeat`,
|
|
1313
|
+
and the goals section renders `yielded ×N · resumed ×M · deferred ×K`; the security
|
|
1314
|
+
section renders the data-home permission audit.
|
|
1315
|
+
|
|
1316
|
+
### Changed
|
|
1317
|
+
- Corrections to the load-bearing numbers behind the 057 design, measured against
|
|
1318
|
+
production `usage_records`/telemetry: prompt caching IS live (80% of input tokens
|
|
1319
|
+
cached), latency is output-bound, and compaction was unreachable under
|
|
1320
|
+
`TASK_MAX_INPUT_TOKENS=200000`.
|
|
1321
|
+
|
|
1322
|
+
### Fixed (deployment)
|
|
1323
|
+
- `polyrob.service`, `polyrob-email.service` and `polyrob-webview.service` now run with
|
|
1324
|
+
`UMask=0002`: with systemd's default 022 the WAL sidecars one unit created under the shared
|
|
1325
|
+
data dir were group-read-only, so a sibling unit hit `attempt to write a readonly database`
|
|
1326
|
+
(the email surface's outbound queue, twice in two days). Same fix the root helper units got
|
|
1327
|
+
on 2026-09-18; ratcheted by `tests/unit/test_shared_data_units_umask.py`.
|
|
1328
|
+
|
|
1329
|
+
### Added
|
|
1330
|
+
- **`goal_ask`** — a rail that hits a question only the owner can answer now raises a
|
|
1331
|
+
durable board ask instead of asking once into a chat line that scrolls away. The ask is
|
|
1332
|
+
dedup-refreshed, visible on every owner seat, and the goal that raised it is HELD (not
|
|
1333
|
+
re-served) while it is open: on 2026-09-12 one rail re-fired seven times in 75 minutes
|
|
1334
|
+
while the owner was deciding, and a buyback rail stalled for 12 hours on a question that
|
|
1335
|
+
was asked once and never resurfaced.
|
|
1336
|
+
- `polyrob cron edit` gains `--task-file <path>` (replace a job's prose without
|
|
1337
|
+
re-scheduling it), `--deliver <target|none>` and `--rig <name>`; `cron show|edit|cancel`
|
|
1338
|
+
accept a unique job-id prefix, and a rig error is reported separately from a job error.
|
|
1339
|
+
- `OPENROUTER_REASONING_ENABLED=false` sends `reasoning.enabled=false` — measured as the one
|
|
1340
|
+
lever a DeepInfra upstream honours — and `OPENROUTER_REASONING_MAX_TOKENS` bounds the
|
|
1341
|
+
model's reasoning inside the output cap. A cut spent on REASONING gets its own note and
|
|
1342
|
+
its own count, so "the answer was truncated" and "the thinking was truncated" stop
|
|
1343
|
+
reading alike.
|
|
1344
|
+
- Every OpenRouter call stamps `prefix_sha`/`tools_sha` onto its usage record, which makes a
|
|
1345
|
+
cache miss attributable to a changed prompt prefix rather than guessed at.
|
|
1346
|
+
- The composed daily digest rolls up the owner messages a cap or a pause suppressed
|
|
1347
|
+
(window-bounded, oldest first, day-stamped, capped at 8); an unreadable store is named
|
|
1348
|
+
rather than read as "nothing was missed".
|
|
1349
|
+
- `OPENROUTER_PROVIDER_SORT` (`latency`|`throughput`|`price`, default unset = byte-identical):
|
|
1350
|
+
asks OpenRouter to order upstreams for the SAME model by latency instead of its price-first
|
|
1351
|
+
default — an ops knob for a seat whose cheapest upstream stalls (four 290–410 s timeouts and
|
|
1352
|
+
five money-rail cap cuts in one afternoon on prod).
|
|
1353
|
+
|
|
1354
|
+
### Fixed
|
|
1355
|
+
|
|
1356
|
+
- `anysite_api`: an empty answer from a `/search/` endpoint to a query longer than two words now
|
|
1357
|
+
carries a hint that the endpoint silently rejects long phrasings and names the two-word retry —
|
|
1358
|
+
the agent had twice recorded a live theme as "exhausted" on a query-shape artefact.
|
|
1359
|
+
- `scripts/deploy_when_idle.sh` also vetoes a deploy while an owner DM was routed in the last
|
|
1360
|
+
`OWNER_DM_VETO_SEC` (600) seconds, read from the `inbound_routed{tier=owner}` telemetry row
|
|
1361
|
+
the harness writes before any turn starts — independent of the turn marker, which failed
|
|
1362
|
+
twice on 2026-09-19. An unreadable telemetry DB counts as busy. `DEPLOY_WHEN_IDLE_DRY_RUN=1`
|
|
1363
|
+
exercises the decision without deploying (bash test).
|
|
1364
|
+
- The live-turn marker (`turn.active`) now always lives under `<POLYROB_DATA_DIR>/locks/`, the
|
|
1365
|
+
location the deploy waiter, the cron tick and `polyrob doctor` read. The agent process sets
|
|
1366
|
+
`POLYROB_WORKSPACE_LOCK_DIR=<project>/.polyrob`, so the marker was landing there instead and
|
|
1367
|
+
two deploys (10:36Z, 18:29Z on 2026-09-19) fired in the middle of a live owner turn.
|
|
1368
|
+
- `room_read` no longer lets an empty room ledger read as "my posts may not have rendered":
|
|
1369
|
+
Telegram never delivers a bot's OWN posts back as updates, so a channel only the bot posts
|
|
1370
|
+
to stays at 0 lines by design — both the room listing and the per-room read now say so and
|
|
1371
|
+
name the send receipt as the delivery confirmation (prod 2026-09-19: the agent told the
|
|
1372
|
+
owner for two days that channel posts were "receipt-only, visibility unconfirmed").
|
|
1373
|
+
- `defi_data.swap_quote` cross-checks the route's output against the keyless indexer-implied
|
|
1374
|
+
output and renders `⚠ SUSPECT QUOTE` when they disagree by more than 5× either way (the
|
|
1375
|
+
`lifi:fly` cold-response constant of 2026-09-19); consistent quotes say so, and a missing
|
|
1376
|
+
or zero-liquidity price renders `cross-check: unavailable` — never a verdict.
|
|
1377
|
+
- History dedup no longer replaces a SHORT identical tool result with a "[duplicate of …]"
|
|
1378
|
+
back-reference (`DEDUP_MIN_CHARS`, 160): three identical `Edited <file>` confirmations in
|
|
1379
|
+
one step were reported by the agent as "the dedup artifact" instead of three landed edits,
|
|
1380
|
+
and the pointer was longer than what it replaced.
|
|
1381
|
+
- A screenshot of a never-navigated page (`about:blank` / new tab) is no longer attached
|
|
1382
|
+
to the state message: every step of a run that never touched the browser was shipping one
|
|
1383
|
+
useless image per call through the vision path of the metered seat (`agents/task/agent/
|
|
1384
|
+
prompts.py::is_blank_page_url`). A navigated page's screenshot is unchanged.
|
|
1385
|
+
- The system prompt now states the executor's real per-step tool-call cap (5) instead of
|
|
1386
|
+
the config ceiling (10), and a deferred call's notice says it did NOT run and must be
|
|
1387
|
+
re-issued — a 6-call batch used to lose its 6th call from the agent's point of view.
|
|
1388
|
+
- The GeckoTerminal client retries once (2 s) on a 429, and a provider error that survives
|
|
1389
|
+
the retry now propagates from the pool resolver: `defi_data_ohlcv` says "could not resolve a
|
|
1390
|
+
pool: HTTP 429" instead of "no indexed pool found … not an outage" (five batched candle
|
|
1391
|
+
reads were reported as absent pools on 2026-09-19).
|
|
1392
|
+
- The X API tool remembers a `402 Payment Required` (credits depleted) for 60 min and refuses
|
|
1393
|
+
every further API call locally with the owner remedy instead of re-discovering it per
|
|
1394
|
+
endpoint (a round burned 52 calls in 15 min); a successful call clears the verdict.
|
|
1395
|
+
- `defi_data_swap_quote` stamps `quoted_at` (UTC) and the pair addresses on every quote, so
|
|
1396
|
+
two re-quotes that happen to agree are never byte-identical and the history compaction
|
|
1397
|
+
pass no longer folds a fresh read into "[duplicate of an earlier tool result]".
|
|
1398
|
+
- `defi_data_ohlcv` accepts a 32-byte pool id (Robinhood Chain singleton pools) for both
|
|
1399
|
+
the auto-resolved and an explicit `pool=`; the path validator treated every pool as a
|
|
1400
|
+
20-byte address, so every RH candle read was refused. A token address is still an address.
|
|
1401
|
+
- `coding_grep` given a FILE path greps that file (it used to walk it as a directory and
|
|
1402
|
+
answer "(no matches)"); a path that is neither a file nor a directory errors naming it.
|
|
1403
|
+
- `kb_ingest` no longer refuses the agent's own plain-text documents (`.md/.txt/.rst`)
|
|
1404
|
+
under a workspace `data/` directory purely by path: they are admitted when they sit
|
|
1405
|
+
outside the runtime data subtrees and a content secret-scan passes. The broad
|
|
1406
|
+
`is_secret_path` classifier is unchanged for every other consumer.
|
|
1407
|
+
- The autonomous X post cooldown refusal now names the remaining window and the exact
|
|
1408
|
+
one-shot deferral (`cronjob_schedule` at an ISO instant) so a NEW executed-transaction
|
|
1409
|
+
report is deferred rather than dropped; a genuine re-fire is still told to skip.
|
|
1410
|
+
- Goal dispatch no longer starves behind staggered money rails: with
|
|
1411
|
+
`GOAL_YIELD_FOR_MONEY_RAIL` on, a scheduled money-class cron job does not hold the
|
|
1412
|
+
board back through `GOAL_DISPATCH_CRON_HEADROOM_SEC` (it pre-empts a running goal
|
|
1413
|
+
instead); a job mid-run and every ops-class job still defer.
|
|
1414
|
+
- The autonomous context budget gauges the HISTORY only — it no longer clamps the model's
|
|
1415
|
+
safety limit, which cut the first rail of a run at step 1.
|
|
1416
|
+
- The state message honours `TOOL_RESULT_MAX_TOKENS` too. It reprinted every tool result
|
|
1417
|
+
raw under a separate 100k-character limit, so five large JSON answers put ~110k uncached
|
|
1418
|
+
tokens into a single step (210k in, a 221 s timeout) with the 6k cap already armed.
|
|
1419
|
+
- A tool-less auxiliary LLM call no longer inherits the last step's toolset, and the
|
|
1420
|
+
native-tools billing path feeds the output-scaled timeout (it was sizing the budget from
|
|
1421
|
+
input alone).
|
|
1422
|
+
- An LLM timeout inside an AUTONOMOUS run never DMs the owner: a background rail's retry is
|
|
1423
|
+
not owner news.
|
|
1424
|
+
- `read_file` paged past the end of a file is an honest empty answer naming the line count,
|
|
1425
|
+
not a crash.
|
|
1426
|
+
- `coding_grep`, `kb_ingest` and the tool-availability note keep their fixes from the same
|
|
1427
|
+
window; the compute gates now name the limb that is ACTUALLY unmet (production ran
|
|
1428
|
+
posture 1 with `CODE_EXEC_ENABLED=false` and the note still said "raise the posture").
|
|
1429
|
+
- A credential verdict's re-probe hold doubles per repeat failure to a 6 h cap, and an SMTP
|
|
1430
|
+
verdict is keyed on a password change-detector digest, so a corrected password clears the
|
|
1431
|
+
verdict instead of waiting out a fixed TTL. A verdict READ never creates `verdicts.db`.
|
|
1432
|
+
- Files and SQLite stores born BETWEEN deploys are group-writable from birth (one birth
|
|
1433
|
+
rule in `core/sqlite_util.py` and the session state writer). A store created 30 seconds
|
|
1434
|
+
after a deploy's ownership pass was born `0644` and degraded with "attempt to write a
|
|
1435
|
+
readonly database".
|
|
1436
|
+
- A ledger or cooldown READ never creates `telemetry_events.db`, and a `/dapp` read never
|
|
1437
|
+
creates `dapp_sessions.db` — a read that plants a file makes "no data" and "never ran"
|
|
1438
|
+
indistinguishable.
|
|
1439
|
+
- `polyrob doctor` reads the DEPLOYED owner tenant (refusing rather than guessing when the
|
|
1440
|
+
env file is unreadable) and its money section reads without a DI container: an unread
|
|
1441
|
+
ledger leg renders `unavailable`, never `$0.00`. `GET /api/webgate/doctor` names a failed
|
|
1442
|
+
report (`checks: null` + `checks_error`) instead of a confident empty list.
|
|
1443
|
+
- An unreadable `./.polyrob/.env` candidate or an unreadable `.git` probe on the local
|
|
1444
|
+
bootstrap ladder is skipped, not a crash — both killed `polyrob owner asks` when it ran
|
|
1445
|
+
as the service user from another user's clone.
|
|
1446
|
+
- Promoting an owner-approved draft no longer trips the claim-provenance guard: the owner's
|
|
1447
|
+
approval of a SOURCED draft is not an unsourced claim.
|
|
1448
|
+
- A cron job that already told the owner during its run does not send the delivery echo
|
|
1449
|
+
again.
|
|
1450
|
+
- `polyrob doctor` in a directory the agent has never run in creates NOTHING. Its new
|
|
1451
|
+
money section builds the unified ledger, whose caps block asks for the wallet policy
|
|
1452
|
+
gate, and two read-creates-a-store defects followed: constructing the wallet audit sink
|
|
1453
|
+
mkdir'd `<cwd>/.polyrob/wallet/` and minted an `audit.jsonl.lock` before reading a byte
|
|
1454
|
+
(both are now deferred to the first real write), and on a base install without the
|
|
1455
|
+
`crypto` extra the missing-dependency WARNING was enough to mint
|
|
1456
|
+
`<cwd>/.polyrob/logs/bot.log` (a base install has no wallet by design — that is not a
|
|
1457
|
+
warn-worthy condition). The clean-room wheel gate gained a test for the second, which
|
|
1458
|
+
the dev tree structurally cannot see.
|
|
1459
|
+
|
|
1460
|
+
## [1.0.3] — 2026-09-19
|
|
1461
|
+
|
|
1462
|
+
### Added
|
|
1463
|
+
- `polyrob x-account import-session <storage_state.json> | --auth-token … --ct0 …` and
|
|
1464
|
+
`capture-session --out <file>`: a desktop-captured X login can now reach a headless
|
|
1465
|
+
server. The encrypted session store is per-box (Fernet key + identity), so the hand-off
|
|
1466
|
+
is plain Playwright storage state (or the two login cookies), stored under the server's
|
|
1467
|
+
own key on import; a file with no `auth_token` is refused.
|
|
1468
|
+
- **Autonomy scheduling.** A running board goal no longer starts just ahead of a due cron
|
|
1469
|
+
job (`GOAL_DISPATCH_CRON_HEADROOM_SEC`, also honoured while a job is mid-run), and a cron
|
|
1470
|
+
job classed `money` (`payload.priority`, set with `polyrob cron edit <id> --priority
|
|
1471
|
+
money`) can pre-empt a running board goal: the goal returns to `ready` with no failure
|
|
1472
|
+
counted and a `resume_note`, the rail runs on the same tick (`GOAL_YIELD_FOR_MONEY_RAIL`,
|
|
1473
|
+
default off). A human turn is never pre-empted. `polyrob cron edit --schedule '<spec>'`
|
|
1474
|
+
re-times a job with its next run recomputed.
|
|
1475
|
+
- **Goal budgets.** `goal_create` gained `max_steps` (6–60) and `report_back`; the default
|
|
1476
|
+
budget for a goal that sets none is `GOAL_DEFAULT_MAX_STEPS` (30, was a literal 20). A goal
|
|
1477
|
+
created from a chat reports back in one line unless `report_back=true`.
|
|
1478
|
+
- **Owner turns hold the shared workspace on headless surfaces.** A Telegram/email owner turn
|
|
1479
|
+
(like a REPL turn) marks the process busy, writes `<data>/locks/turn.active`, and takes the
|
|
1480
|
+
cross-process workspace lock — never refusing the human — so cron/goal ticks and the deploy
|
|
1481
|
+
waiter defer while you are mid-turn (`INTERACTIVE_GATE_MARKER`, default on; the lock dir is
|
|
1482
|
+
derived from `POLYROB_DATA_DIR` when unset). `/status` shows `turn: … active since HH:MM`.
|
|
1483
|
+
- **Rail ledger on every status seat.** Every `cron_run` now ends with a terminal event —
|
|
1484
|
+
`done`, `failed`, `cut_by_cap`, `held` (owner pause), `deferred` (owner ask), or
|
|
1485
|
+
`cut_by_restart` (orphan reclaimed after a restart) — and the `loops` status section shows
|
|
1486
|
+
each enabled job's last outcome (`rail EXIT: done 04:18 · 7 steps · 6m`, or
|
|
1487
|
+
`started HH:MM, no end recorded`) plus a `rail_cut` health warning with the remedy.
|
|
1488
|
+
- **External rails as health facts.** `/status` warns when the X browser rail is enabled
|
|
1489
|
+
without a stored login session (naming `polyrob x-account capture-session`), when the
|
|
1490
|
+
anysite user-search endpoint answers empty three calls running (`rail_probe` events), and
|
|
1491
|
+
when an SMTP login was rejected (`email_auth_rejected`), each with the remedy.
|
|
1492
|
+
- **Filesystem verbs shaped for JSON-lines data.** `jsonl_append` (one compact line per
|
|
1493
|
+
object), `jsonl_remove(key, values)` (backup → rewrite → verify → atomic replace; one bad
|
|
1494
|
+
line refuses the whole rewrite), `jsonl_validate` (counts, bad lines, duplicates), and
|
|
1495
|
+
`copy_file` (byte copy, no overwrite unless asked — the backup-before-rewrite primitive).
|
|
1496
|
+
- **`x_browser.x_reply`** — reply under an existing X post through the saved browser session
|
|
1497
|
+
(the lane the API tier refuses for non-mentioners); owner-approval-gated like `x_post`.
|
|
1498
|
+
- **Skill revisions from background turns.** A background/forged turn's `skill_manage
|
|
1499
|
+
patch` of an active skill lands a pending revision under `.pending/<id>/` for the owner's
|
|
1500
|
+
`polyrob owner promote skill` — the active skill is never touched by a forged turn.
|
|
1501
|
+
- **Stale session-directory GC** (`core/session_gc.py`): per-session dirs untouched for 14
|
|
1502
|
+
days are reported (dry-run, `session_gc` event) and removed only with
|
|
1503
|
+
`SESSION_DIR_GC_APPLY=true`; the first pass runs 10 minutes after start, then daily. The
|
|
1504
|
+
deployer purges the pip cache and vacuums the journal after a successful install.
|
|
1505
|
+
- The deployer gains an idle-wait entry point: it waits (up to the cron ceiling) for
|
|
1506
|
+
no running cron job, no running goal and no live turn, then runs `deploy_prod.sh`
|
|
1507
|
+
(which now refuses a direct call unless `DEPLOY_FORCE=1`). Units are runtime-masked while
|
|
1508
|
+
the virtualenv is rewritten and unmasked on start and on rollback.
|
|
1509
|
+
|
|
1510
|
+
- `polyrob cron edit <id> --max-duration N` — change a scheduled job's hard cap
|
|
1511
|
+
(tenant-scoped, ≤1800 s like the agent tool; applies from the next run). The
|
|
1512
|
+
EXIT/SCOUT treasury rails had a 240 s cap and timed out on 22 of 24 runs; the
|
|
1513
|
+
cron ceiling itself rose 600 → 1800 s because the hourly buyback rail runs
|
|
1514
|
+
1-5 min per step and was cut at step 6 before its swap.
|
|
1515
|
+
- The `/dev` owner→developer rail relays through a host spool (`<data>/dev_rail/`)
|
|
1516
|
+
drained by an owner-run unit, because the hardened service identity cannot reach
|
|
1517
|
+
the developer's tools directly.
|
|
1518
|
+
|
|
1519
|
+
### Fixed
|
|
1520
|
+
|
|
1521
|
+
- **Context overflow no longer kills a run.** The pre-LLM token check prunes once
|
|
1522
|
+
(`emergency_context_prune`) and re-checks before raising; a five-page tool step used to end
|
|
1523
|
+
the run with `Token overflow` and lose the round.
|
|
1524
|
+
- **Posture is a ceiling, not a request.** `AGENT_COMPUTE_POSTURE>=1` adds `code_execution`,
|
|
1525
|
+
`shell` and `coding` to autonomous toolsets only when each tool's own flag is on; a
|
|
1526
|
+
deploy with the flags off no longer stamps a false `[tool gap]` line on every goal record.
|
|
1527
|
+
The flag predicates live in `core.config_policy.capability_toggles` (tools delegate).
|
|
1528
|
+
- **`email` is dropped from the effective autonomous toolset while its SMTP login is
|
|
1529
|
+
rejected** (`core/credential_verdicts.py`, fed by the email tool's 535 path and cleared on
|
|
1530
|
+
the next success); the tool also remembers a rejected login for 15 minutes instead of
|
|
1531
|
+
re-sending bad credentials at every session start.
|
|
1532
|
+
- **`append_file` given a JSON object wrote a pretty-printed multi-line record** into a
|
|
1533
|
+
JSON-lines store; it now writes one compact line per object. `coding_str_replace` coerces a
|
|
1534
|
+
JSON object passed as `old_string`/`new_string` to its compact line and says so in the
|
|
1535
|
+
result instead of failing validation.
|
|
1536
|
+
- **`message` is not a missing tool.** The goal vocabulary infers the `message` action from
|
|
1537
|
+
"telegram"; the tool loader recorded it as `gated:unknown-tool` on every such goal.
|
|
1538
|
+
Action ids are recognised (`ACTION_IDS_NOT_TOOLS`); an absent action names its flag.
|
|
1539
|
+
- **Docker socket unreachable → one honest refusal, not a retry storm.** `run_tests`/
|
|
1540
|
+
`run_code` refuse up front when the agent identity cannot open the Docker socket, naming
|
|
1541
|
+
the posture and "do not retry".
|
|
1542
|
+
- `x_login_check` declares an explicit empty parameter model (ended a per-session WARNING).
|
|
1543
|
+
- Twitter `get_timeline` accepts `max_results` 1–100 (the X floor is clamped inside the call).
|
|
1544
|
+
- Browser stale-context reaper measures idle time, not allocation age.
|
|
1545
|
+
- A message drained on the `done()` step earns the next step instead of ending the run.
|
|
1546
|
+
- A host-level money-verb broadcast failure ends the run with the verbatim line.
|
|
1547
|
+
- Root-run confined writes take the parent's service group (dirs 0770, files 0660).
|
|
1548
|
+
|
|
1549
|
+
- `filesystem_read_file` on an over-cap multi-line file returns a numbered tail
|
|
1550
|
+
window under a `TRUNCATED` header instead of refusing (append-only ledgers were
|
|
1551
|
+
refused 15×/6h on prod).
|
|
1552
|
+
- H-MEM (`TaskContextManager`) base path was CWD-relative `data/auto` — read-only
|
|
1553
|
+
under `ProtectSystem=strict`; now `<data_home>/auto` (`DATA_PATH` still wins).
|
|
1554
|
+
- One log file per service entrypoint (`bot.log` / `email.log` / `webview.log`,
|
|
1555
|
+
`POLYROB_LOG_FILE` override) — three non-root units sharing one rotating file
|
|
1556
|
+
raised `PermissionError` on every emit in two of them.
|
|
1557
|
+
- `deploy_prod.sh` owns `$DATA_DIR/auto` for the agent identity (its root-run
|
|
1558
|
+
import-test created it 0700 root and every session then failed at init).
|
|
1559
|
+
|
|
1560
|
+
- **`polyrob update --apply` inside a foreign git repo.** A wheel whose
|
|
1561
|
+
site-packages sat inside somebody else's checkout (`/work/project/.venv/…`)
|
|
1562
|
+
was classified `git`, and `--apply` ran `git pull` + `pip install .` against
|
|
1563
|
+
THAT project. `site-packages`/`dist-packages` now never resolve a repo root.
|
|
1564
|
+
Also: `--apply` on pip/pipx/systemd/docker exits 1 with a structured `--json`
|
|
1565
|
+
payload (was exit 0 + nothing); the release `tag_name` is validated and
|
|
1566
|
+
checked out as `refs/tags/<ref>`; rollback is `git reset --keep`; one snapshot
|
|
1567
|
+
restore per failed step (`migrate_guarded.py` removed); `--json` never blocks
|
|
1568
|
+
on stdin; draft/pre-releases are filtered; snapshots pruned to 3 after an
|
|
1569
|
+
apply; `--channel git` measures the branch against its upstream instead of
|
|
1570
|
+
the release list; `ls /opt/polyrob` no longer counts as a running agent.
|
|
1571
|
+
- **Migrations ran in filename order.** `v1_10_0_*` sorts before `v1_2_0_*`;
|
|
1572
|
+
`shipped_migrations` now sorts by parsed version. The boot-time pre-migration
|
|
1573
|
+
snapshot now includes the configured `DB_PATH` (on prod the one database
|
|
1574
|
+
being migrated was the one NOT backed up) and takes the updater's
|
|
1575
|
+
`update.lock`. `session_registry.db` joins the DB manifest.
|
|
1576
|
+
- **Deployer.** One `pip install -c requirements.lock -e "/opt/polyrob[…]"`
|
|
1577
|
+
replaces a non-editable install that left a SECOND code copy in
|
|
1578
|
+
site-packages (4 of 7 units ran that copy); every active unit sourced from
|
|
1579
|
+
`deployment/` is reconciled (the webview unit carrying the de-root hardening
|
|
1580
|
+
never was); `polyrob-browser-server.service` is quiesced with the family;
|
|
1581
|
+
free space is checked on `$TMP`'s mount; the character preflight honours
|
|
1582
|
+
`POLYROB_DATA_DIR`; the wallet chown is guarded; the import test covers the
|
|
1583
|
+
telegram surface.
|
|
1584
|
+
- **`polyrob serve` trusted `X-Forwarded-For` from anyone** — default is now
|
|
1585
|
+
`127.0.0.1`; new `UVICORN_FORWARDED_ALLOW_IPS`.
|
|
1586
|
+
- **`polyrob profile create --service`** wrote a weaker `polyrob-<name>.service`
|
|
1587
|
+
(collided with `polyrob-email`); it now renders the committed
|
|
1588
|
+
`polyrob@.service` template (byte-pinned) and enables `polyrob@<name>`.
|
|
1589
|
+
- `polyrob approvals *` / `polyrob config set` act on the DEPLOYED data home.
|
|
1590
|
+
- `setup_publish_vhost.sh` chowns the publish root to the agent (first publish
|
|
1591
|
+
EACCES'd) and no longer guesses a port for `/api/`.
|
|
1592
|
+
|
|
1593
|
+
### Changed
|
|
1594
|
+
|
|
1595
|
+
- `requirements.lock` is `uv pip compile --all-extras --universal` (every extra
|
|
1596
|
+
pinned, none installed unless named); `requirements.txt` is a thin pointer
|
|
1597
|
+
(`-c requirements.lock` + the prod extras). Root units that stay root gain
|
|
1598
|
+
`Group=polyrob-data` + `UMask=0002`. `.dockerignore` added; the image sets
|
|
1599
|
+
`UVICORN_HOST=0.0.0.0` + `POLYROB_IN_DOCKER=1`. `release.yml` runs only on
|
|
1600
|
+
the public repository.
|
|
1601
|
+
|
|
1602
|
+
### Removed
|
|
1603
|
+
|
|
1604
|
+
- `webview/webview.service`, `scripts/publish_prune.sh`,
|
|
1605
|
+
`deployment/nginx_continuous_chat_fix.conf`, `.github/workflows/deploy-portal.yml`;
|
|
1606
|
+
the api+webgate units, `nginx.conf`, the Xvfb trio and the SSL scripts moved to
|
|
1607
|
+
`deployment/legacy/`; `deployment/CLEAN_DEPLOY.md` retired.
|
|
1608
|
+
|
|
1609
|
+
## [1.0.2] — 2026-09-18
|
|
1610
|
+
|
|
1611
|
+
### Added
|
|
1612
|
+
|
|
1613
|
+
- Fly.io single-tenant container posture (`deployment/fly/`): a runtime image
|
|
1614
|
+
(python + `polyrob[all]` + Chromium + tmux + git + the native Claude Code CLI),
|
|
1615
|
+
a one-machine `fly.toml` with NO services and no IP (nothing listens;
|
|
1616
|
+
Telegram is outbound), an entrypoint that clones the private repo onto the
|
|
1617
|
+
volume (credential store, never a token in the URL), layers the committed
|
|
1618
|
+
non-secret flags UNDER the Fly secrets, installs an instance kit on first
|
|
1619
|
+
boot and runs three processes as one non-root user: the agent runner
|
|
1620
|
+
(`touch /data/restart.agent` = clean restart after a `git pull` = deploy),
|
|
1621
|
+
the Claude dev `/loop` in tmux (the `/dev` Telegram rail pastes into it),
|
|
1622
|
+
and a watchdog. A second instance gets its own `<name>.fly.env` + a container-specific
|
|
1623
|
+
`dev-loop-prompt.md`. `deployment/fly/README.md` lists what to buy and which
|
|
1624
|
+
secrets to set.
|
|
1625
|
+
- X OAuth 2.0 user token: encrypted store + **auto-refresh** (`tools/x_oauth2.py`).
|
|
1626
|
+
The X Chat DM read (where every inbound DM now lands) needs a user-context
|
|
1627
|
+
OAuth2 token that X expires two hours after mint; the tree read ONE static
|
|
1628
|
+
env value and never refreshed it, so a hand-minted token proved the rail once
|
|
1629
|
+
and then inbound went dark. Every consumer (`surfaces/x/client.py`,
|
|
1630
|
+
`tools/twitter_tool.py`, the `polyrob x`/gateway presence checks, the CLI
|
|
1631
|
+
twitter gate) now resolves through `resolve_access_token`: store → refresh
|
|
1632
|
+
within 5 min of expiry (refresh token ROTATED and persisted before the old one
|
|
1633
|
+
is dropped; a failed refresh keeps the old pair) → env seed
|
|
1634
|
+
(`TWITTER_OAUTH2_ACCESS_TOKEN` + new `TWITTER_OAUTH2_REFRESH_TOKEN`, stored
|
|
1635
|
+
once) → static env override. The DM client retries a 401 exactly once on a
|
|
1636
|
+
refreshed token; the twitter tool rebuilds its DM + Chat clients before every
|
|
1637
|
+
DM read/send. `polyrob x-account oauth-login` (PKCE with a local callback),
|
|
1638
|
+
`oauth-import` (hidden prompts), `oauth-status`, `oauth-refresh`. New flags
|
|
1639
|
+
`TWITTER_OAUTH2_CLIENT_ID` / `_CLIENT_SECRET` / `_REFRESH_TOKEN`.
|
|
1640
|
+
|
|
1641
|
+
### Changed
|
|
1642
|
+
|
|
1643
|
+
- **The per-transaction wallet ceiling is the owner's, from chat** (owner ruling
|
|
1644
|
+
2026-09-18, after the second time an approved raise did nothing).
|
|
1645
|
+
`budget.wallet_per_tx_usd` is now an owner-override preference: an approved
|
|
1646
|
+
value replaces the `AGENT_WALLET_MAX_PER_TX_USD` default in either direction,
|
|
1647
|
+
clamped to the daily cap (`core/wallet/config.py::effective_max_per_tx_usd`).
|
|
1648
|
+
The daily cap (`budget.wallet_daily_usd` over `WALLET_DAILY_CAP_USD`) stays
|
|
1649
|
+
min-merged and env-only — it is the operator's hard envelope, so a single
|
|
1650
|
+
transaction can never exceed what a day may lose and no raise made from chat
|
|
1651
|
+
moves the maximum daily loss. Prod 2026-09-17: the owner approved
|
|
1652
|
+
`wallet_per_tx_usd = 220`, the pref sat on disk, the guard kept reading the
|
|
1653
|
+
env's $120, and the agent asked the owner to edit `polyrob.env` and restart.
|
|
1654
|
+
|
|
1655
|
+
### Fixed
|
|
1656
|
+
|
|
1657
|
+
- **The wallet caps apply LIVE.** `PolicyGate` copied both caps at construction
|
|
1658
|
+
(process start), so `budget.wallet_per_tx_usd` / `budget.wallet_daily_usd` —
|
|
1659
|
+
documented and shown as `applies: live` — took effect only at the next
|
|
1660
|
+
restart, in EITHER direction (an owner tightening from chat was just as
|
|
1661
|
+
inert). `WalletConfig.cap_resolver` (`live_caps_resolver`) is consulted on
|
|
1662
|
+
every `check()` and by the cap properties; a hand-built config keeps the
|
|
1663
|
+
frozen values; a raising resolver keeps what the gate had.
|
|
1664
|
+
- **The approval pre-hook read the raw env ceiling, not the owner's.**
|
|
1665
|
+
`spend_lane.autonomous_ceiling_usd()` read `DEFI_AUTONOMOUS_MAX_USD` while
|
|
1666
|
+
`tx_guard` step 9 read the pref-resolved `budget.defi_autonomous_usd`, so the
|
|
1667
|
+
two halves of one lane disagreed: the owner approved a $300 autonomous
|
|
1668
|
+
ceiling, tx_guard honoured it, and the hook still demanded a tap for every
|
|
1669
|
+
live swap over the env's $5 — three taps in one afternoon for trades the
|
|
1670
|
+
owner had said may run unattended, and an unattended cron buyback that could
|
|
1671
|
+
never run. The hook now delegates to `tx_guard.autonomous_max_usd` (fail-open
|
|
1672
|
+
to the env value, never wider).
|
|
1673
|
+
- **Approving an ask a CRON run raised re-arms the job instead of waking the
|
|
1674
|
+
dead run.** The ask had no goal to re-arm, so resume-on-grant self-woke the
|
|
1675
|
+
finished cron session — a forged turn the money guard refuses — and the agent
|
|
1676
|
+
told the owner "trigger it from your seat" for a trade the owner had just
|
|
1677
|
+
approved (prod 2026-09-17 16:14). Autonomous sessions now remember their cron
|
|
1678
|
+
job (`autonomy_marker.cron_job_for_session`, threaded through
|
|
1679
|
+
`run_task_to_outcome(cron_job_id=)`), the ask carries `cron_job_id`, and an
|
|
1680
|
+
approval pulls that job's `next_run_at` to now (`core/cron_rearm.py`, the one
|
|
1681
|
+
UPDATE both `CronJobStore.run_now` and the owner queue use) so the next tick —
|
|
1682
|
+
a genuine cron turn — redeems the grant. No wake. A running job is left alone
|
|
1683
|
+
and the owner is told its next run redeems the grant.
|
|
1684
|
+
- **A guarded proposal that could never take effect is refused, not queued.**
|
|
1685
|
+
For a min-merged key with the env set, a value above the env value resolved
|
|
1686
|
+
to the env value after the tap — the owner saw "tap to approve", tapped, and
|
|
1687
|
+
nothing moved. `propose_pref_change` now refuses up front and names the exact
|
|
1688
|
+
env line (`WALLET_DAILY_CAP_USD=…` in the service env file) that would.
|
|
1689
|
+
|
|
1690
|
+
- `FileTokenStore` writes follow the shared-data identity convention
|
|
1691
|
+
(`<writer>:polyrob-data 0660` under a group-writable data dir; an existing
|
|
1692
|
+
file keeps its mode + group). It wrote `0600` in the writer's primary group,
|
|
1693
|
+
so the OAuth2 pair the root CLI imported was unreadable by `polyrob-agent`
|
|
1694
|
+
— the unit that needed it — and an agent-written refresh would have been
|
|
1695
|
+
unreadable by the owner's CLI the same way.
|
|
1696
|
+
- `FileTokenStore` no longer treats an UNREADABLE file as a CORRUPT one. On
|
|
1697
|
+
prod the `polyrob-email` unit (a non-root service identity) got `EACCES` on
|
|
1698
|
+
the root-owned `0600` X token store that `polyrob.service` had just written,
|
|
1699
|
+
and the corruption branch renamed the file aside — deleting the agent's
|
|
1700
|
+
freshly imported OAuth2 pair from under the process that owned it. An
|
|
1701
|
+
`OSError` on read now logs and yields an empty in-memory store for THAT
|
|
1702
|
+
process only; the file is left where it is.
|
|
1703
|
+
|
|
1704
|
+
- **The browser rail under wallet custody (proposal 049).** A custody process
|
|
1705
|
+
refused local Chromium — correctly — but never reached the isolated browser
|
|
1706
|
+
it was told to use: `BrowserManager` passed the `BrowserConfig` into
|
|
1707
|
+
`Browser`'s BotConfig slot, so `BROWSER_CDP_URL`/`BROWSER_WSS_URL` were
|
|
1708
|
+
dropped (prod 2026-09-17: the service ran, the env was set, 4,517 refusals in
|
|
1709
|
+
24 h, and the agent told the owner "no remote browser configured"). Over CDP,
|
|
1710
|
+
every session then attached to the service's default PERSISTENT context — no
|
|
1711
|
+
`storage_state` (the X login silently dropped), no service-worker block, one
|
|
1712
|
+
cookie jar shared by every session and tenant. Both fixed: the endpoint
|
|
1713
|
+
reaches the browser, and a remote browser always gets a fresh context.
|
|
1714
|
+
- Owner-ceremony launches (`x-account capture-session`/`signup`, the pfp still)
|
|
1715
|
+
now consult the one launch policy: refused under custody, scrubbed env,
|
|
1716
|
+
sandbox on. `tests/test_browser_launch_ratchet.py` pins the launch sites.
|
|
1717
|
+
|
|
1718
|
+
### Added
|
|
1719
|
+
|
|
1720
|
+
- `core/security/browser_rail.py`: the ONE answer to "can this process drive a
|
|
1721
|
+
browser, and through what" — `none (custody) → install`, `configured,
|
|
1722
|
+
unreachable (<reason>) → check the service`, `remote cdp ok (<version>)`.
|
|
1723
|
+
Read by the launch refusal, the step loop (which now skips the per-step page
|
|
1724
|
+
observation and warns once instead of three ERRORs per step), the
|
|
1725
|
+
`<tool-catalog>` (`gated:custody-no-browser` for `browser`/`x_browser`/
|
|
1726
|
+
`dapp_browser`), the status snapshot's `identity` section (`browser:` line;
|
|
1727
|
+
WARN only when a configured endpoint fails) and `polyrob doctor`.
|
|
1728
|
+
- `polyrob browser install|update|status|render`: the isolated browser
|
|
1729
|
+
service as a boundary — dedicated UID, Chromium **sandbox on** via an AppArmor
|
|
1730
|
+
`userns` profile (Ubuntu 24.04 restricts unprivileged user namespaces; the
|
|
1731
|
+
earlier unit's `--no-sandbox` was a wrong diagnosis of that), a UID-keyed nft
|
|
1732
|
+
egress chain (no loopback / RFC1918 / link-local / metadata from the browser),
|
|
1733
|
+
Chromium for the venv's Playwright pin. `deployment/polyrob-browser.service`,
|
|
1734
|
+
`polyrob-browser-egress.service`, `hardening/polyrob-browser-egress.sh` and
|
|
1735
|
+
`hardening/apparmor/polyrob-browser` are the CLI's rendered output, pinned by
|
|
1736
|
+
a test. `scripts/deploy_prod.sh` prints the browser revision beside the pin
|
|
1737
|
+
and updates on drift. `--mode server --listen <private-ip>` on a SECOND host
|
|
1738
|
+
writes a Playwright-server unit instead (token in a root-only env file,
|
|
1739
|
+
private bind enforced) and prints the agent's `BROWSER_WSS_URL` — the shape
|
|
1740
|
+
that removes the shared kernel. Guide: `docs/guide/self-hosting.md`.
|
|
1741
|
+
|
|
1742
|
+
### Fixed
|
|
1743
|
+
|
|
1744
|
+
- The REPL painted 5–10 blank rows above the prompt for every provider error
|
|
1745
|
+
and never showed the error text: `core/logging.py` gave the file handler
|
|
1746
|
+
and the console handler ONE `ComfyFormatter`, whose 0.5 s duplicate filter
|
|
1747
|
+
saw the console's copy of each record as a repeat of the file's and
|
|
1748
|
+
returned `""` — the `StreamHandler` still wrote the newline, and every such
|
|
1749
|
+
write erased and redrew the prompt. Duplicate suppression is now a
|
|
1750
|
+
per-handler `logging.Filter` (a formatter cannot drop a record), and the
|
|
1751
|
+
REPL console renders one compact `✗ component: message` line per error;
|
|
1752
|
+
a re-wrapped exception (one 401 logged five layers of the same text) is
|
|
1753
|
+
collapsed to its first line on the console only — `bot.log` keeps every
|
|
1754
|
+
layer.
|
|
1755
|
+
- Gemini: a text part was dropped and logged as `Gemini function_call
|
|
1756
|
+
missing name` at ERROR. A proto `Part` answers `hasattr(part,
|
|
1757
|
+
"function_call")` True for every oneof member, so a plain text part hit the
|
|
1758
|
+
nameless-call branch and `continue`d — every text-only Gemini reply became
|
|
1759
|
+
"Model output has empty action list", the model was pushed into a filler
|
|
1760
|
+
step, and the REPL showed a second bubble ("Я жду твоего ответа"). Presence
|
|
1761
|
+
is now asked via `"function_call" in part`.
|
|
1762
|
+
- A session the terminal created (REPL, one-shot `polyrob run`) is a live
|
|
1763
|
+
surface: it renders every reply from the feed but bound no router, so
|
|
1764
|
+
`maybe_deliver_autonomous_send` pushed each chat reply through the owner
|
|
1765
|
+
delivery rail — dedup, the hourly rate limit and the daily cap included.
|
|
1766
|
+
Past the cap `send_message` told the model its answer was "NOT delivered",
|
|
1767
|
+
the model re-sent an apology (another duplicate bubble) and the turn closed
|
|
1768
|
+
`failed`. `core.surfaces.binding.bind_terminal_surface` marks such a
|
|
1769
|
+
session; `--resume` keeps the durable rail (2026-08-28 incident).
|
|
1770
|
+
- The bounded planning turn (`ALLOWED_REASONING_TURNS`) no longer logs two
|
|
1771
|
+
ERROR lines ("violates the agent contract") before the caller grants it.
|
|
1772
|
+
|
|
1773
|
+
### Changed
|
|
1774
|
+
|
|
1775
|
+
- `done(text)` no longer reaches the user on any chat surface. `done` writes
|
|
1776
|
+
the run log (history + session feed) and nothing else; only `send_message`
|
|
1777
|
+
/ `message` speak, in a DM as in a room — exactly what the prompt has told
|
|
1778
|
+
the model since C1. The old router mirror published `done` whenever
|
|
1779
|
+
`send_message` had not claimed the turn, and the `message` tool (a file
|
|
1780
|
+
with a caption) never claimed it, so on prod (2026-09-17) the owner received
|
|
1781
|
+
the answer AND a 2,400-char third-person session recap after every such
|
|
1782
|
+
turn. The unbound HTTP paths (`chat_once`, `/v1/chat/completions`) still
|
|
1783
|
+
fall back to `done`'s text for the response body when the turn spoke
|
|
1784
|
+
nothing — a request needs a body.
|
|
1785
|
+
|
|
1786
|
+
### Removed
|
|
1787
|
+
|
|
1788
|
+
- `CHAT_SINGLE_FINAL`. Its only consumer was the `done` mirror's latch gate;
|
|
1789
|
+
with the mirror gone there is no second voice to gate, and a flag would be
|
|
1790
|
+
a knob on a rule the prompt states without one. `core/surfaces/turn_reply.py`
|
|
1791
|
+
keeps only the reply-text record the unbound paths read.
|
|
1792
|
+
|
|
1793
|
+
## [1.0.1] — 2026-09-17
|
|
1794
|
+
|
|
1795
|
+
### Added
|
|
1796
|
+
|
|
1797
|
+
- `self-deploy` skill: an agent-facing bootstrap for a FRESH instance —
|
|
1798
|
+
assess (model, wallet + funding per chain, email, X, autonomy grants, tool
|
|
1799
|
+
catalog), provision what a lever exists for (own inbox, X account, standing
|
|
1800
|
+
work), bundle the human-only asks into ONE message (API keys, funding
|
|
1801
|
+
addresses read from a tool, env flags, a CAPTCHA), verify by a READ, and
|
|
1802
|
+
report one readiness table. Until now `polyrob init` was the human's wizard
|
|
1803
|
+
and the setup interview covered only the owner contract.
|
|
1804
|
+
- `twitter_poll_results(tweet_id)`: reads the options, votes, shares,
|
|
1805
|
+
`voting_status` and end time of a poll the agent posted. The tool could post
|
|
1806
|
+
a poll (`poll_options`) but no read asked for `attachments.poll_ids`, so the
|
|
1807
|
+
agent could ask the community and never learn the answer. The
|
|
1808
|
+
`x-engagement` skill now teaches the post → record id → read → aggregate loop
|
|
1809
|
+
and pins poll answers as DATA.
|
|
1810
|
+
- X message reads distinguish legacy Direct Messages from encrypted X Chat,
|
|
1811
|
+
support OAuth 2.0 PKCE user tokens, and can verify/decrypt Chat event history
|
|
1812
|
+
with the official Chat XDK and account keys instead of misreporting ciphertext
|
|
1813
|
+
or a legacy-only page as an empty inbox.
|
|
1814
|
+
- The `identity` status section now reports the agent's reachable identities:
|
|
1815
|
+
`email:` (the address it sends AS, or `none → remedy`) and `x:` (API rail
|
|
1816
|
+
configured / PARTIAL with the missing key names / none, plus the handle and
|
|
1817
|
+
whether writes are armed). Env PRESENCE only, never a value.
|
|
1818
|
+
- A `liquidity` status section on every seat (status snapshot, `polyrob wallet
|
|
1819
|
+
overview`, Telegram `/wallet overview`, console `GET /api/webgate/liquidity`)
|
|
1820
|
+
lists the treasury's Uniswap v3 positions with their fees; on-chain
|
|
1821
|
+
enumeration is opt-in and owner-only. `/lp` is listed in the money verb
|
|
1822
|
+
group on every chat surface.
|
|
1823
|
+
- `launchpad_status` names the graduated pool (PoolKey + pool id) once a Pons
|
|
1824
|
+
V2 curve has graduated, and states the fee reality: the LP fee is 0, the
|
|
1825
|
+
hook collects, creator income is claimed via the escrow, and the launch
|
|
1826
|
+
locker position cannot be withdrawn.
|
|
1827
|
+
- `X_SIGNUP_HANDLE` / `X_SIGNUP_DISCLOSURE`: the @handle `x_signup_start`
|
|
1828
|
+
requests and the automation-disclosure bio it writes.
|
|
1829
|
+
|
|
1830
|
+
### Changed
|
|
1831
|
+
|
|
1832
|
+
- Post-1.0 alignment sweep: one home per shared rule instead of hand-carried
|
|
1833
|
+
copies. `core.event_log` owns the telemetry db resolution and a fail-open
|
|
1834
|
+
`emit()` (the recap reader used to ignore `TELEMETRY_EVENT_LOG_PATH` and
|
|
1835
|
+
create the db on read); every owner/admin CLI verb resolves its data home
|
|
1836
|
+
through `cli/_admin_home.py` (the deployed-home rule now also covers
|
|
1837
|
+
`apps`, `surface`, `cron`, `goals`, `journey`, and `owner pending`'s goal
|
|
1838
|
+
board, which came from a third resolver); the sub-agent and owner-pause
|
|
1839
|
+
refusals every money verb states live in `core.wallet.authority`; the
|
|
1840
|
+
publish/app-service owner-turn clauses in `core.security.owner_turn`; the
|
|
1841
|
+
ship rail's orchestrator/approval/workspace helpers in `tools/ship_common.py`;
|
|
1842
|
+
the goal board's status/kind vocabulary in `core.goal_vocab`; the `/help`
|
|
1843
|
+
group order is read from `core.verbs`; the copy-layer engine is shared by
|
|
1844
|
+
`core.copy` and `webview.copy`; the Telegram update dedup is the core
|
|
1845
|
+
`IdempotencyStore` over its existing table. Twelve open-coded boolean
|
|
1846
|
+
truth sets now parse through `core.env`, pinned shrink-only by
|
|
1847
|
+
`tests/test_bool_env_parse_ratchet.py`.
|
|
1848
|
+
- Social-agent skills and toolsets now route public discovery, native X account
|
|
1849
|
+
reads, encrypted Chat, browser inbox fallback, and approval-gated writes through
|
|
1850
|
+
the capabilities that actually implement each operation.
|
|
1851
|
+
- REPL slash commands parse quoted arguments (`/steer "two words"` is one
|
|
1852
|
+
argument); an unbalanced quote is refused with the remedy. Free-text verbs
|
|
1853
|
+
(`/learn`, `/persona`) keep the raw line. `/export` names the formats the
|
|
1854
|
+
REPL supports and points at `polyrob session export` for the rest; `/logs`
|
|
1855
|
+
prints the log directory instead of a CLI verb that does not exist.
|
|
1856
|
+
- The approval `awaiting` event names the provider that will decide.
|
|
1857
|
+
- `lp_collect` / `lp_remove` set their receipt minimum from a simulated
|
|
1858
|
+
collect, not the position's fee-growth estimate (core rounding leaves the
|
|
1859
|
+
estimate several raw units high, which made a correct collect refuse).
|
|
1860
|
+
Every position receipt also asserts the fungible legs. LP legs are no longer
|
|
1861
|
+
written into the token-keyed position book: adding them double-counted
|
|
1862
|
+
tokens already held, and removing them on withdrawal erased unrelated
|
|
1863
|
+
holdings. Position receipts stay in the NFT and transaction telemetry until
|
|
1864
|
+
an LP-specific basis exists.
|
|
1865
|
+
|
|
1866
|
+
### Fixed
|
|
1867
|
+
|
|
1868
|
+
- Scheduled agent runs now propagate wall-clock cancellation and are recorded as
|
|
1869
|
+
incomplete unless the agent actually calls `done()`. The default cron budget is
|
|
1870
|
+
ten minutes, preventing slow provider calls from silently turning unfinished
|
|
1871
|
+
treasury rails into successful ticks.
|
|
1872
|
+
- Provider health distinguishes a sentinel on the serving provider from one on an
|
|
1873
|
+
unused fallback. A credit-limited fallback is shown as a warning and explicitly
|
|
1874
|
+
does not claim to block the live provider.
|
|
1875
|
+
- Live incremental streams claim the turn's reply latch after becoming visible,
|
|
1876
|
+
preventing `done()` bookkeeping from producing a second user-facing response.
|
|
1877
|
+
- Browser management accepts operator-configured CDP and WebSocket endpoints, so
|
|
1878
|
+
hardened custody deployments can keep Chromium outside the signing service.
|
|
1879
|
+
- The owner's spend ceilings are read from the same home the preference
|
|
1880
|
+
writers use. `tx_guard`, the wallet config fallback and the Telegram
|
|
1881
|
+
`/wallet autonomous` verb resolved the preference store through the
|
|
1882
|
+
process home (an empty tree under a service account), so an approved
|
|
1883
|
+
`budget.defi_autonomous_usd` was recorded and never read and the guard kept
|
|
1884
|
+
refusing at the env default. Those seats may no longer call the process
|
|
1885
|
+
home (ratcheted).
|
|
1886
|
+
- X self-registration: `XPageDriver.set_handle_and_profile` was a `pass` stub
|
|
1887
|
+
while the docs claimed the disclosure was written into the bio — no handle
|
|
1888
|
+
and no disclosure were ever applied. It now edits `/settings/screen_name` and
|
|
1889
|
+
`/settings/profile` best-effort and RETURNS what it applied; the signup
|
|
1890
|
+
result carries `requested_handle`/`handle_applied`/`bio_applied` and the tool
|
|
1891
|
+
says plainly when the disclosure is NOT on the profile yet. The flow refuses
|
|
1892
|
+
up front with the remedy when the agent has no email or no inbox client
|
|
1893
|
+
(it used to fill an EMPTY email and pause several steps later on "no code
|
|
1894
|
+
arrived"), provisions the AgentMail inbox idempotently before opening a
|
|
1895
|
+
browser, and the default disclosure names the instance instead of the
|
|
1896
|
+
owner's internal tenant id (`operated by local`).
|
|
1897
|
+
- `x_browser` stays explicit-grant-only: it is `high_impact` +
|
|
1898
|
+
`delegate_blocked`, so it is not on the CLI optional-registrar table and is
|
|
1899
|
+
reached by explicit `tool_ids` only.
|
|
1900
|
+
- A per-profile daemon (`polyrob profile create --service`) no longer loads
|
|
1901
|
+
the primary instance's environment first: any key the profile did not
|
|
1902
|
+
override leaked through (its Telegram token → a 409 fight, its `TWITTER_*`
|
|
1903
|
+
keys → the profile posted AS the primary, its owner ids and money flags). A
|
|
1904
|
+
profile daemon reads its own environment files only.
|
|
1905
|
+
- `defi_trade.register_agent` / `set_agent_uri` referenced `os.environ` with
|
|
1906
|
+
no module-level import (latent `NameError`).
|
|
1907
|
+
- The coding and git tools resolve their confined root per TENANT, not the
|
|
1908
|
+
anonymous bucket, on a multi-tenant server.
|
|
1909
|
+
- The `twitter` extra now carries `chatxdk`, which the encrypted X Chat reads
|
|
1910
|
+
need; a base install without the extra still imports.
|
|
1911
|
+
|
|
1912
|
+
### Deployment
|
|
1913
|
+
|
|
1914
|
+
- The signing service owns the wallet state directory while wallet artifacts
|
|
1915
|
+
remain group-readable, allowing the durable submission journal to be created on
|
|
1916
|
+
the first broadcast without weakening the service-identity boundary.
|
|
1917
|
+
|
|
1918
|
+
## [1.0.0] — 2026-09-16
|
|
1919
|
+
|
|
1920
|
+
POLYROB 1.0 is the first stable public release. It brings the terminal, web
|
|
1921
|
+
console, chat surfaces, autonomy runtime, tool system and optional wallet rails
|
|
1922
|
+
under one documented control model, with explicit owner authority and
|
|
1923
|
+
fail-closed boundaries around credentials, sessions and money.
|
|
1924
|
+
|
|
1925
|
+
### Agent, CLI and operator control
|
|
1926
|
+
|
|
1927
|
+
- The terminal client now supports interactive chat and one-shot runs with
|
|
1928
|
+
task files or stdin, file and image attachments, JSON/JSONL results,
|
|
1929
|
+
profile-scoped history, persistent background delegation receipts and full
|
|
1930
|
+
session identifiers.
|
|
1931
|
+
- Safe controls can pause, steer or stop a busy session at step boundaries.
|
|
1932
|
+
Cross-process controls are acknowledged, keyless stops are supported, and
|
|
1933
|
+
update/rollback refuses while a live process owns a database unless the
|
|
1934
|
+
operator explicitly forces it.
|
|
1935
|
+
- Status, doctor, owner, wallet, session and REPL views share the same typed
|
|
1936
|
+
runtime snapshot. Provider fallback updates the displayed provider/model only
|
|
1937
|
+
after the main agent actually switches.
|
|
1938
|
+
- A turn commits one user-facing reply. Completion bookkeeping no longer
|
|
1939
|
+
produces a second chat message, and workspace paths resolve to attachments,
|
|
1940
|
+
console links or an honest server-only state.
|
|
1941
|
+
|
|
1942
|
+
### Web console
|
|
1943
|
+
|
|
1944
|
+
- The console now has one responsive five-destination shell for Chat, Work,
|
|
1945
|
+
Money, Inbox and Agent. The legacy page set and `WEBVIEW_UI` switch are
|
|
1946
|
+
removed.
|
|
1947
|
+
- Work shows running goals, schedules, cron jobs and live sessions, and can
|
|
1948
|
+
create goals and schedules through the same guarded writers used elsewhere.
|
|
1949
|
+
Money presents typed positions, movements, invoices and limits. Agent exposes
|
|
1950
|
+
identity, memory, skills, capabilities and permitted configuration controls.
|
|
1951
|
+
- The console includes durable light/dark/automatic themes, a shared command
|
|
1952
|
+
palette, live Socket.IO refresh, paginated chat summaries, typed artifacts
|
|
1953
|
+
and narrated tool activity.
|
|
1954
|
+
- Inline scripts were removed from the console CSP. Owner routes, session
|
|
1955
|
+
transcripts, files and event streams are tenant-scoped; logout revokes the
|
|
1956
|
+
active token and authentication storage failures deny access.
|
|
1957
|
+
- Console mutations rely on the HttpOnly session cookie. The standalone proxy
|
|
1958
|
+
forwards authenticated identity to the task API and renders structured
|
|
1959
|
+
refusals. Money includes an owner-scoped, read-only wallet view with safety
|
|
1960
|
+
labels, trusted cached balances and unresolved-submission warnings.
|
|
1961
|
+
|
|
1962
|
+
### Autonomy, groups and owner authority
|
|
1963
|
+
|
|
1964
|
+
- Telegram groups have a public-session profile, per-chat roles and policy,
|
|
1965
|
+
bounded toolsets, reply threading, a room ledger and owner-only administration
|
|
1966
|
+
from direct messages. Denied room turns do not leak owner facts or private
|
|
1967
|
+
notices into the room.
|
|
1968
|
+
- Optional paid room actions use expiring offers, asset-aware x402 invoices,
|
|
1969
|
+
settlement verification, effect receipts and credits when a paid effect
|
|
1970
|
+
cannot be applied.
|
|
1971
|
+
- Owner stop instructions persist across restarts. Paused streams stay paused,
|
|
1972
|
+
only an owner can resume global autonomy, and owner rules distinguish
|
|
1973
|
+
restrictive instructions from permission-granting changes.
|
|
1974
|
+
- Delivery suppression is observable and recoverable: missed notices, caps,
|
|
1975
|
+
quiet-hour holds and unavailable producers are represented in status rather
|
|
1976
|
+
than silently counted as delivery.
|
|
1977
|
+
|
|
1978
|
+
### Skills, memory, models and identity
|
|
1979
|
+
|
|
1980
|
+
- Curated character profiles ship in wheel and source distributions. Persona
|
|
1981
|
+
selection, authoring and inspection are available from the CLI, REPL and
|
|
1982
|
+
console, and the neutral stock avatar now ships without instance-specific
|
|
1983
|
+
identity.
|
|
1984
|
+
- Skill triggers, action names and tool IDs are checked against the runtime
|
|
1985
|
+
index. Trading, token assessment and verified-tooling guidance cover the
|
|
1986
|
+
capabilities exposed by the current tool catalog.
|
|
1987
|
+
- Owners can add, test and remove HTTPS MCP servers from the CLI, REPL or
|
|
1988
|
+
Telegram. Persisted servers reload per tenant; stdio entries remain local
|
|
1989
|
+
configuration and are refused in wallet-custody processes.
|
|
1990
|
+
- Model profiles and auxiliary routing were expanded, while prompt catalogs and
|
|
1991
|
+
recent context are kept within model size ceilings.
|
|
1992
|
+
|
|
1993
|
+
### Optional wallet, payments and on-chain tools
|
|
1994
|
+
|
|
1995
|
+
- The optional wallet stack supports guarded EVM and Solana swaps, bridges,
|
|
1996
|
+
token deployment, contract calls, launchpads, dapp sessions, NFT inspection
|
|
1997
|
+
and transfer, revenue collection, ERC-8004 identity, asset-aware x402
|
|
1998
|
+
settlement and initial Uniswap v3 liquidity reads and writes.
|
|
1999
|
+
- Money tools remain disabled until their feature flags, tool grants, owner
|
|
2000
|
+
approval and spend policy all allow the action. Unpriced approvals and
|
|
2001
|
+
undeclared token or NFT movement are refused; submitted and confirmed effects
|
|
2002
|
+
are recorded separately.
|
|
2003
|
+
- Durable spend reservations are serialized across processes. Corrupt or
|
|
2004
|
+
unreadable accounting blocks further spending, chain and venue attribution is
|
|
2005
|
+
retained, and receipt reconciliation checks the landed effect before marking
|
|
2006
|
+
an action complete.
|
|
2007
|
+
- Token assessment adds resolver fallbacks, holder concentration, price history,
|
|
2008
|
+
new-pool discovery and composite screening with explicit partial/unknown
|
|
2009
|
+
states. These rails remain experimental and off by default.
|
|
2010
|
+
|
|
2011
|
+
### Security and release integrity
|
|
2012
|
+
|
|
2013
|
+
- Evaluation runs default to reviewed fixture scenarios with sealed run,
|
|
2014
|
+
configuration and source identity. Missing, unknown, drifted or mismatched
|
|
2015
|
+
evidence fails scoring, and unbudgeted live evaluation seeding is disabled.
|
|
2016
|
+
|
|
2017
|
+
- Child processes receive a credential-scrubbed environment. Managed RPC URLs,
|
|
2018
|
+
bearer tokens and provider keys are masked in configuration, logs, stored
|
|
2019
|
+
results and terminal output.
|
|
2020
|
+
- Browser and fetch paths enforce URL and redirect checks, block protected
|
|
2021
|
+
network ranges, reject compressed responses, pin validated addresses and use
|
|
2022
|
+
one deadline across DNS and redirect hops. Untrusted content is framed at
|
|
2023
|
+
model and browser-render boundaries.
|
|
2024
|
+
- Host execution is refused when wallet custody or a payment/deposit master seed
|
|
2025
|
+
requires a sandbox, including when the agent wallet itself is disabled.
|
|
2026
|
+
- Session tokens require finite expiry and revocation identifiers. API request
|
|
2027
|
+
bodies, command output and concurrent reads are bounded; cancelled host and
|
|
2028
|
+
container processes are reaped.
|
|
2029
|
+
- External payment, exchange and treasury submissions journal their local
|
|
2030
|
+
intent, signature or transaction hash before broadcast. Ambiguous outcomes
|
|
2031
|
+
keep the spend interlock held until reconciliation, preventing a blind retry.
|
|
2032
|
+
- EVM and treasury sends reserve before signing. Submission-journal identity and
|
|
2033
|
+
high-water checks refuse missing or truncated history; venue attempts cannot
|
|
2034
|
+
be released by smaller charges or charges for another venue. A read-only
|
|
2035
|
+
recovery diagnostic checks EVM/Solana chain evidence while retaining every
|
|
2036
|
+
reservation. Shared urllib RPC replies have raw byte and encoding limits;
|
|
2037
|
+
malformed or unrelated EVM receipts remain pending.
|
|
2038
|
+
- Treasury sweeps verify the configured chain and derived signing address,
|
|
2039
|
+
reserve the signed gas cost, use pending nonces and require a matching
|
|
2040
|
+
successful receipt before bookkeeping can complete.
|
|
2041
|
+
- Chromium launches with sandboxing enabled. Sandbox opt-out is restricted to
|
|
2042
|
+
local non-custody development, failed startup reaps the driver, and remote
|
|
2043
|
+
browser credentials are redacted from connection errors.
|
|
2044
|
+
- Package manifests now carry the migrations, console assets, avatar engine,
|
|
2045
|
+
character library, contract sources, browser DOM helper and bundled fonts
|
|
2046
|
+
used at runtime. Release checks install the wheel into a bare environment and
|
|
2047
|
+
exercise version, help, doctor and migration commands before publication.
|
|
2048
|
+
- Knowledge ingestion reads bounded, descriptor-relative snapshots; rejects
|
|
2049
|
+
symlinks, hard-link aliases and special files; and hashes the same bytes it
|
|
2050
|
+
parses. DOCX admission bounds archive expansion, part and table counts, XML
|
|
2051
|
+
structure and extracted text, while failed replacements preserve existing
|
|
2052
|
+
knowledge.
|
|
2053
|
+
- Upload capacity remains reserved until temporary request storage is consumed
|
|
2054
|
+
or closed, binary sniffing is bounded, and mismatched content lengths are
|
|
2055
|
+
rejected.
|
|
2056
|
+
- Wallet audit locks are reusable only by the asyncio task that owns the spend
|
|
2057
|
+
reservation; unrelated tasks and worker threads cannot borrow another task's
|
|
2058
|
+
reservation.
|
|
2059
|
+
- Package builds now require setuptools 83.0 or newer.
|
|
2060
|
+
- Skill writes and promotions validate tenant identifiers, refuse linked paths,
|
|
2061
|
+
use descriptor-relative atomic writes and archives, and fail closed when the
|
|
2062
|
+
threat scanner is unavailable. Project-context snapshots are bounded.
|
|
2063
|
+
- Acceptance declarations are validated before execution or goal creation. File
|
|
2064
|
+
probes are confined, artifact IDs bind to their goal and session, hash/content
|
|
2065
|
+
checks use one snapshot, and HTTP probes pin public addresses and revalidate
|
|
2066
|
+
redirects.
|
|
2067
|
+
- Provider recovery adopts the shared model state, restores the requested native
|
|
2068
|
+
tool mode and refreshes capability catalogs before each step. Source precedence
|
|
2069
|
+
separates current owner intent from factual evidence.
|
|
2070
|
+
- Short untrusted tool strings are framed, final action evidence survives long
|
|
2071
|
+
runs, test verification requires real comparable results, and memory corrections
|
|
2072
|
+
do not delete nonidentical facts solely from embedding similarity.
|
|
2073
|
+
- Knowledge sources publish chunks and hash/count metadata atomically, preserving
|
|
2074
|
+
the previous source on failure and excluding stale vector-cache content.
|
|
2075
|
+
- Directory discovery is bounded by output, entry count, depth and elapsed time.
|
|
2076
|
+
PDF and DOCX parsing runs in admitted subprocesses with cancellation cleanup;
|
|
2077
|
+
Linux adds an address-space limit.
|
|
2078
|
+
|
|
2079
|
+
### Breaking changes and migration
|
|
2080
|
+
|
|
2081
|
+
- The version advances directly from 0.13.0 to 1.0.0; no 0.14.0 release was
|
|
2082
|
+
published.
|
|
2083
|
+
- The legacy console routes and `WEBVIEW_UI` selector are removed. Use the five
|
|
2084
|
+
destination console and `/api/webgate/*` endpoints.
|
|
2085
|
+
- Public group sessions no longer inherit owner memory, project context or
|
|
2086
|
+
owner-only tools. Deployments that relied on broad group access must configure
|
|
2087
|
+
explicit per-chat policy and tool grants.
|
|
2088
|
+
- Review the [upgrading guide](docs/guide/upgrading.md),
|
|
2089
|
+
[configuration reference](docs/CONFIGURATION.md) and
|
|
2090
|
+
[security model](docs/guide/security-model.md) before enabling autonomy,
|
|
2091
|
+
wallet custody, code execution or public chat surfaces.
|
|
2092
|
+
|
|
2093
|
+
Releases before 1.0.0 (0.4.2 through 0.13.0) are in
|
|
2094
|
+
[`CHANGELOG-archive.md`](CHANGELOG-archive.md).
|