polyrob 0.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (745) hide show
  1. agents/README.md +453 -0
  2. agents/__init__.py +164 -0
  3. agents/base_agent.py +743 -0
  4. agents/personality/character.py +119 -0
  5. agents/personality/character_manager.py +309 -0
  6. agents/personality/characters/rob.character.json +56 -0
  7. agents/personality/characters/trump.character.json +63 -0
  8. agents/personality/persona_render.py +78 -0
  9. agents/personality/persona_resolver.py +115 -0
  10. agents/prompt/__init__.py +58 -0
  11. agents/prompt/base_prompt.py +92 -0
  12. agents/prompt/system.py +417 -0
  13. agents/task/README_PATH_MANAGEMENT.md +141 -0
  14. agents/task/__init__.py +162 -0
  15. agents/task/agent/__init__.py +70 -0
  16. agents/task/agent/agent_state.py +408 -0
  17. agents/task/agent/async_delegation.py +274 -0
  18. agents/task/agent/autonomy_state.py +275 -0
  19. agents/task/agent/conversation.py +75 -0
  20. agents/task/agent/core/__init__.py +6 -0
  21. agents/task/agent/core/aux_metering.py +61 -0
  22. agents/task/agent/core/background_review.py +157 -0
  23. agents/task/agent/core/construction.py +1179 -0
  24. agents/task/agent/core/conversational_exit.py +49 -0
  25. agents/task/agent/core/correspondent_gate.py +227 -0
  26. agents/task/agent/core/curator.py +246 -0
  27. agents/task/agent/core/episodic_digest.py +103 -0
  28. agents/task/agent/core/error_recovery.py +480 -0
  29. agents/task/agent/core/history_io.py +257 -0
  30. agents/task/agent/core/llm_provisioning.py +287 -0
  31. agents/task/agent/core/llm_runner.py +547 -0
  32. agents/task/agent/core/logging_io.py +276 -0
  33. agents/task/agent/core/loop_detection.py +262 -0
  34. agents/task/agent/core/memory_prefetch.py +325 -0
  35. agents/task/agent/core/memory_writer.py +667 -0
  36. agents/task/agent/core/model_introspection.py +82 -0
  37. agents/task/agent/core/model_swap.py +177 -0
  38. agents/task/agent/core/next_action_internal.py +1331 -0
  39. agents/task/agent/core/output_validation.py +303 -0
  40. agents/task/agent/core/project_context.py +272 -0
  41. agents/task/agent/core/resources.py +93 -0
  42. agents/task/agent/core/result_processing.py +389 -0
  43. agents/task/agent/core/run_loop.py +661 -0
  44. agents/task/agent/core/safety_lifecycle.py +228 -0
  45. agents/task/agent/core/secret_guard.py +293 -0
  46. agents/task/agent/core/self_wake.py +280 -0
  47. agents/task/agent/core/session_metadata.py +104 -0
  48. agents/task/agent/core/step.py +781 -0
  49. agents/task/agent/core/step_execution.py +398 -0
  50. agents/task/agent/core/step_telemetry.py +222 -0
  51. agents/task/agent/core/test_aux_metering.py +50 -0
  52. agents/task/agent/core/test_billing_failover.py +68 -0
  53. agents/task/agent/core/test_fatal_error_classifier.py +38 -0
  54. agents/task/agent/core/test_judge_validation.py +275 -0
  55. agents/task/agent/core/test_model_swap.py +190 -0
  56. agents/task/agent/core/test_reflection_offload.py +54 -0
  57. agents/task/agent/core/turn_input.py +8 -0
  58. agents/task/agent/core/untrusted_wrap.py +103 -0
  59. agents/task/agent/core/user_ingress.py +228 -0
  60. agents/task/agent/hitl_manager.py +396 -0
  61. agents/task/agent/log_sanitize.py +36 -0
  62. agents/task/agent/message_manager/config.py +97 -0
  63. agents/task/agent/message_manager/service.py +758 -0
  64. agents/task/agent/message_manager/tests.py +305 -0
  65. agents/task/agent/message_manager/tool_call_builder.py +539 -0
  66. agents/task/agent/message_manager/tool_message_repair.py +364 -0
  67. agents/task/agent/message_manager/views.py +143 -0
  68. agents/task/agent/messages/__init__.py +8 -0
  69. agents/task/agent/messages/builders.py +309 -0
  70. agents/task/agent/messages/compactor.py +611 -0
  71. agents/task/agent/messages/context_references.py +271 -0
  72. agents/task/agent/messages/filters.py +333 -0
  73. agents/task/agent/messages/guidance.py +328 -0
  74. agents/task/agent/messages/persistence.py +448 -0
  75. agents/task/agent/messages/retrieval.py +506 -0
  76. agents/task/agent/messages/sqlite_persistence.py +85 -0
  77. agents/task/agent/messages/test_compaction_upgrade.py +349 -0
  78. agents/task/agent/messages/test_persistence_subdir_fix.py +28 -0
  79. agents/task/agent/messages/test_sqlite_persistence.py +54 -0
  80. agents/task/agent/messages/token_counter.py +532 -0
  81. agents/task/agent/orchestrator.py +776 -0
  82. agents/task/agent/profile_manager.py +105 -0
  83. agents/task/agent/profile_registry.py +173 -0
  84. agents/task/agent/prompts.py +1090 -0
  85. agents/task/agent/scenario_registry.py +226 -0
  86. agents/task/agent/service.py +509 -0
  87. agents/task/agent/session.py +984 -0
  88. agents/task/agent/skill_discovery.py +110 -0
  89. agents/task/agent/skill_frontmatter.py +94 -0
  90. agents/task/agent/skill_manager.py +1201 -0
  91. agents/task/agent/skill_store.py +627 -0
  92. agents/task/agent/skill_validation.py +56 -0
  93. agents/task/agent/skill_writer.py +492 -0
  94. agents/task/agent/sub_agent_manager.py +1137 -0
  95. agents/task/agent/test_session_disk_recovery.py +34 -0
  96. agents/task/agent/tests.py +513 -0
  97. agents/task/agent/tool_call_tracker.py +511 -0
  98. agents/task/agent/views.py +469 -0
  99. agents/task/config.py +432 -0
  100. agents/task/constants.py +1384 -0
  101. agents/task/flag_defaults.py +63 -0
  102. agents/task/goals/__init__.py +1 -0
  103. agents/task/goals/autonomy_marker.py +28 -0
  104. agents/task/goals/board.py +690 -0
  105. agents/task/goals/completion_judge.py +247 -0
  106. agents/task/goals/context.py +62 -0
  107. agents/task/goals/dispatcher.py +848 -0
  108. agents/task/goals/escalation.py +102 -0
  109. agents/task/goals/planner.py +114 -0
  110. agents/task/logging_config.py +155 -0
  111. agents/task/path.py +991 -0
  112. agents/task/robust_parse_config.py +400 -0
  113. agents/task/runtime/__init__.py +0 -0
  114. agents/task/runtime/run_as_session.py +130 -0
  115. agents/task/runtime_safety.py +308 -0
  116. agents/task/session/__init__.py +5 -0
  117. agents/task/session/browser_pool.py +130 -0
  118. agents/task/session/cleanup.py +612 -0
  119. agents/task/session/execution.py +397 -0
  120. agents/task/session/feed.py +200 -0
  121. agents/task/session/hitl_ingress.py +201 -0
  122. agents/task/session/hooks.py +83 -0
  123. agents/task/session/multi_agent.py +243 -0
  124. agents/task/session/workspace.py +91 -0
  125. agents/task/session_registry.py +91 -0
  126. agents/task/session_route.py +35 -0
  127. agents/task/sqlite_session_registry.py +261 -0
  128. agents/task/surface_config.py +185 -0
  129. agents/task/telemetry/__init__.py +58 -0
  130. agents/task/telemetry/event_log.py +180 -0
  131. agents/task/telemetry/formatters.py +642 -0
  132. agents/task/telemetry/manager.py +571 -0
  133. agents/task/telemetry/memory_events.py +66 -0
  134. agents/task/telemetry/self_events.py +53 -0
  135. agents/task/telemetry/sequence.py +160 -0
  136. agents/task/telemetry/service.py +1265 -0
  137. agents/task/telemetry/views.py +882 -0
  138. agents/task/templates.py +98 -0
  139. agents/task/test_aux_chain.py +151 -0
  140. agents/task/test_aux_router.py +41 -0
  141. agents/task/tests/test_parse_robustness.py +170 -0
  142. agents/task/tool_defaults.py +110 -0
  143. agents/task/utils.py +762 -0
  144. agents/task/utils_json.py +768 -0
  145. agents/task/utils_webview.py +86 -0
  146. agents/task/workspace_context.py +229 -0
  147. agents/task_agent_lite.py +2398 -0
  148. api/README.md +683 -0
  149. api/TASK_API_DOCS.md +151 -0
  150. api/__init__.py +0 -0
  151. api/a2a/__init__.py +37 -0
  152. api/a2a/agent_card.py +337 -0
  153. api/a2a/client.py +657 -0
  154. api/a2a/endpoints.py +375 -0
  155. api/a2a/models.py +268 -0
  156. api/a2a/streaming.py +419 -0
  157. api/a2a/task_handler.py +929 -0
  158. api/admin_endpoints.py +1584 -0
  159. api/app.py +923 -0
  160. api/auth_constants.py +28 -0
  161. api/auth_endpoints.py +402 -0
  162. api/auth_state.py +36 -0
  163. api/chat_via_task.py +42 -0
  164. api/conversation_manager.py +231 -0
  165. api/dependencies.py +186 -0
  166. api/eip8004_endpoints.py +452 -0
  167. api/hyperliquid_models.py +174 -0
  168. api/hyperliquid_routes.py +450 -0
  169. api/interfaces.py +207 -0
  170. api/jwt_middleware.py +83 -0
  171. api/kb/__init__.py +1 -0
  172. api/kb/endpoints.py +314 -0
  173. api/mcp_models.py +279 -0
  174. api/mcp_routes.py +438 -0
  175. api/middleware.py +526 -0
  176. api/models.py +176 -0
  177. api/openai_compat/__init__.py +0 -0
  178. api/openai_compat/model_map.py +25 -0
  179. api/openai_compat/models.py +59 -0
  180. api/openai_compat/router.py +140 -0
  181. api/payment_endpoints.py +444 -0
  182. api/payment_verification.py +138 -0
  183. api/polymarket_models.py +155 -0
  184. api/polymarket_routes.py +501 -0
  185. api/pricing_endpoints.py +89 -0
  186. api/session_routing.py +54 -0
  187. api/skill_endpoints.py +453 -0
  188. api/task_http_api.py +1856 -0
  189. api/webhooks.py +52 -0
  190. api/x402_endpoints.py +280 -0
  191. avatar/README.md +44 -0
  192. avatar/__init__.py +1 -0
  193. avatar/config/rob.json +7 -0
  194. avatar/mindprint.js +395 -0
  195. avatar/renders/rob.meta.json +20 -0
  196. avatar/renders/rob.png +0 -0
  197. avatar/studio.html +373 -0
  198. avatar/webview/avatar-live.js +44 -0
  199. cli/README.md +89 -0
  200. cli/__init__.py +0 -0
  201. cli/cli_surface.py +67 -0
  202. cli/commands/__init__.py +0 -0
  203. cli/commands/_bootstrap.py +49 -0
  204. cli/commands/_errors.py +53 -0
  205. cli/commands/chat.py +973 -0
  206. cli/commands/config.py +100 -0
  207. cli/commands/dashboard.py +103 -0
  208. cli/commands/doctor.py +222 -0
  209. cli/commands/email.py +174 -0
  210. cli/commands/gateway.py +346 -0
  211. cli/commands/goals.py +509 -0
  212. cli/commands/init.py +276 -0
  213. cli/commands/journey.py +30 -0
  214. cli/commands/kb.py +280 -0
  215. cli/commands/model.py +107 -0
  216. cli/commands/owner.py +431 -0
  217. cli/commands/pfp.py +232 -0
  218. cli/commands/run.py +414 -0
  219. cli/commands/serve.py +41 -0
  220. cli/commands/session.py +684 -0
  221. cli/commands/skill_install.py +786 -0
  222. cli/commands/skills.py +128 -0
  223. cli/commands/subagents.py +100 -0
  224. cli/commands/surface.py +81 -0
  225. cli/commands/telegram.py +185 -0
  226. cli/commands/todos.py +209 -0
  227. cli/commands/tools.py +102 -0
  228. cli/commands/update.py +316 -0
  229. cli/commands/whatsapp.py +175 -0
  230. cli/config_store.py +276 -0
  231. cli/gitignore.py +43 -0
  232. cli/inventory.py +46 -0
  233. cli/keys.py +101 -0
  234. cli/persona.py +17 -0
  235. cli/polyrob.py +137 -0
  236. cli/ui/__init__.py +64 -0
  237. cli/ui/activity.py +141 -0
  238. cli/ui/app.py +538 -0
  239. cli/ui/banner.py +233 -0
  240. cli/ui/blocks.py +534 -0
  241. cli/ui/bootstrap_notice.py +47 -0
  242. cli/ui/commands/__init__.py +41 -0
  243. cli/ui/commands/h_cron.py +64 -0
  244. cli/ui/commands/h_journey.py +164 -0
  245. cli/ui/commands/h_kb.py +121 -0
  246. cli/ui/commands/h_learn.py +100 -0
  247. cli/ui/commands/h_mcp.py +215 -0
  248. cli/ui/commands/h_self.py +113 -0
  249. cli/ui/commands/h_skills.py +314 -0
  250. cli/ui/commands/handlers.py +1672 -0
  251. cli/ui/commands/registry.py +426 -0
  252. cli/ui/dialog.py +425 -0
  253. cli/ui/event_registry.py +110 -0
  254. cli/ui/event_specs.py +45 -0
  255. cli/ui/events.py +433 -0
  256. cli/ui/identity.py +15 -0
  257. cli/ui/lifecycle.py +159 -0
  258. cli/ui/live_hooks.py +43 -0
  259. cli/ui/model_selector.py +532 -0
  260. cli/ui/persistent_loop.py +181 -0
  261. cli/ui/pick.py +113 -0
  262. cli/ui/plain_renderer.py +351 -0
  263. cli/ui/renderer.py +384 -0
  264. cli/ui/rich_renderer.py +533 -0
  265. cli/ui/secrets.py +115 -0
  266. cli/ui/state.py +376 -0
  267. cli/ui/statusbar.py +231 -0
  268. cli/ui/streaming.py +254 -0
  269. cli/ui/terminal_render.py +105 -0
  270. cli/ui/theme.py +132 -0
  271. cli/update/__init__.py +6 -0
  272. cli/update/context.py +121 -0
  273. cli/update/detect.py +176 -0
  274. cli/update/engine.py +95 -0
  275. cli/update/migrate_guarded.py +55 -0
  276. cli/update/process_guard.py +215 -0
  277. cli/update/runners.py +78 -0
  278. cli/update/snapshot.py +270 -0
  279. cli/update/versions.py +205 -0
  280. core/README.md +377 -0
  281. core/__init__.py +174 -0
  282. core/assets.py +87 -0
  283. core/async_bridge.py +76 -0
  284. core/autonomy_runtime.py +259 -0
  285. core/base_component.py +302 -0
  286. core/bootstrap.py +681 -0
  287. core/bot.py +310 -0
  288. core/config.py +833 -0
  289. core/constants.py +126 -0
  290. core/container.py +462 -0
  291. core/db_manifest.py +101 -0
  292. core/embedding.py +57 -0
  293. core/env.py +39 -0
  294. core/exceptions.py +287 -0
  295. core/flags.py +144 -0
  296. core/flags_catalog.py +345 -0
  297. core/home_migration.py +62 -0
  298. core/identity.py +118 -0
  299. core/initialization.py +1004 -0
  300. core/instance.py +537 -0
  301. core/interactive_gate.py +96 -0
  302. core/logging.py +436 -0
  303. core/owner_doc_writer.py +176 -0
  304. core/pairing.py +193 -0
  305. core/path_safety.py +20 -0
  306. core/paths.py +27 -0
  307. core/payment_config.py +21 -0
  308. core/permissions.py +322 -0
  309. core/runtime_config.py +96 -0
  310. core/runtime_paths.py +135 -0
  311. core/seams.py +35 -0
  312. core/secret_scan.py +25 -0
  313. core/secret_scrub.py +71 -0
  314. core/secrets.py +35 -0
  315. core/security_logging_filter.py +148 -0
  316. core/self_context_writer.py +333 -0
  317. core/self_evolution.py +294 -0
  318. core/session_context.py +47 -0
  319. core/sqlite_util.py +59 -0
  320. core/surfaces/__init__.py +16 -0
  321. core/surfaces/access.py +118 -0
  322. core/surfaces/binding.py +88 -0
  323. core/surfaces/bootstrap.py +78 -0
  324. core/surfaces/circuit.py +168 -0
  325. core/surfaces/continuity.py +77 -0
  326. core/surfaces/correspondents.py +228 -0
  327. core/surfaces/dispatcher.py +216 -0
  328. core/surfaces/envelopes.py +75 -0
  329. core/surfaces/gc.py +30 -0
  330. core/surfaces/idempotency.py +57 -0
  331. core/surfaces/inbound_webhook.py +124 -0
  332. core/surfaces/media.py +32 -0
  333. core/surfaces/message_router.py +91 -0
  334. core/surfaces/outbound_allowlist.py +80 -0
  335. core/surfaces/outbound_dispatcher.py +110 -0
  336. core/surfaces/outbound_mirror.py +37 -0
  337. core/surfaces/outbound_queue.py +107 -0
  338. core/surfaces/outbound_target.py +12 -0
  339. core/surfaces/owner_admin.py +29 -0
  340. core/surfaces/proactive.py +78 -0
  341. core/surfaces/progress.py +108 -0
  342. core/surfaces/rate_bucket.py +21 -0
  343. core/surfaces/registry.py +51 -0
  344. core/surfaces/rendering.py +53 -0
  345. core/surfaces/send_policy.py +14 -0
  346. core/surfaces/serialize.py +24 -0
  347. core/surfaces/session_chat_registry.py +112 -0
  348. core/surfaces/session_policy.py +60 -0
  349. core/surfaces/surface.py +288 -0
  350. core/surfaces/transcription.py +88 -0
  351. core/surfaces/voice_echo.py +26 -0
  352. core/surfaces/voice_guard.py +23 -0
  353. core/tickers.py +174 -0
  354. core/tool_catalog.py +192 -0
  355. core/version.py +75 -0
  356. core/wallet/__init__.py +5 -0
  357. core/wallet/agent_wallet.py +59 -0
  358. core/wallet/audit_sink.py +61 -0
  359. core/wallet/config.py +70 -0
  360. core/wallet/factory.py +87 -0
  361. core/wallet/policy.py +104 -0
  362. core/wallet/signer.py +51 -0
  363. cron/README.md +65 -0
  364. cron/__init__.py +0 -0
  365. cron/delivery.py +277 -0
  366. cron/digest.py +124 -0
  367. cron/jobs.py +207 -0
  368. cron/runner.py +297 -0
  369. cron/schedule.py +194 -0
  370. cron/scheduler.py +201 -0
  371. cron/service.py +57 -0
  372. cron/wake_gate.py +223 -0
  373. data/__init__.py +1 -0
  374. data/prompts/autov2_prompts.json +87 -0
  375. data/prompts/skills/browser-automation/SKILL.md +43 -0
  376. data/prompts/skills/coding-workflow/SKILL.md +36 -0
  377. data/prompts/skills/crypto-trading-safety/SKILL.md +53 -0
  378. data/prompts/skills/document-writing/SKILL.md +33 -0
  379. data/prompts/skills/email-comms/SKILL.md +33 -0
  380. data/prompts/skills/file-data-ops/SKILL.md +35 -0
  381. data/prompts/skills/hyperliquid-account-review/SKILL.md +48 -0
  382. data/prompts/skills/hyperliquid-market-data/SKILL.md +52 -0
  383. data/prompts/skills/hyperliquid-trading/SKILL.md +59 -0
  384. data/prompts/skills/lead-research/SKILL.md +86 -0
  385. data/prompts/skills/market-research-brief/SKILL.md +104 -0
  386. data/prompts/skills/person-analyzer/SKILL.md +124 -0
  387. data/prompts/skills/polymarket-market-research/SKILL.md +54 -0
  388. data/prompts/skills/polymarket-portfolio-review/SKILL.md +50 -0
  389. data/prompts/skills/polymarket-trading/SKILL.md +55 -0
  390. data/prompts/skills/presentation-creator/SKILL.md +36 -0
  391. data/prompts/skills/project-analyzer/SKILL.md +169 -0
  392. data/prompts/skills/rules.json +268 -0
  393. data/prompts/skills/secret-handling/SKILL.md +20 -0
  394. data/prompts/skills/skill-authoring/SKILL.md +31 -0
  395. data/prompts/skills/skill-security-review/SKILL.md +27 -0
  396. data/prompts/skills/social-discovery/SKILL.md +57 -0
  397. data/prompts/skills/task-planning/SKILL.md +33 -0
  398. data/prompts/skills/web-research/SKILL.md +39 -0
  399. data/prompts/skills/web-scraping/SKILL.md +73 -0
  400. data/prompts/skills/x-engagement/SKILL.md +69 -0
  401. data/prompts/system_prompts.json +4 -0
  402. data/subscription_channels.json +5 -0
  403. modules/README.md +503 -0
  404. modules/__init__.py +124 -0
  405. modules/auth/__init__.py +13 -0
  406. modules/auth/api_key_manager.py +157 -0
  407. modules/auth/identity_mapper.py +380 -0
  408. modules/auth/siwe_auth.py +273 -0
  409. modules/auth/tier_manager.py +173 -0
  410. modules/base_module.py +190 -0
  411. modules/credits/__init__.py +29 -0
  412. modules/credits/balance_manager.py +237 -0
  413. modules/credits/cost_utils.py +129 -0
  414. modules/credits/pricing.py +139 -0
  415. modules/credits/unified_ledger.py +148 -0
  416. modules/credits/usage_meter.py +310 -0
  417. modules/credits/usage_tracker.py +674 -0
  418. modules/database/__init__.py +33 -0
  419. modules/database/audit_log.py +322 -0
  420. modules/database/auth_tables.py +276 -0
  421. modules/database/connection.py +644 -0
  422. modules/database/connection_pool.py +305 -0
  423. modules/database/conversation_contexts.py +446 -0
  424. modules/database/database_manager.py +237 -0
  425. modules/database/hyperliquid.py +375 -0
  426. modules/database/polymarket.py +574 -0
  427. modules/database/user_mcp_servers.py +728 -0
  428. modules/database/user_profiles.py +562 -0
  429. modules/database/utils.py +107 -0
  430. modules/database/x402_tables.py +92 -0
  431. modules/eip8004/README.md +1069 -0
  432. modules/eip8004/__init__.py +65 -0
  433. modules/eip8004/contracts.py +498 -0
  434. modules/eip8004/models.py +271 -0
  435. modules/eip8004/registration.py +148 -0
  436. modules/eip8004/reputation.py +367 -0
  437. modules/eip8004/validation.py +277 -0
  438. modules/llm/__init__.py +97 -0
  439. modules/llm/adapters.py +963 -0
  440. modules/llm/anthropic_client.py +831 -0
  441. modules/llm/available_models.py +106 -0
  442. modules/llm/brain_scrubber.py +137 -0
  443. modules/llm/cache_hints.py +162 -0
  444. modules/llm/deepseek_client.py +562 -0
  445. modules/llm/gemini_client.py +1367 -0
  446. modules/llm/llm_client.py +1139 -0
  447. modules/llm/llm_client_registry.py +188 -0
  448. modules/llm/llm_factory.py +237 -0
  449. modules/llm/llm_manager.py +1036 -0
  450. modules/llm/messages.py +374 -0
  451. modules/llm/model_registry.py +1935 -0
  452. modules/llm/nvidia_client.py +125 -0
  453. modules/llm/openai_client.py +800 -0
  454. modules/llm/openrouter_client.py +969 -0
  455. modules/llm/profiles.py +178 -0
  456. modules/llm/test_anthropic_cache_capture.py +35 -0
  457. modules/llm/test_cached_pricing_derivation.py +24 -0
  458. modules/llm/think_scrubber.py +444 -0
  459. modules/llm/token_counter.py +268 -0
  460. modules/memory/__init__.py +35 -0
  461. modules/memory/backend_factory.py +83 -0
  462. modules/memory/cache_manager.py +186 -0
  463. modules/memory/episodic.py +108 -0
  464. modules/memory/local_vector_memory_provider.py +552 -0
  465. modules/memory/memory_manager.py +225 -0
  466. modules/memory/models.py +312 -0
  467. modules/memory/provider.py +210 -0
  468. modules/memory/registry.py +205 -0
  469. modules/memory/sqlite_memory_provider.py +767 -0
  470. modules/memory/task/__init__.py +52 -0
  471. modules/memory/task/compaction_manager.py +157 -0
  472. modules/memory/task/context_retriever.py +809 -0
  473. modules/memory/task/hierarchical_memory.py +1002 -0
  474. modules/memory/task/lexical_retriever.py +71 -0
  475. modules/memory/task/null_context_manager.py +213 -0
  476. modules/memory/task/phase_manager.py +625 -0
  477. modules/memory/task/reflection_service.py +157 -0
  478. modules/memory/task/semantic_retriever.py +218 -0
  479. modules/memory/task/task_context_manager.py +1165 -0
  480. modules/memory/task/test_forgetting_engages.py +24 -0
  481. modules/memory/task/test_reflection_llm.py +39 -0
  482. modules/memory/task/test_threat_scan.py +53 -0
  483. modules/memory/task/threat_scan.py +90 -0
  484. modules/memory/test_sqlite_memory_provider.py +106 -0
  485. modules/memory/user_profile_manager.py +527 -0
  486. modules/payments/__init__.py +11 -0
  487. modules/payments/deposit_monitor.py +478 -0
  488. modules/payments/price_oracle.py +70 -0
  489. modules/payments/treasury_sweeper.py +401 -0
  490. modules/payments/wallet_generator.py +145 -0
  491. modules/pfp/__init__.py +1 -0
  492. modules/pfp/config.py +92 -0
  493. modules/pfp/mesh.py +565 -0
  494. modules/pfp/push.py +69 -0
  495. modules/pfp/renderer.py +85 -0
  496. modules/pfp/store.py +82 -0
  497. modules/skills/__init__.py +1 -0
  498. modules/skills/skill_usage.py +248 -0
  499. modules/transcription/__init__.py +24 -0
  500. modules/transcription/base.py +20 -0
  501. modules/transcription/faster_whisper_transcriber.py +55 -0
  502. modules/x402/README.md +249 -0
  503. modules/x402/__init__.py +22 -0
  504. modules/x402/invoicing.py +416 -0
  505. modules/x402/middleware.py +364 -0
  506. modules/x402/settlement_watcher.py +145 -0
  507. modules/x402/x402_integration.py +344 -0
  508. polyrob-0.5.0.dist-info/METADATA +482 -0
  509. polyrob-0.5.0.dist-info/RECORD +745 -0
  510. polyrob-0.5.0.dist-info/WHEEL +5 -0
  511. polyrob-0.5.0.dist-info/entry_points.txt +2 -0
  512. polyrob-0.5.0.dist-info/licenses/LICENSE +21 -0
  513. polyrob-0.5.0.dist-info/top_level.txt +12 -0
  514. surfaces/README.md +70 -0
  515. surfaces/__init__.py +0 -0
  516. surfaces/email/__init__.py +0 -0
  517. surfaces/email/dedup.py +44 -0
  518. surfaces/email/harness.py +187 -0
  519. surfaces/email/inbound.py +159 -0
  520. surfaces/email/seed.py +60 -0
  521. surfaces/email/surface.py +105 -0
  522. surfaces/telegram/__init__.py +0 -0
  523. surfaces/telegram/dedup.py +83 -0
  524. surfaces/telegram/harness.py +886 -0
  525. surfaces/telegram/inbound.py +145 -0
  526. surfaces/telegram/interactive_tools.py +49 -0
  527. surfaces/telegram/markdown.py +347 -0
  528. surfaces/telegram/rate_limit.py +167 -0
  529. surfaces/telegram/surface.py +187 -0
  530. surfaces/telegram/voice.py +52 -0
  531. surfaces/whatsapp/__init__.py +0 -0
  532. surfaces/whatsapp/client.py +51 -0
  533. surfaces/whatsapp/harness.py +62 -0
  534. surfaces/whatsapp/inbound.py +132 -0
  535. surfaces/whatsapp/surface.py +64 -0
  536. surfaces/whatsapp/window.py +34 -0
  537. tools/README.md +578 -0
  538. tools/__init__.py +424 -0
  539. tools/alchemy/__init__.py +5 -0
  540. tools/alchemy/alchemy_tool.py +389 -0
  541. tools/anysite/__init__.py +17 -0
  542. tools/anysite/client.py +88 -0
  543. tools/anysite/tool.py +89 -0
  544. tools/base_tool.py +468 -0
  545. tools/browser/__init__.py +22 -0
  546. tools/browser/actions.py +118 -0
  547. tools/browser/browser.py +1457 -0
  548. tools/browser/browser_manager.py +690 -0
  549. tools/browser/context.py +1748 -0
  550. tools/browser/playwright_utils.py +137 -0
  551. tools/browser/views.py +56 -0
  552. tools/code_exec/SANDBOX_SECURITY.md +144 -0
  553. tools/code_exec/__init__.py +178 -0
  554. tools/code_exec/backend.py +73 -0
  555. tools/code_exec/backends/__init__.py +1 -0
  556. tools/code_exec/backends/docker.py +779 -0
  557. tools/code_exec/backends/local_subprocess.py +154 -0
  558. tools/code_exec/env_policy.py +45 -0
  559. tools/code_exec/result.py +42 -0
  560. tools/code_exec/sandbox_guard.py +59 -0
  561. tools/code_exec/tool.py +227 -0
  562. tools/coding/__init__.py +50 -0
  563. tools/coding/edit.py +107 -0
  564. tools/coding/search.py +113 -0
  565. tools/coding/tool.py +353 -0
  566. tools/collabland/__init__.py +5 -0
  567. tools/collabland/collabland_tool.py +471 -0
  568. tools/controller/__init__.py +0 -0
  569. tools/controller/_helpers.py +165 -0
  570. tools/controller/action_registration.py +1765 -0
  571. tools/controller/approval.py +244 -0
  572. tools/controller/approval_interactive.py +90 -0
  573. tools/controller/delegation.py +195 -0
  574. tools/controller/execution.py +797 -0
  575. tools/controller/execution_context.py +141 -0
  576. tools/controller/hooks.py +135 -0
  577. tools/controller/introspection.py +344 -0
  578. tools/controller/mcp_registrar.py +190 -0
  579. tools/controller/message_send.py +31 -0
  580. tools/controller/registry/__init__.py +4 -0
  581. tools/controller/registry/schema_generators.py +395 -0
  582. tools/controller/registry/schema_sanitizer.py +406 -0
  583. tools/controller/registry/service.py +1266 -0
  584. tools/controller/registry/views.py +151 -0
  585. tools/controller/service.py +409 -0
  586. tools/controller/tool_management.py +334 -0
  587. tools/controller/types.py +28 -0
  588. tools/controller/views.py +450 -0
  589. tools/cronjob_tools.py +166 -0
  590. tools/crypto_trade_gate.py +59 -0
  591. tools/descriptors.py +452 -0
  592. tools/dom/__init__.py +0 -0
  593. tools/dom/history_tree_processor/service.py +244 -0
  594. tools/dom/history_tree_processor/view.py +99 -0
  595. tools/dom/service.py +471 -0
  596. tools/dom/views.py +346 -0
  597. tools/email_tool.py +403 -0
  598. tools/exceptions.py +169 -0
  599. tools/filesystem.py +1038 -0
  600. tools/filesystem_docproc.py +331 -0
  601. tools/filesystem_pdf.py +755 -0
  602. tools/git/__init__.py +42 -0
  603. tools/git/tool.py +258 -0
  604. tools/github/__init__.py +33 -0
  605. tools/github/client.py +94 -0
  606. tools/github/tool.py +237 -0
  607. tools/goal_tools.py +309 -0
  608. tools/hyperliquid/__init__.py +56 -0
  609. tools/hyperliquid/models.py +233 -0
  610. tools/hyperliquid/service.py +1680 -0
  611. tools/knowledge_ingest.py +950 -0
  612. tools/mcp/README.md +535 -0
  613. tools/mcp/__init__.py +52 -0
  614. tools/mcp/catalog.py +115 -0
  615. tools/mcp/config.py +337 -0
  616. tools/mcp/mcp_tool.py +1415 -0
  617. tools/mcp/param_coercion.py +289 -0
  618. tools/mcp/protocol.py +1520 -0
  619. tools/mcp/rate_limit.py +50 -0
  620. tools/mcp/security.py +424 -0
  621. tools/mcp/self_install.py +111 -0
  622. tools/mcp/server_manager.py +829 -0
  623. tools/mcp/subscriptions.py +72 -0
  624. tools/mcp/user_mcp_service.py +899 -0
  625. tools/mcp/validation_tracker.py +89 -0
  626. tools/mcp/views.py +346 -0
  627. tools/oauth/__init__.py +17 -0
  628. tools/oauth/manager.py +75 -0
  629. tools/oauth/provider.py +69 -0
  630. tools/oauth/providers/__init__.py +1 -0
  631. tools/oauth/providers/generic_oauth2.py +96 -0
  632. tools/perplexity_tool.py +280 -0
  633. tools/polymarket/__init__.py +41 -0
  634. tools/polymarket/clob_adapter.py +76 -0
  635. tools/polymarket/models.py +182 -0
  636. tools/polymarket/service.py +2082 -0
  637. tools/self_env/__init__.py +61 -0
  638. tools/self_env/tool.py +274 -0
  639. tools/shell/__init__.py +80 -0
  640. tools/shell/backend_pool.py +118 -0
  641. tools/shell/discipline.py +62 -0
  642. tools/shell/executor.py +157 -0
  643. tools/shell/loopback_allow.py +87 -0
  644. tools/shell/process_registry.py +113 -0
  645. tools/shell/process_tool.py +131 -0
  646. tools/shell/state.py +129 -0
  647. tools/shell/tool.py +151 -0
  648. tools/task_tool.py +637 -0
  649. tools/twitter_tool.py +2086 -0
  650. tools/user_directory.py +179 -0
  651. tools/web_fetch/__init__.py +3 -0
  652. tools/web_fetch/fetcher.py +144 -0
  653. tools/web_fetch/render.py +44 -0
  654. tools/web_fetch/tool.py +60 -0
  655. tools/x402/__init__.py +60 -0
  656. tools/x402/client.py +47 -0
  657. tools/x402/invoice_tool.py +143 -0
  658. tools/x402/real_client.py +250 -0
  659. tools/x402/service.py +131 -0
  660. utils/README.md +498 -0
  661. utils/__init__.py +46 -0
  662. utils/auth_utils.py +114 -0
  663. utils/bounded_collections.py +162 -0
  664. utils/circuit_breaker.py +389 -0
  665. utils/gif_utils.py +435 -0
  666. utils/markdown_utils.py +291 -0
  667. utils/message_utils.py +147 -0
  668. utils/metrics.py +36 -0
  669. utils/path_validator.py +227 -0
  670. utils/rate_limit_manager.py +399 -0
  671. utils/result_size.py +296 -0
  672. utils/time_utils.py +206 -0
  673. utils/user_utils.py +188 -0
  674. webview/README.md +111 -0
  675. webview/RENAME_AND_ALIGN_HANDOFF.md +200 -0
  676. webview/__init__.py +8 -0
  677. webview/activity.py +636 -0
  678. webview/owner_auth.py +108 -0
  679. webview/pages.py +448 -0
  680. webview/repair_sessions.py +399 -0
  681. webview/server.py +4323 -0
  682. webview/server_launcher.py +112 -0
  683. webview/static/css/activity.css +89 -0
  684. webview/static/css/chat.css +1772 -0
  685. webview/static/css/components.css +1190 -0
  686. webview/static/css/config-panel.css +651 -0
  687. webview/static/css/pages/admin.css +766 -0
  688. webview/static/css/pages/profile.css +231 -0
  689. webview/static/css/pages/settings.css +297 -0
  690. webview/static/css/pages/signin.css +316 -0
  691. webview/static/css/style.css +4250 -0
  692. webview/static/css/variables.css +147 -0
  693. webview/static/css/workspace-fullwidth-fix.css +109 -0
  694. webview/static/img/favicon.ico +0 -0
  695. webview/static/js/activity.js +394 -0
  696. webview/static/js/admin/activity.js +186 -0
  697. webview/static/js/admin/dashboard.js +163 -0
  698. webview/static/js/admin/user_detail.js +400 -0
  699. webview/static/js/admin/users.js +174 -0
  700. webview/static/js/admin/utils.js +214 -0
  701. webview/static/js/chat.js +3178 -0
  702. webview/static/js/config-panel.js +522 -0
  703. webview/static/js/constants.js +20 -0
  704. webview/static/js/error-handler.js +226 -0
  705. webview/static/js/ethers.min.js +1 -0
  706. webview/static/js/event-filter.js +137 -0
  707. webview/static/js/event-store.js +351 -0
  708. webview/static/js/file-attachments.js +374 -0
  709. webview/static/js/file-loader.js +163 -0
  710. webview/static/js/index.js +103 -0
  711. webview/static/js/performance-utils.js +196 -0
  712. webview/static/js/profile.js +396 -0
  713. webview/static/js/screenshot.js +386 -0
  714. webview/static/js/session.js +1527 -0
  715. webview/static/js/settings.js +1288 -0
  716. webview/static/js/sidebar-data.js +766 -0
  717. webview/static/js/sidebar-toggle.js +296 -0
  718. webview/static/js/socket.io.min.js +7 -0
  719. webview/static/js/stats.js +355 -0
  720. webview/static/js/ui-utils.js +420 -0
  721. webview/static/js/workspace.js +966 -0
  722. webview/stats_service.py +613 -0
  723. webview/templates/__init__.py +1 -0
  724. webview/templates/__pycache__/__init__.cpython-311.pyc +0 -0
  725. webview/templates/activity.html +36 -0
  726. webview/templates/admin/activity.html +122 -0
  727. webview/templates/admin/dashboard.html +112 -0
  728. webview/templates/admin/user_detail.html +228 -0
  729. webview/templates/admin/users.html +105 -0
  730. webview/templates/autonomy.html +60 -0
  731. webview/templates/error.html +133 -0
  732. webview/templates/finance.html +90 -0
  733. webview/templates/identity.html +73 -0
  734. webview/templates/index.html +42 -0
  735. webview/templates/layout.html +125 -0
  736. webview/templates/memory.html +59 -0
  737. webview/templates/owner_login.html +15 -0
  738. webview/templates/profile.html +121 -0
  739. webview/templates/session.html +312 -0
  740. webview/templates/settings.html +534 -0
  741. webview/templates/sidebar.html +112 -0
  742. webview/templates/signin.html +213 -0
  743. webview/templates/status.html +14 -0
  744. webview/templates/system.html +45 -0
  745. webview/webgate.py +196 -0
@@ -0,0 +1,133 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}Error - {{ console_display_name() }}{% endblock %}
4
+
5
+ {% block header_title %}SYSTEM ERROR{% endblock %}
6
+
7
+ {% set ws_url = ws_url|default('') %}
8
+
9
+ {% block content %}
10
+ <div class="error-screen">
11
+ <div class="error-box" style="max-width: 100%; width: 90ch;">
12
+ <div class="error-header">SYSTEM ERROR</div>
13
+ <div class="error-body">
14
+ <div class="error-message">
15
+ <span class="error-prefix">!</span> ERROR: {{ error }}
16
+ </div>
17
+ {% if message %}
18
+ <div class="error-details">
19
+ <span class="error-prefix">></span> {{ message }}
20
+ </div>
21
+ {% endif %}
22
+ {% if metadata_paths %}
23
+ <div class="error-section">
24
+ <div class="section-title">METADATA FILES:</div>
25
+ <div class="section-content">
26
+ {% for path in metadata_paths %}> {{ path }}
27
+ {% endfor %}</div>
28
+ </div>
29
+ {% endif %}
30
+ {% if checked_dir %}
31
+ <div class="error-section">
32
+ <div class="section-title">DIRECTORY PATH:</div>
33
+ <div class="section-content">> {{ checked_dir }}</div>
34
+ </div>
35
+ {% endif %}
36
+
37
+ <!-- Add troubleshooting actions section -->
38
+ <div class="error-section">
39
+ <div class="section-title">TROUBLESHOOTING:</div>
40
+ <div class="section-content">
41
+ <button id="refresh-all-sessions" class="action-btn">
42
+ <span class="action-prefix">></span> Force Refresh All Sessions
43
+ </button>
44
+ {% if session_id %}
45
+ <button id="repair-session" class="action-btn" data-session-id="{{ session_id }}">
46
+ <span class="action-prefix">></span> Attempt Repair For This Session
47
+ </button>
48
+ {% endif %}
49
+ </div>
50
+ </div>
51
+
52
+ <div class="error-section">
53
+ <div class="section-title">HINTS:</div>
54
+ <div class="section-content troubleshooting-hints">
55
+ {% for hint in troubleshooting %}
56
+ <div class="troubleshooting-hint">{{ hint|safe }}</div>
57
+ {% endfor %}
58
+ </div>
59
+ </div>
60
+
61
+ <div class="error-actions">
62
+ <a href="/" class="action-link">
63
+ <span class="action-prefix">></span> RETURN TO HOME
64
+ </a>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+
70
+ <script>
71
+ document.addEventListener('DOMContentLoaded', function() {
72
+ // Handle refresh all sessions button
73
+ document.getElementById('refresh-all-sessions').addEventListener('click', function() {
74
+ this.disabled = true;
75
+ this.innerHTML = '<span class="action-prefix">></span> Refreshing...';
76
+
77
+ fetch('/api/refresh')
78
+ .then(response => response.json())
79
+ .then(data => {
80
+ if (data.status === 'ok') {
81
+ this.innerHTML = '<span class="action-prefix">></span> Success! Sessions Refreshed';
82
+ // Redirect to home after 1 second
83
+ setTimeout(() => {
84
+ window.location.href = '/';
85
+ }, 1000);
86
+ } else {
87
+ this.innerHTML = '<span class="action-prefix">></span> Error: ' + data.message;
88
+ this.disabled = false;
89
+ }
90
+ })
91
+ .catch(error => {
92
+ console.error('Error refreshing sessions:', error);
93
+ this.innerHTML = '<span class="action-prefix">></span> Error Refreshing';
94
+ this.disabled = false;
95
+ });
96
+ });
97
+
98
+ // Handle repair session button if it exists
99
+ const repairBtn = document.getElementById('repair-session');
100
+ if (repairBtn) {
101
+ repairBtn.addEventListener('click', function() {
102
+ const sessionId = this.getAttribute('data-session-id');
103
+ this.disabled = true;
104
+ this.innerHTML = '<span class="action-prefix">></span> Repairing...';
105
+
106
+ fetch(`/api/repair/${sessionId}`)
107
+ .then(response => response.json())
108
+ .then(data => {
109
+ if (data.status === 'ok') {
110
+ this.innerHTML = '<span class="action-prefix">></span> Success! Redirecting...';
111
+ // Redirect to the session page
112
+ setTimeout(() => {
113
+ window.location.href = `/session/${sessionId}`;
114
+ }, 1000);
115
+ } else {
116
+ this.innerHTML = '<span class="action-prefix">></span> Error: ' + data.message;
117
+ this.disabled = false;
118
+ }
119
+ })
120
+ .catch(error => {
121
+ console.error('Error repairing session:', error);
122
+ this.innerHTML = '<span class="action-prefix">></span> Error Repairing';
123
+ this.disabled = false;
124
+ });
125
+ });
126
+ }
127
+ });
128
+ </script>
129
+ {% endblock %}
130
+
131
+ {% block head %}
132
+ <!-- Inline styles removed: styles moved to style.css -->
133
+ {% endblock %}
@@ -0,0 +1,90 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}{{ console_display_name() }} - Finance{% endblock %}
4
+ {% block header_title %}{{ console_display_name() }} - Finance{% endblock %}
5
+
6
+ {% block content %}
7
+ <div class="terminal-container webgate-page">
8
+ <div class="webgate-header">
9
+ <h2>Finance</h2>
10
+ <p class="text-muted text-sm">The agent's own balance sheet — earned, spent, pending — over a trailing window. Evidence-backed, read-only.</p>
11
+ </div>
12
+ <form id="finance-controls" class="webgate-search" onsubmit="return false;">
13
+ <label class="text-sm text-muted" for="finance-days">Window</label>
14
+ <select id="finance-days" class="form-control">
15
+ <option value="1">1 day</option>
16
+ <option value="7" selected>7 days</option>
17
+ <option value="30">30 days</option>
18
+ <option value="90">90 days</option>
19
+ </select>
20
+ </form>
21
+ <div id="finance-kpis" class="webgate-kpi-row">
22
+ <div class="loading">Loading…</div>
23
+ </div>
24
+ <div id="finance-breakdown" class="webgate-list"></div>
25
+ </div>
26
+
27
+ <style>
28
+ .webgate-kpi-row { display: flex; flex-wrap: wrap; gap: 12px; margin: 12px 0; }
29
+ .webgate-kpi { flex: 1 1 140px; border: 1px solid var(--border-color, #333); border-radius: 8px; padding: 12px 14px; }
30
+ .webgate-kpi .kpi-label { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.7; }
31
+ .webgate-kpi .kpi-value { font-size: 1.5rem; font-weight: 600; margin-top: 4px; }
32
+ .webgate-kpi .kpi-sub { font-size: 0.75rem; opacity: 0.6; margin-top: 2px; }
33
+ .kpi-value.pos { color: #3ba55d; }
34
+ .kpi-value.neg { color: #d83c3e; }
35
+ .webgate-brk-row { display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid var(--border-color, #2a2a2a); }
36
+ .webgate-brk-row .brk-k { opacity: 0.8; }
37
+ </style>
38
+
39
+ <script>
40
+ (function () {
41
+ const kpis = document.getElementById('finance-kpis');
42
+ const brk = document.getElementById('finance-breakdown');
43
+ const daysSel = document.getElementById('finance-days');
44
+
45
+ function money(n) { return '$' + (Number(n) || 0).toFixed(2); }
46
+
47
+ function kpi(label, value, cls, sub) {
48
+ return '<div class="webgate-kpi"><div class="kpi-label">' + label + '</div>' +
49
+ '<div class="kpi-value ' + (cls || '') + '">' + value + '</div>' +
50
+ (sub ? '<div class="kpi-sub">' + sub + '</div>' : '') + '</div>';
51
+ }
52
+
53
+ function row(k, v) {
54
+ return '<div class="webgate-brk-row"><span class="brk-k">' + k + '</span>' +
55
+ '<span class="brk-v">' + v + '</span></div>';
56
+ }
57
+
58
+ async function load() {
59
+ kpis.innerHTML = '<div class="loading">Loading…</div>';
60
+ brk.innerHTML = '';
61
+ try {
62
+ const res = await fetch('/api/webgate/ledger?days=' + encodeURIComponent(daysSel.value));
63
+ const d = await res.json();
64
+ const net = Number(d.net_usd) || 0;
65
+ kpis.innerHTML =
66
+ kpi('Earned', money(d.earned_usd), 'pos', (d.settled_payments || 0) + ' settled') +
67
+ kpi('Spent', money(d.total_spend_usd), 'neg',
68
+ (d.llm_calls || 0) + ' LLM calls, ' + (d.wallet_payments || 0) + ' payments') +
69
+ kpi('Net', money(net), net >= 0 ? 'pos' : 'neg', 'over ' + (d.window_days || '?') + 'd') +
70
+ kpi('Pending', money(d.pending_invoices_usd), '',
71
+ (d.pending_invoices || 0) + ' invoice(s)');
72
+ const caps = d.caps || {};
73
+ brk.innerHTML =
74
+ row('LLM / API cost', money(d.llm_api_cost_usd)) +
75
+ row('Wallet spend', money(d.wallet_spend_usd)) +
76
+ row('Platform credits spent', money(d.credits_spent)) +
77
+ row('Invoice ceiling', caps.invoice_max_usd != null ? money(caps.invoice_max_usd) : '—') +
78
+ row('Daily invoicing cap', caps.invoice_daily_max != null ? String(caps.invoice_daily_max) : '—') +
79
+ row('Wallet daily cap', caps.wallet_daily_cap_usd != null ? money(caps.wallet_daily_cap_usd) : 'unset') +
80
+ row('Autonomy budget', caps.autonomy_budget_usd != null ? money(caps.autonomy_budget_usd) : '—');
81
+ } catch (e) {
82
+ kpis.innerHTML = '<div class="webgate-empty">Could not load the ledger.</div>';
83
+ }
84
+ }
85
+
86
+ daysSel.addEventListener('change', load);
87
+ load();
88
+ })();
89
+ </script>
90
+ {% endblock %}
@@ -0,0 +1,73 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}{{ console_display_name() }} - Identity{% endblock %}
4
+ {% block header_title %}{{ console_display_name() }} - Identity{% endblock %}
5
+
6
+ {% block content %}
7
+ <div class="terminal-container webgate-page">
8
+ <div class="webgate-header">
9
+ <h2>Identity</h2>
10
+ <p class="text-muted text-sm">
11
+ Read-only view. SOUL is operator-authored and frozen; SELF is the agent's evolving doc.
12
+ Editing stays owner-gated via the <code>self_context_manage</code> action — there is no web write path.
13
+ </p>
14
+ </div>
15
+
16
+ <div class="webgate-avatar" style="display:flex;justify-content:center;padding:8px 0 16px">
17
+ <canvas id="agent-avatar" width="240" height="240" style="display:none" aria-label="Agent avatar"></canvas>
18
+ <img id="agent-avatar-fallback" alt="agent avatar" width="240" height="240" style="display:none"
19
+ onerror="this.style.display='none'">
20
+ </div>
21
+
22
+ <div class="webgate-meta">
23
+ <div><span class="meta-label">Instance:</span> <span id="id-instance" class="meta-value">—</span></div>
24
+ <div><span class="meta-label">Owner:</span> <span id="id-owner" class="meta-value">—</span></div>
25
+ </div>
26
+
27
+ <div class="webgate-section">
28
+ <div class="section-header">SOUL <span class="text-muted text-sm">(operator-authored, frozen)</span></div>
29
+ <pre id="id-soul" class="webgate-doc">Loading…</pre>
30
+ </div>
31
+
32
+ <div class="webgate-section">
33
+ <div class="section-header">SELF <span class="text-muted text-sm">(agent-writable, owner-gated)</span></div>
34
+ <pre id="id-self" class="webgate-doc">Loading…</pre>
35
+ </div>
36
+ </div>
37
+
38
+ <script>
39
+ (function () {
40
+ async function load() {
41
+ try {
42
+ const body = await (await fetch('/api/webgate/identity')).json();
43
+ document.getElementById('id-instance').textContent = body.instance_id || '—';
44
+ document.getElementById('id-owner').textContent = body.owner || '—';
45
+ document.getElementById('id-soul').textContent = body.soul || '(no SOUL document)';
46
+ document.getElementById('id-self').textContent = body.self || '(no SELF document)';
47
+ } catch (e) {
48
+ document.getElementById('id-soul').textContent = '(could not load identity)';
49
+ document.getElementById('id-self').textContent = '';
50
+ }
51
+ }
52
+ load();
53
+
54
+ // Avatar probe (P2-12): one quiet /pfp.json check decides whether an
55
+ // avatar exists — without it, the page fired loud 404s for pfp.png,
56
+ // pfp.json AND the engine scripts on every avatar-less instance.
57
+ fetch('/pfp.json').then(function (r) {
58
+ if (!r.ok) return; // no avatar — leave canvas/img hidden, load nothing
59
+ var img = document.getElementById('agent-avatar-fallback');
60
+ img.src = '/pfp.png';
61
+ img.style.display = '';
62
+ var engine = document.createElement('script');
63
+ engine.src = '/avatar/mindprint.js';
64
+ engine.onload = function () {
65
+ var live = document.createElement('script');
66
+ live.src = '/avatar/avatar-live.js';
67
+ document.body.appendChild(live);
68
+ };
69
+ document.body.appendChild(engine);
70
+ }).catch(function () {});
71
+ })();
72
+ </script>
73
+ {% endblock %}
@@ -0,0 +1,42 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}{{ console_display_name() }} - Session History{% endblock %}
4
+
5
+ {% block header_title %}{{ console_display_name() }} v{{ get_version() }}{% endblock %}
6
+
7
+ {% block head %}
8
+ <!-- IRC-style session catalog -->
9
+ <link rel="stylesheet" href="/static/css/chat.css?v=20251205">
10
+ {% endblock %}
11
+
12
+ {% block content %}
13
+ <div class="session-container history-mode">
14
+ <div class="main-panel">
15
+ <!-- Header with title and controls -->
16
+ <div class="tabs-wrapper">
17
+ <div class="tab-buttons">
18
+ <button class="tab-button active">Session History</button>
19
+ </div>
20
+
21
+ <div class="terminal-controls">
22
+ <button class="btn-new-session" title="Start new chat" onclick="window.location.href='/'">
23
+ + New Chat
24
+ </button>
25
+ </div>
26
+ </div>
27
+
28
+ <!-- Sessions list with IRC-style catalog -->
29
+ <div class="terminal-container flex-1 overflow-y-auto">
30
+ <div class="sessions-container" id="sessions-container">
31
+ <div class="loading-state">
32
+ <div class="loading-spinner"></div>
33
+ <div>Loading sessions...</div>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </div>
39
+
40
+ <!-- Load IRC-style session catalog -->
41
+ <script src="/static/js/index.js?v=20260706-feedlink" type="module"></script>
42
+ {% endblock %}
@@ -0,0 +1,125 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes">
6
+ <meta name="theme-color" content="#080808">
7
+ <meta name="mobile-web-app-capable" content="yes">
8
+ <meta name="apple-mobile-web-app-capable" content="yes">
9
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
10
+ <title>{% block title %}{{ console_display_name() }}{% endblock %}</title>
11
+ <meta name="ws-url" content="{{ ws_url | default('') }}">
12
+ <link rel="preconnect" href="https://fonts.googleapis.com">
13
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
+ <link href="https://fonts.googleapis.com/css2?family=VT323&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
15
+ <!-- Design System CSS - Load in order: variables -> components -> main styles -->
16
+ <link href="/static/css/variables.css?v=20251230" rel="stylesheet">
17
+ <link href="/static/css/components.css?v=20251230" rel="stylesheet">
18
+ <link href="/static/css/style.css?v=20251230" rel="stylesheet">
19
+ <link rel="icon" href="/static/img/favicon.ico">
20
+
21
+ <!-- Load error handler first to catch all errors -->
22
+ <script src="/static/js/error-handler.js" type="module"></script>
23
+
24
+ <!-- Load constants first so they're available to all scripts -->
25
+ <script src="/static/js/constants.js"></script>
26
+
27
+ <!-- Socket.IO setup with reliable fallback -->
28
+ <script>
29
+ // Create a promise that resolves when Socket.IO is loaded
30
+ window.socketIOReady = new Promise((resolve, reject) => {
31
+ // Function to load the local fallback
32
+ function loadLocalSocketIO() {
33
+ console.warn('Using local Socket.IO fallback');
34
+ const fallbackScript = document.createElement('script');
35
+ fallbackScript.src = "/static/js/socket.io.min.js";
36
+ fallbackScript.onload = () => {
37
+ console.log('Local Socket.IO loaded successfully');
38
+ resolve(window.io);
39
+ };
40
+ fallbackScript.onerror = (err) => {
41
+ console.error('Failed to load local Socket.IO:', err);
42
+ reject(new Error('Could not load Socket.IO from any source'));
43
+ };
44
+ document.head.appendChild(fallbackScript);
45
+ }
46
+
47
+ // Only try to load from CDN if window.io is not already defined
48
+ if (!window.io) {
49
+ // Try to load from CDN first
50
+ const cdnScript = document.createElement('script');
51
+ cdnScript.src = "https://cdn.socket.io/4.6.0/socket.io.min.js";
52
+ cdnScript.onload = () => {
53
+ console.log('CDN Socket.IO loaded successfully');
54
+ resolve(window.io);
55
+ };
56
+ cdnScript.onerror = loadLocalSocketIO;
57
+ document.head.appendChild(cdnScript);
58
+ } else {
59
+ // Socket.IO already loaded
60
+ resolve(window.io);
61
+ }
62
+ });
63
+ </script>
64
+
65
+ <!-- Additional styles from child templates -->
66
+ {% block head %}{% endblock %}
67
+ <!-- Add syntax highlighting -->
68
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/atom-one-dark.min.css">
69
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
70
+ </head>
71
+ <body {% block body_attributes %}{% endblock %}>
72
+ <div class="global-header">
73
+ <a href="/" class="terminal-brand">{% block header_title %}{{ console_display_name() }}{% endblock %}</a>
74
+ <div class="terminal-nav">
75
+ <!-- Webgate v1 single-user surfaces (core, both modes) -->
76
+ <a href="/activity" class="nav-link">Activity</a>
77
+ <a href="/memory" class="nav-link">Memory</a>
78
+ <a href="/autonomy" class="nav-link">Autonomy</a>
79
+ <a href="/finance" class="nav-link">Finance</a>
80
+ <a href="/identity" class="nav-link">Identity</a>
81
+ <a href="/system" class="nav-link">System</a>
82
+ <a href="/settings" class="nav-link">Settings</a>
83
+ {# Multitenant-only links hide in single-user. An explicitly-passed
84
+ `is_multitenant` wins; pages that don't pass it fall back to the
85
+ posture SSOT via the `is_multitenant_posture` Jinja global (P0-3 —
86
+ undefined used to mean "shown", leaking Profile/Sign In into
87
+ local/own_ops on the server.py-rendered pages). #}
88
+ {% set _show_tenant = is_multitenant if is_multitenant is defined else is_multitenant_posture() %}
89
+ {% if _show_tenant %}
90
+ <a href="/profile" class="nav-link">Profile</a>
91
+ {% if is_admin %}
92
+ <a href="/admin" class="nav-link nav-link--admin">Admin</a>
93
+ {% endif %}
94
+ {% if is_authenticated %}
95
+ <a href="/logout" class="nav-link ml-auto">Logout</a>
96
+ {% else %}
97
+ <a href="/signin" class="nav-link ml-auto">Sign In</a>
98
+ {% endif %}
99
+ {% endif %}
100
+ </div>
101
+ </div>
102
+
103
+ <div class="container {% block container_class %}{% endblock %}">
104
+ <div class="main-content">
105
+ {% block content %}{% endblock %}
106
+ </div>
107
+ </div>
108
+
109
+ <div class="terminal-footer">
110
+ <div class="footer-content">
111
+ <a href="{{ branding().terms_url }}" class="footer-link" target="_blank" rel="noopener noreferrer">Terms of Use</a>
112
+ <span class="footer-separator">•</span>
113
+ <a href="{{ branding().privacy_url }}" class="footer-link" target="_blank" rel="noopener noreferrer">Privacy Policy</a>
114
+ <span class="footer-separator">•</span>
115
+ <span class="footer-center-text">System ver. {{ get_version() }} (c)</span>
116
+ <span class="footer-separator">•</span>
117
+ <a href="{{ branding().brand_url }}" class="footer-link" target="_blank" rel="noopener noreferrer">{{ branding().brand_display }}</a>
118
+ <span class="footer-separator">•</span>
119
+ <a href="{{ branding().org_url }}" class="footer-link" target="_blank" rel="noopener noreferrer">{{ branding().org_display }}</a>
120
+ </div>
121
+ </div>
122
+
123
+ {% block scripts %}{% endblock %}
124
+ </body>
125
+ </html>
@@ -0,0 +1,59 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block title %}{{ console_display_name() }} - Memory{% endblock %}
4
+ {% block header_title %}{{ console_display_name() }} - Memory{% endblock %}
5
+
6
+ {% block content %}
7
+ <div class="terminal-container webgate-page">
8
+ <div class="webgate-header">
9
+ <h2>Memory</h2>
10
+ <p class="text-muted text-sm">Cross-session recall for the local owner. Search, or leave blank to browse the most recent.</p>
11
+ </div>
12
+ <form id="memory-search" class="webgate-search" onsubmit="return false;">
13
+ <input id="memory-q" type="text" class="form-control" placeholder="Search recall…" autocomplete="off" />
14
+ <button id="memory-go" type="submit" class="btn btn-primary">Search</button>
15
+ </form>
16
+ <div id="memory-results" class="webgate-list">
17
+ <div class="loading">Loading…</div>
18
+ </div>
19
+ </div>
20
+
21
+ <script>
22
+ (function () {
23
+ const q = document.getElementById('memory-q');
24
+ const out = document.getElementById('memory-results');
25
+ async function load() {
26
+ out.innerHTML = '<div class="loading">Loading…</div>';
27
+ try {
28
+ const params = new URLSearchParams({ q: q.value || '', limit: '20' });
29
+ const res = await fetch('/api/webgate/memory?' + params.toString());
30
+ const body = await res.json();
31
+ const items = Array.isArray(body) ? body : (body.items || []);
32
+ const mode = body.mode || (q.value ? 'search' : 'browse');
33
+ if (!items.length) {
34
+ out.innerHTML = '<div class="webgate-empty">' +
35
+ (mode === 'search' ? 'No matches.' : 'No memories yet.') + '</div>';
36
+ return;
37
+ }
38
+ out.innerHTML = '';
39
+ const caption = document.createElement('div');
40
+ caption.className = 'text-muted text-sm webgate-caption';
41
+ caption.textContent = mode === 'search'
42
+ ? items.length + ' match' + (items.length === 1 ? '' : 'es') + ' for “' + q.value + '”'
43
+ : 'showing the ' + items.length + ' most recent memories';
44
+ out.appendChild(caption);
45
+ items.forEach(function (t) {
46
+ const div = document.createElement('div');
47
+ div.className = 'webgate-item';
48
+ div.textContent = t;
49
+ out.appendChild(div);
50
+ });
51
+ } catch (e) {
52
+ out.innerHTML = '<div class="webgate-empty">Could not load memory.</div>';
53
+ }
54
+ }
55
+ document.getElementById('memory-search').addEventListener('submit', load);
56
+ load();
57
+ })();
58
+ </script>
59
+ {% endblock %}
@@ -0,0 +1,15 @@
1
+ {% extends "layout.html" %}
2
+ {% block title %}Owner Login — POLYROB{% endblock %}
3
+ {% block content %}
4
+ <div class="login-page" style="max-width: 40ch; margin: 4rem auto;">
5
+ <h1>Owner Login</h1>
6
+ {% if error %}<p class="error-message">{{ error }}</p>{% endif %}
7
+ <form method="post" action="/owner-login">
8
+ <input type="hidden" name="return_to" value="{{ return_to | default('/') }}">
9
+ {% if csrf_token %}<input type="hidden" name="csrf_token" value="{{ csrf_token }}">{% endif %}
10
+ <label>Username <input type="text" name="username" autofocus required></label>
11
+ <label>Password <input type="password" name="password" required></label>
12
+ <button type="submit">Log in</button>
13
+ </form>
14
+ </div>
15
+ {% endblock %}