monkeybot 2.1.1__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.
Files changed (534) hide show
  1. monkeybot-2.1.1/.dockerignore +17 -0
  2. monkeybot-2.1.1/.github/workflows/ci.yml +47 -0
  3. monkeybot-2.1.1/.github/workflows/live-eval-smoke.yml +158 -0
  4. monkeybot-2.1.1/.github/workflows/prepare-release.yml +36 -0
  5. monkeybot-2.1.1/.github/workflows/publish-release.yml +98 -0
  6. monkeybot-2.1.1/.gitignore +64 -0
  7. monkeybot-2.1.1/.pre-commit-config.yaml +20 -0
  8. monkeybot-2.1.1/AGENTS.md +34 -0
  9. monkeybot-2.1.1/BACKLOG.md +77 -0
  10. monkeybot-2.1.1/CHANGELOG.md +135 -0
  11. monkeybot-2.1.1/LICENSE +21 -0
  12. monkeybot-2.1.1/PKG-INFO +318 -0
  13. monkeybot-2.1.1/README.md +237 -0
  14. monkeybot-2.1.1/cli/pyproject.toml +42 -0
  15. monkeybot-2.1.1/cli/skills/monkeybot/SKILL.md +197 -0
  16. monkeybot-2.1.1/cli/skills/monkeybot/references/config-sections.md +160 -0
  17. monkeybot-2.1.1/cli/src/monkeybot_cli/__init__.py +3 -0
  18. monkeybot-2.1.1/cli/src/monkeybot_cli/chat_renderer.py +87 -0
  19. monkeybot-2.1.1/cli/src/monkeybot_cli/chat_session.py +911 -0
  20. monkeybot-2.1.1/cli/src/monkeybot_cli/chat_status_bar.py +205 -0
  21. monkeybot-2.1.1/cli/src/monkeybot_cli/chat_theme.py +91 -0
  22. monkeybot-2.1.1/cli/src/monkeybot_cli/chat_tool_display.py +334 -0
  23. monkeybot-2.1.1/cli/src/monkeybot_cli/chat_tui.py +1491 -0
  24. monkeybot-2.1.1/cli/src/monkeybot_cli/chat_tui_widgets.py +996 -0
  25. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/__init__.py +1 -0
  26. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/chat.py +817 -0
  27. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/doctor.py +293 -0
  28. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/loop.py +207 -0
  29. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/new.py +207 -0
  30. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/run_cmd.py +41 -0
  31. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/talk.py +102 -0
  32. monkeybot-2.1.1/cli/src/monkeybot_cli/commands/validate.py +385 -0
  33. monkeybot-2.1.1/cli/src/monkeybot_cli/compat.py +7 -0
  34. monkeybot-2.1.1/cli/src/monkeybot_cli/config_resolve.py +55 -0
  35. monkeybot-2.1.1/cli/src/monkeybot_cli/exit_commands.py +13 -0
  36. monkeybot-2.1.1/cli/src/monkeybot_cli/extras_catalog.py +95 -0
  37. monkeybot-2.1.1/cli/src/monkeybot_cli/gateway_health.py +34 -0
  38. monkeybot-2.1.1/cli/src/monkeybot_cli/main.py +38 -0
  39. monkeybot-2.1.1/cli/src/monkeybot_cli/opensandbox_lifecycle.py +314 -0
  40. monkeybot-2.1.1/cli/src/monkeybot_cli/output.py +110 -0
  41. monkeybot-2.1.1/cli/src/monkeybot_cli/providers.py +112 -0
  42. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/__init__.py +13 -0
  43. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/audio_io.py +147 -0
  44. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/client.py +17 -0
  45. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/gateway_manager.py +142 -0
  46. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/push_to_talk.py +128 -0
  47. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/session.py +256 -0
  48. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/session_controller.py +501 -0
  49. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/talk_ui.py +243 -0
  50. monkeybot-2.1.1/cli/src/monkeybot_cli/realtime/wire_encode.py +39 -0
  51. monkeybot-2.1.1/cli/src/monkeybot_cli/runtime_python.py +91 -0
  52. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold.py +287 -0
  53. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/AGENT.md +56 -0
  54. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/__init__.py +1 -0
  55. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/command_allowlist.yaml +57 -0
  56. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/env.example +35 -0
  57. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/mcp.json +49 -0
  58. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/monkeybot.example.yaml +191 -0
  59. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/otel-collector.example.yaml +57 -0
  60. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/permissions.yaml +32 -0
  61. monkeybot-2.1.1/cli/src/monkeybot_cli/scaffold_defaults/setup-workspace.sh +24 -0
  62. monkeybot-2.1.1/cli/src/monkeybot_cli/session_controller.py +7 -0
  63. monkeybot-2.1.1/cli/src/monkeybot_cli/terminal_markdown.py +48 -0
  64. monkeybot-2.1.1/cli/tests/test_chat_e2e.py +86 -0
  65. monkeybot-2.1.1/cli/tests/test_chat_errors.py +218 -0
  66. monkeybot-2.1.1/cli/tests/test_chat_grounding.py +54 -0
  67. monkeybot-2.1.1/cli/tests/test_chat_renderer_parity.py +26 -0
  68. monkeybot-2.1.1/cli/tests/test_chat_session.py +363 -0
  69. monkeybot-2.1.1/cli/tests/test_chat_status_bar.py +149 -0
  70. monkeybot-2.1.1/cli/tests/test_chat_theme.py +71 -0
  71. monkeybot-2.1.1/cli/tests/test_chat_tool_display.py +154 -0
  72. monkeybot-2.1.1/cli/tests/test_chat_tui.py +1243 -0
  73. monkeybot-2.1.1/cli/tests/test_cli.py +132 -0
  74. monkeybot-2.1.1/cli/tests/test_config_resolve.py +21 -0
  75. monkeybot-2.1.1/cli/tests/test_doctor.py +49 -0
  76. monkeybot-2.1.1/cli/tests/test_extras_catalog.py +87 -0
  77. monkeybot-2.1.1/cli/tests/test_opensandbox_lifecycle.py +41 -0
  78. monkeybot-2.1.1/cli/tests/test_realtime_session_controller.py +301 -0
  79. monkeybot-2.1.1/cli/tests/test_run_cmd.py +79 -0
  80. monkeybot-2.1.1/cli/tests/test_runtime_python.py +109 -0
  81. monkeybot-2.1.1/cli/tests/test_scaffold.py +115 -0
  82. monkeybot-2.1.1/cli/tests/test_terminal_markdown.py +47 -0
  83. monkeybot-2.1.1/cli/uv.lock +1612 -0
  84. monkeybot-2.1.1/demo_agent/.env.example +21 -0
  85. monkeybot-2.1.1/demo_agent/.gitignore +9 -0
  86. monkeybot-2.1.1/demo_agent/docker-compose.langfuse.yml +159 -0
  87. monkeybot-2.1.1/demo_agent/docker-compose.observability.yml +31 -0
  88. monkeybot-2.1.1/demo_agent/firebase.json +11 -0
  89. monkeybot-2.1.1/demo_agent/firestore.indexes.json +14 -0
  90. monkeybot-2.1.1/demo_agent/pyproject.toml +17 -0
  91. monkeybot-2.1.1/demo_agent/run.sh +532 -0
  92. monkeybot-2.1.1/demo_agent/uv.lock +2782 -0
  93. monkeybot-2.1.1/demo_agent/workspace/.gitkeep +0 -0
  94. monkeybot-2.1.1/demo_agent/workspace/browser/Screenshots/.gitkeep +0 -0
  95. monkeybot-2.1.1/demo_agent/workspace/skills/browser/SKILL.md +68 -0
  96. monkeybot-2.1.1/demo_agent/workspace/skills/browser/playbooks/.gitkeep +0 -0
  97. monkeybot-2.1.1/demo_agent/workspace/skills/image-generator/SKILL.md +56 -0
  98. monkeybot-2.1.1/demo_agent/workspace/skills/image-generator/generate_image.py +199 -0
  99. monkeybot-2.1.1/docker/Dockerfile +30 -0
  100. monkeybot-2.1.1/docker/Dockerfile.demo-sandbox +8 -0
  101. monkeybot-2.1.1/docker/docker-compose.sandbox.yml +49 -0
  102. monkeybot-2.1.1/docker/opensandbox.docker.toml +46 -0
  103. monkeybot-2.1.1/docker-compose.evals.yml +24 -0
  104. monkeybot-2.1.1/docker-compose.yml +29 -0
  105. monkeybot-2.1.1/docs/browser-mcp.md +160 -0
  106. monkeybot-2.1.1/docs/chat-tui-improvements.md +220 -0
  107. monkeybot-2.1.1/docs/cli-pypi-distribution.md +264 -0
  108. monkeybot-2.1.1/docs/cloud-deployment-design.md +555 -0
  109. monkeybot-2.1.1/docs/deploy-aws-agentcore.md +103 -0
  110. monkeybot-2.1.1/docs/deploy-pattern-a-container.md +361 -0
  111. monkeybot-2.1.1/docs/deploy-pattern-b-serverless.md +332 -0
  112. monkeybot-2.1.1/docs/deploy-pattern-c-agent-platform.md +209 -0
  113. monkeybot-2.1.1/docs/deploy-pattern-d-realtime.md +300 -0
  114. monkeybot-2.1.1/docs/eval-pr-scorecard.md +417 -0
  115. monkeybot-2.1.1/docs/features.md +780 -0
  116. monkeybot-2.1.1/docs/getting-started.md +147 -0
  117. monkeybot-2.1.1/docs/mcp.md +195 -0
  118. monkeybot-2.1.1/docs/monkeycleaner-cli-prettier.md +38 -0
  119. monkeybot-2.1.1/docs/observability-runbook.md +57 -0
  120. monkeybot-2.1.1/docs/otel-collector.example.yaml +57 -0
  121. monkeybot-2.1.1/docs/progressive-mcp-tools.md +263 -0
  122. monkeybot-2.1.1/docs/realtime-streaming-design.md +542 -0
  123. monkeybot-2.1.1/docs/skills.md +50 -0
  124. monkeybot-2.1.1/docs/sse-gateway-ui.md +272 -0
  125. monkeybot-2.1.1/evals/Dockerfile +20 -0
  126. monkeybot-2.1.1/evals/assertions.py +71 -0
  127. monkeybot-2.1.1/evals/eval_config.yaml +5 -0
  128. monkeybot-2.1.1/evals/main.py +259 -0
  129. monkeybot-2.1.1/evals/models.py +125 -0
  130. monkeybot-2.1.1/evals/persistence.py +186 -0
  131. monkeybot-2.1.1/evals/pyproject.toml +32 -0
  132. monkeybot-2.1.1/evals/report.py +328 -0
  133. monkeybot-2.1.1/evals/requirements.txt +9 -0
  134. monkeybot-2.1.1/evals/runner.py +216 -0
  135. monkeybot-2.1.1/evals/scenario_loader.py +98 -0
  136. monkeybot-2.1.1/evals/scenarios/context/summarization_trigger.yaml +32 -0
  137. monkeybot-2.1.1/evals/scenarios/mcp/tool_invoke.yaml +11 -0
  138. monkeybot-2.1.1/evals/scenarios/memory/recall_cross_session.yaml +12 -0
  139. monkeybot-2.1.1/evals/scenarios/memory/recall_single_session.yaml +11 -0
  140. monkeybot-2.1.1/evals/scenarios/multi_turn/task_tracking.yaml +11 -0
  141. monkeybot-2.1.1/evals/scenarios/operator/.gitkeep +0 -0
  142. monkeybot-2.1.1/evals/scenarios/skills/skill_invocation.yaml +10 -0
  143. monkeybot-2.1.1/evals/scenarios/subagents/dispatch_complete.yaml +8 -0
  144. monkeybot-2.1.1/evals/scenarios/tools/core_read.yaml +11 -0
  145. monkeybot-2.1.1/evals/scenarios/tools/core_read_error.yaml +10 -0
  146. monkeybot-2.1.1/evals/scorer.py +342 -0
  147. monkeybot-2.1.1/evals/store.py +60 -0
  148. monkeybot-2.1.1/evals/suites/smoke.yaml +12 -0
  149. monkeybot-2.1.1/evals/test_assertions.py +98 -0
  150. monkeybot-2.1.1/evals/test_judge.py +79 -0
  151. monkeybot-2.1.1/evals/test_report.py +122 -0
  152. monkeybot-2.1.1/evals/test_runner_sse.py +142 -0
  153. monkeybot-2.1.1/evals/uv.lock +2153 -0
  154. monkeybot-2.1.1/evals/ws_manager.py +46 -0
  155. monkeybot-2.1.1/examples/README.md +63 -0
  156. monkeybot-2.1.1/examples/agentcore/handler.py +112 -0
  157. monkeybot-2.1.1/examples/agentcore/runtime_app.py +103 -0
  158. monkeybot-2.1.1/examples/agentengine/handler.py +77 -0
  159. monkeybot-2.1.1/examples/cloud-functions/main.py +76 -0
  160. monkeybot-2.1.1/examples/lambda/handler.py +79 -0
  161. monkeybot-2.1.1/examples/skills/browser/SKILL.md +14 -0
  162. monkeybot-2.1.1/examples/skills/diagnostics/README.md +264 -0
  163. monkeybot-2.1.1/examples/skills/diagnostics/SKILL.md +36 -0
  164. monkeybot-2.1.1/examples/skills/diagnostics/__init__.py +1 -0
  165. monkeybot-2.1.1/examples/skills/diagnostics/diagnostics.py +130 -0
  166. monkeybot-2.1.1/examples/skills/image-generator/SKILL.md +10 -0
  167. monkeybot-2.1.1/examples/skills/image-generator/generate_image.py +199 -0
  168. monkeybot-2.1.1/integrations/browser-mcp/pyproject.toml +22 -0
  169. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/__init__.py +3 -0
  170. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/assets/NOTICE.md +32 -0
  171. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/assets/dom_tree.js +1749 -0
  172. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/assets/pa_driver.js +209 -0
  173. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/dom_indexing.py +123 -0
  174. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/playbooks.py +89 -0
  175. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/screenshots.py +63 -0
  176. monkeybot-2.1.1/integrations/browser-mcp/src/browser_mcp/server.py +351 -0
  177. monkeybot-2.1.1/integrations/browser-mcp/tests/test_dom_indexing.py +147 -0
  178. monkeybot-2.1.1/integrations/browser-mcp/tests/test_indexed_tools.py +117 -0
  179. monkeybot-2.1.1/integrations/browser-mcp/tests/test_playbooks.py +103 -0
  180. monkeybot-2.1.1/integrations/browser-mcp/tests/test_screenshots.py +51 -0
  181. monkeybot-2.1.1/integrations/browser-mcp/tests/test_server_shutdown.py +104 -0
  182. monkeybot-2.1.1/integrations/browser-mcp/uv.lock +936 -0
  183. monkeybot-2.1.1/logo.png +0 -0
  184. monkeybot-2.1.1/monkeybot_config_example/AGENT.example.md +56 -0
  185. monkeybot-2.1.1/monkeybot_config_example/command_allowlist.example.yaml +61 -0
  186. monkeybot-2.1.1/monkeybot_config_example/mcp.example.json +49 -0
  187. monkeybot-2.1.1/monkeybot_config_example/monkeybot.example.yaml +209 -0
  188. monkeybot-2.1.1/monkeybot_config_example/opensandbox.docker.example.toml +51 -0
  189. monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo-dual.example.yaml +46 -0
  190. monkeybot-2.1.1/monkeybot_config_example/otel-collector.demo.example.yaml +35 -0
  191. monkeybot-2.1.1/monkeybot_config_example/permissions.example.yaml +32 -0
  192. monkeybot-2.1.1/pyproject.toml +124 -0
  193. monkeybot-2.1.1/pytest.ini +16 -0
  194. monkeybot-2.1.1/scripts/create_schema.py +82 -0
  195. monkeybot-2.1.1/scripts/precommit-pytest.sh +22 -0
  196. monkeybot-2.1.1/scripts/release.py +165 -0
  197. monkeybot-2.1.1/scripts/smoke_global_cli.sh +91 -0
  198. monkeybot-2.1.1/scripts/verify_memory.py +27 -0
  199. monkeybot-2.1.1/src/monkeybot/__init__.py +3 -0
  200. monkeybot-2.1.1/src/monkeybot/cli/__init__.py +3 -0
  201. monkeybot-2.1.1/src/monkeybot/cli/__main__.py +8 -0
  202. monkeybot-2.1.1/src/monkeybot/cli/audio_io.py +8 -0
  203. monkeybot-2.1.1/src/monkeybot/cli/gateway_manager.py +17 -0
  204. monkeybot-2.1.1/src/monkeybot/cli/main.py +22 -0
  205. monkeybot-2.1.1/src/monkeybot/cli/push_to_talk.py +12 -0
  206. monkeybot-2.1.1/src/monkeybot/cli/realtime_client.py +13 -0
  207. monkeybot-2.1.1/src/monkeybot/core/__init__.py +19 -0
  208. monkeybot-2.1.1/src/monkeybot/core/attachments/__init__.py +22 -0
  209. monkeybot-2.1.1/src/monkeybot/core/attachments/catalog.py +62 -0
  210. monkeybot-2.1.1/src/monkeybot/core/attachments/config.py +52 -0
  211. monkeybot-2.1.1/src/monkeybot/core/attachments/freeze.py +158 -0
  212. monkeybot-2.1.1/src/monkeybot/core/attachments/resolve.py +70 -0
  213. monkeybot-2.1.1/src/monkeybot/core/attachments/store.py +180 -0
  214. monkeybot-2.1.1/src/monkeybot/core/attachments/text.py +72 -0
  215. monkeybot-2.1.1/src/monkeybot/core/attachments/tools.py +54 -0
  216. monkeybot-2.1.1/src/monkeybot/core/bootstrap.py +242 -0
  217. monkeybot-2.1.1/src/monkeybot/core/config/__init__.py +71 -0
  218. monkeybot-2.1.1/src/monkeybot/core/config/realtime_config.py +150 -0
  219. monkeybot-2.1.1/src/monkeybot/core/config/runtime_env.py +262 -0
  220. monkeybot-2.1.1/src/monkeybot/core/config/settings.py +341 -0
  221. monkeybot-2.1.1/src/monkeybot/core/config/validation.py +249 -0
  222. monkeybot-2.1.1/src/monkeybot/core/config/yaml_loader.py +45 -0
  223. monkeybot-2.1.1/src/monkeybot/core/context/__init__.py +781 -0
  224. monkeybot-2.1.1/src/monkeybot/core/context/campaign_context.py +8 -0
  225. monkeybot-2.1.1/src/monkeybot/core/context/common.py +14 -0
  226. monkeybot-2.1.1/src/monkeybot/core/context/curator.py +255 -0
  227. monkeybot-2.1.1/src/monkeybot/core/context/epoch.py +226 -0
  228. monkeybot-2.1.1/src/monkeybot/core/context/memory_prompt.py +222 -0
  229. monkeybot-2.1.1/src/monkeybot/core/context/tool_output_policy.py +270 -0
  230. monkeybot-2.1.1/src/monkeybot/core/context/tool_result_ingress.py +290 -0
  231. monkeybot-2.1.1/src/monkeybot/core/context/tool_shapers.py +361 -0
  232. monkeybot-2.1.1/src/monkeybot/core/hooks/__init__.py +261 -0
  233. monkeybot-2.1.1/src/monkeybot/core/llm/__init__.py +4 -0
  234. monkeybot-2.1.1/src/monkeybot/core/llm/provider.py +296 -0
  235. monkeybot-2.1.1/src/monkeybot/core/llm/realtime_provider.py +203 -0
  236. monkeybot-2.1.1/src/monkeybot/core/llm/usage.py +57 -0
  237. monkeybot-2.1.1/src/monkeybot/core/logging_utils.py +24 -0
  238. monkeybot-2.1.1/src/monkeybot/core/mcp/__init__.py +1 -0
  239. monkeybot-2.1.1/src/monkeybot/core/mcp/mcp_client.py +1215 -0
  240. monkeybot-2.1.1/src/monkeybot/core/mcp/ports_mcp.py +109 -0
  241. monkeybot-2.1.1/src/monkeybot/core/memory/__init__.py +24 -0
  242. monkeybot-2.1.1/src/monkeybot/core/memory/hook.py +413 -0
  243. monkeybot-2.1.1/src/monkeybot/core/memory/index_format.py +104 -0
  244. monkeybot-2.1.1/src/monkeybot/core/memory/integrity.py +180 -0
  245. monkeybot-2.1.1/src/monkeybot/core/memory/organizer.py +270 -0
  246. monkeybot-2.1.1/src/monkeybot/core/memory/storage_ops.py +139 -0
  247. monkeybot-2.1.1/src/monkeybot/core/memory/subsystem.py +91 -0
  248. monkeybot-2.1.1/src/monkeybot/core/messages/__init__.py +16 -0
  249. monkeybot-2.1.1/src/monkeybot/core/messages/convert_provider.py +41 -0
  250. monkeybot-2.1.1/src/monkeybot/core/messages/tool_integrity.py +262 -0
  251. monkeybot-2.1.1/src/monkeybot/core/messages/transform_context.py +84 -0
  252. monkeybot-2.1.1/src/monkeybot/core/path_safety.py +11 -0
  253. monkeybot-2.1.1/src/monkeybot/core/persistence/__init__.py +17 -0
  254. monkeybot-2.1.1/src/monkeybot/core/persistence/backends.py +236 -0
  255. monkeybot-2.1.1/src/monkeybot/core/persistence/db.py +28 -0
  256. monkeybot-2.1.1/src/monkeybot/core/persistence/durable_runs.py +286 -0
  257. monkeybot-2.1.1/src/monkeybot/core/persistence/firestore.py +658 -0
  258. monkeybot-2.1.1/src/monkeybot/core/persistence/firestore_scheduled_loops.py +336 -0
  259. monkeybot-2.1.1/src/monkeybot/core/persistence/history.py +156 -0
  260. monkeybot-2.1.1/src/monkeybot/core/persistence/postgres.py +895 -0
  261. monkeybot-2.1.1/src/monkeybot/core/persistence/runs.py +76 -0
  262. monkeybot-2.1.1/src/monkeybot/core/persistence/scheduled_loops.py +435 -0
  263. monkeybot-2.1.1/src/monkeybot/core/persistence/session_turn_locks.py +94 -0
  264. monkeybot-2.1.1/src/monkeybot/core/persistence/sqlite.py +218 -0
  265. monkeybot-2.1.1/src/monkeybot/core/persistence/sqlite_backend.py +74 -0
  266. monkeybot-2.1.1/src/monkeybot/core/persistence/thread_summary.py +61 -0
  267. monkeybot-2.1.1/src/monkeybot/core/persistence/transcript.py +194 -0
  268. monkeybot-2.1.1/src/monkeybot/core/persistence/usage.py +149 -0
  269. monkeybot-2.1.1/src/monkeybot/core/prompts/__init__.py +1 -0
  270. monkeybot-2.1.1/src/monkeybot/core/prompts/harness_prompt.py +197 -0
  271. monkeybot-2.1.1/src/monkeybot/core/prompts/prompt.py +215 -0
  272. monkeybot-2.1.1/src/monkeybot/core/runtime/__init__.py +1 -0
  273. monkeybot-2.1.1/src/monkeybot/core/runtime/context_budget.py +267 -0
  274. monkeybot-2.1.1/src/monkeybot/core/runtime/events.py +819 -0
  275. monkeybot-2.1.1/src/monkeybot/core/runtime/input_admission.py +154 -0
  276. monkeybot-2.1.1/src/monkeybot/core/runtime/loop.py +2374 -0
  277. monkeybot-2.1.1/src/monkeybot/core/runtime/provider_stream_mapper.py +159 -0
  278. monkeybot-2.1.1/src/monkeybot/core/runtime/realtime_loop.py +654 -0
  279. monkeybot-2.1.1/src/monkeybot/core/runtime/utterance_buffer.py +179 -0
  280. monkeybot-2.1.1/src/monkeybot/core/subagents/__init__.py +1 -0
  281. monkeybot-2.1.1/src/monkeybot/core/subagents/subagent_proto.py +331 -0
  282. monkeybot-2.1.1/src/monkeybot/core/subagents/subagent_worker.py +441 -0
  283. monkeybot-2.1.1/src/monkeybot/core/subagents/worker_pool.py +403 -0
  284. monkeybot-2.1.1/src/monkeybot/core/testing/__init__.py +1 -0
  285. monkeybot-2.1.1/src/monkeybot/core/testing/mocks_provider.py +86 -0
  286. monkeybot-2.1.1/src/monkeybot/core/testing/mocks_realtime_provider.py +137 -0
  287. monkeybot-2.1.1/src/monkeybot/core/tools/__init__.py +1 -0
  288. monkeybot-2.1.1/src/monkeybot/core/tools/core_tool_executor.py +1548 -0
  289. monkeybot-2.1.1/src/monkeybot/core/tools/inspector.py +226 -0
  290. monkeybot-2.1.1/src/monkeybot/core/tools/loop_inspector.py +45 -0
  291. monkeybot-2.1.1/src/monkeybot/core/tools/patch.py +480 -0
  292. monkeybot-2.1.1/src/monkeybot/core/tools/permission.py +284 -0
  293. monkeybot-2.1.1/src/monkeybot/core/tools/sandbox_executor.py +255 -0
  294. monkeybot-2.1.1/src/monkeybot/core/tools/spill_inventory.py +35 -0
  295. monkeybot-2.1.1/src/monkeybot/core/tools/terminal.py +381 -0
  296. monkeybot-2.1.1/src/monkeybot/core/tools/text_normalize.py +25 -0
  297. monkeybot-2.1.1/src/monkeybot/core/tools/types.py +33 -0
  298. monkeybot-2.1.1/src/monkeybot/core/tools/workspace_service.py +710 -0
  299. monkeybot-2.1.1/src/monkeybot/core/tools/workspace_tools.py +116 -0
  300. monkeybot-2.1.1/src/monkeybot/core/types/__init__.py +1 -0
  301. monkeybot-2.1.1/src/monkeybot/core/types/content_blocks.py +644 -0
  302. monkeybot-2.1.1/src/monkeybot/core/types/interfaces.py +156 -0
  303. monkeybot-2.1.1/src/monkeybot/core/types/types_tools.py +29 -0
  304. monkeybot-2.1.1/src/monkeybot/core/workspace/__init__.py +8 -0
  305. monkeybot-2.1.1/src/monkeybot/core/workspace/factory.py +45 -0
  306. monkeybot-2.1.1/src/monkeybot/core/workspace/gcs.py +130 -0
  307. monkeybot-2.1.1/src/monkeybot/core/workspace/local.py +162 -0
  308. monkeybot-2.1.1/src/monkeybot/core/workspace/protocol.py +45 -0
  309. monkeybot-2.1.1/src/monkeybot/core/workspace/s3.py +151 -0
  310. monkeybot-2.1.1/src/monkeybot/core/workspace_layout.py +27 -0
  311. monkeybot-2.1.1/src/monkeybot/gateway/__init__.py +1 -0
  312. monkeybot-2.1.1/src/monkeybot/gateway/bootstrap.py +18 -0
  313. monkeybot-2.1.1/src/monkeybot/gateway/main.py +47 -0
  314. monkeybot-2.1.1/src/monkeybot/gateway/realtime/__init__.py +31 -0
  315. monkeybot-2.1.1/src/monkeybot/gateway/realtime/app.py +321 -0
  316. monkeybot-2.1.1/src/monkeybot/gateway/realtime/deps.py +52 -0
  317. monkeybot-2.1.1/src/monkeybot/gateway/realtime/errors.py +81 -0
  318. monkeybot-2.1.1/src/monkeybot/gateway/realtime/guardrails.py +88 -0
  319. monkeybot-2.1.1/src/monkeybot/gateway/realtime/manager.py +77 -0
  320. monkeybot-2.1.1/src/monkeybot/gateway/realtime/metrics.py +144 -0
  321. monkeybot-2.1.1/src/monkeybot/gateway/realtime/routes.py +864 -0
  322. monkeybot-2.1.1/src/monkeybot/gateway/realtime/session.py +232 -0
  323. monkeybot-2.1.1/src/monkeybot/gateway/realtime/wire.py +412 -0
  324. monkeybot-2.1.1/src/monkeybot/gateway/realtime_main.py +49 -0
  325. monkeybot-2.1.1/src/monkeybot/gateway/sse/__init__.py +1 -0
  326. monkeybot-2.1.1/src/monkeybot/gateway/sse/app.py +733 -0
  327. monkeybot-2.1.1/src/monkeybot/gateway/sse/loop_port.py +31 -0
  328. monkeybot-2.1.1/src/monkeybot/gateway/sse/models.py +177 -0
  329. monkeybot-2.1.1/src/monkeybot/gateway/sse/reply_body.py +91 -0
  330. monkeybot-2.1.1/src/monkeybot/gateway/sse/routes.py +1101 -0
  331. monkeybot-2.1.1/src/monkeybot/gateway/sse/scheduler_routes.py +200 -0
  332. monkeybot-2.1.1/src/monkeybot/gateway/sse/scheduler_wiring.py +96 -0
  333. monkeybot-2.1.1/src/monkeybot/gateway/sse/session_bus.py +226 -0
  334. monkeybot-2.1.1/src/monkeybot/gateway/sse/sse.py +46 -0
  335. monkeybot-2.1.1/src/monkeybot/gateway/sse/workspace_layout.py +7 -0
  336. monkeybot-2.1.1/src/monkeybot/observability/__init__.py +220 -0
  337. monkeybot-2.1.1/src/monkeybot/observability/_state.py +10 -0
  338. monkeybot-2.1.1/src/monkeybot/observability/instrumentation.py +153 -0
  339. monkeybot-2.1.1/src/monkeybot/observability/propagation.py +65 -0
  340. monkeybot-2.1.1/src/monkeybot/observability/spans.py +455 -0
  341. monkeybot-2.1.1/src/monkeybot/providers/__init__.py +19 -0
  342. monkeybot-2.1.1/src/monkeybot/providers/_openai_compat.py +450 -0
  343. monkeybot-2.1.1/src/monkeybot/providers/_utils.py +473 -0
  344. monkeybot-2.1.1/src/monkeybot/providers/bedrock.py +145 -0
  345. monkeybot-2.1.1/src/monkeybot/providers/claude.py +125 -0
  346. monkeybot-2.1.1/src/monkeybot/providers/gemini.py +677 -0
  347. monkeybot-2.1.1/src/monkeybot/providers/gemini_live.py +398 -0
  348. monkeybot-2.1.1/src/monkeybot/providers/huggingface.py +129 -0
  349. monkeybot-2.1.1/src/monkeybot/providers/nvidia.py +104 -0
  350. monkeybot-2.1.1/src/monkeybot/providers/ollama.py +152 -0
  351. monkeybot-2.1.1/src/monkeybot/providers/openai.py +127 -0
  352. monkeybot-2.1.1/src/monkeybot/providers/pricing.py +60 -0
  353. monkeybot-2.1.1/src/monkeybot/providers/sampling.py +44 -0
  354. monkeybot-2.1.1/src/monkeybot/providers/vertex_claude.py +148 -0
  355. monkeybot-2.1.1/src/monkeybot/scaffold/__init__.py +33 -0
  356. monkeybot-2.1.1/src/monkeybot/scheduler/__init__.py +13 -0
  357. monkeybot-2.1.1/src/monkeybot/scheduler/__main__.py +4 -0
  358. monkeybot-2.1.1/src/monkeybot/scheduler/engine.py +333 -0
  359. monkeybot-2.1.1/src/monkeybot/scheduler/http_invoker.py +61 -0
  360. monkeybot-2.1.1/src/monkeybot/scheduler/interval.py +77 -0
  361. monkeybot-2.1.1/src/monkeybot/scheduler/tick_result.py +34 -0
  362. monkeybot-2.1.1/src/monkeybot/scheduler/worker.py +87 -0
  363. monkeybot-2.1.1/src/monkeybot/subagents/__init__.py +1 -0
  364. monkeybot-2.1.1/src/monkeybot/subagents/worker/__init__.py +1 -0
  365. monkeybot-2.1.1/src/monkeybot/subagents/worker/__main__.py +22 -0
  366. monkeybot-2.1.1/src/monkeybot/web_search/__init__.py +82 -0
  367. monkeybot-2.1.1/src/monkeybot/web_search/backends/__init__.py +5 -0
  368. monkeybot-2.1.1/src/monkeybot/web_search/backends/duckduckgo.py +32 -0
  369. monkeybot-2.1.1/src/monkeybot/web_search/backends/firecrawl.py +43 -0
  370. monkeybot-2.1.1/src/monkeybot/web_search/backends/tavily.py +45 -0
  371. monkeybot-2.1.1/src/monkeybot/web_search/protocol.py +25 -0
  372. monkeybot-2.1.1/src/monkeybot/web_search/tool.py +56 -0
  373. monkeybot-2.1.1/testing/BENCH_NOTES.md +226 -0
  374. monkeybot-2.1.1/testing/bench.py +560 -0
  375. monkeybot-2.1.1/testing/bots/devbot/AGENT.md +27 -0
  376. monkeybot-2.1.1/testing/bots/devbot/MEMORY.md +12 -0
  377. monkeybot-2.1.1/testing/bots/devbot/config.yaml +17 -0
  378. monkeybot-2.1.1/testing/bots/devbot/skills/file-ops/SKILL.md +24 -0
  379. monkeybot-2.1.1/testing/bots/devbot/webhook.py +20 -0
  380. monkeybot-2.1.1/tests/__init__.py +1 -0
  381. monkeybot-2.1.1/tests/acceptance/test_observability_acceptance.py +240 -0
  382. monkeybot-2.1.1/tests/cli/__init__.py +0 -0
  383. monkeybot-2.1.1/tests/cli/test_gateway_manager.py +48 -0
  384. monkeybot-2.1.1/tests/cli/test_main.py +45 -0
  385. monkeybot-2.1.1/tests/cli/test_push_to_talk.py +61 -0
  386. monkeybot-2.1.1/tests/cli/test_realtime_client.py +47 -0
  387. monkeybot-2.1.1/tests/conftest.py +11 -0
  388. monkeybot-2.1.1/tests/core/__init__.py +1 -0
  389. monkeybot-2.1.1/tests/core/memory/fake_workspace_storage.py +57 -0
  390. monkeybot-2.1.1/tests/core/memory/test_hook_with_storage.py +76 -0
  391. monkeybot-2.1.1/tests/core/memory/test_index_format.py +38 -0
  392. monkeybot-2.1.1/tests/core/memory/test_organizer_with_storage.py +88 -0
  393. monkeybot-2.1.1/tests/core/memory/test_subsystem.py +153 -0
  394. monkeybot-2.1.1/tests/core/test_attachment_freeze.py +124 -0
  395. monkeybot-2.1.1/tests/core/test_bootstrap.py +289 -0
  396. monkeybot-2.1.1/tests/core/test_config_extensions.py +417 -0
  397. monkeybot-2.1.1/tests/core/test_content_blocks.py +182 -0
  398. monkeybot-2.1.1/tests/core/test_context.py +541 -0
  399. monkeybot-2.1.1/tests/core/test_context_budget.py +177 -0
  400. monkeybot-2.1.1/tests/core/test_context_curator.py +105 -0
  401. monkeybot-2.1.1/tests/core/test_context_epoch.py +220 -0
  402. monkeybot-2.1.1/tests/core/test_core_tool_executor.py +1861 -0
  403. monkeybot-2.1.1/tests/core/test_doom_loop.py +506 -0
  404. monkeybot-2.1.1/tests/core/test_durable_events.py +69 -0
  405. monkeybot-2.1.1/tests/core/test_durable_runs.py +190 -0
  406. monkeybot-2.1.1/tests/core/test_events.py +314 -0
  407. monkeybot-2.1.1/tests/core/test_firestore_history.py +98 -0
  408. monkeybot-2.1.1/tests/core/test_firestore_scheduled_loops.py +34 -0
  409. monkeybot-2.1.1/tests/core/test_gemini_history_replay.py +217 -0
  410. monkeybot-2.1.1/tests/core/test_harness_prompt.py +152 -0
  411. monkeybot-2.1.1/tests/core/test_history.py +346 -0
  412. monkeybot-2.1.1/tests/core/test_hooks.py +220 -0
  413. monkeybot-2.1.1/tests/core/test_input_admission.py +387 -0
  414. monkeybot-2.1.1/tests/core/test_inspector.py +225 -0
  415. monkeybot-2.1.1/tests/core/test_logging_utils.py +32 -0
  416. monkeybot-2.1.1/tests/core/test_loop.py +2450 -0
  417. monkeybot-2.1.1/tests/core/test_loop_hooks.py +582 -0
  418. monkeybot-2.1.1/tests/core/test_loop_observability.py +195 -0
  419. monkeybot-2.1.1/tests/core/test_loop_transcript.py +240 -0
  420. monkeybot-2.1.1/tests/core/test_mcp_client.py +896 -0
  421. monkeybot-2.1.1/tests/core/test_memory.py +202 -0
  422. monkeybot-2.1.1/tests/core/test_memory_hook.py +473 -0
  423. monkeybot-2.1.1/tests/core/test_memory_organizer.py +226 -0
  424. monkeybot-2.1.1/tests/core/test_memory_prompt.py +234 -0
  425. monkeybot-2.1.1/tests/core/test_message_pipeline.py +100 -0
  426. monkeybot-2.1.1/tests/core/test_mocks_realtime_provider.py +85 -0
  427. monkeybot-2.1.1/tests/core/test_patch.py +228 -0
  428. monkeybot-2.1.1/tests/core/test_permission.py +168 -0
  429. monkeybot-2.1.1/tests/core/test_prompt.py +314 -0
  430. monkeybot-2.1.1/tests/core/test_provider_contract.py +253 -0
  431. monkeybot-2.1.1/tests/core/test_provider_stream_mapper.py +90 -0
  432. monkeybot-2.1.1/tests/core/test_realtime_loop.py +444 -0
  433. monkeybot-2.1.1/tests/core/test_replace_fuzzy.py +83 -0
  434. monkeybot-2.1.1/tests/core/test_run_command_parse.py +59 -0
  435. monkeybot-2.1.1/tests/core/test_runs.py +113 -0
  436. monkeybot-2.1.1/tests/core/test_runtime_env.py +280 -0
  437. monkeybot-2.1.1/tests/core/test_sandbox_executor.py +644 -0
  438. monkeybot-2.1.1/tests/core/test_scheduled_loops.py +116 -0
  439. monkeybot-2.1.1/tests/core/test_session_turn_locks.py +36 -0
  440. monkeybot-2.1.1/tests/core/test_settlement.py +104 -0
  441. monkeybot-2.1.1/tests/core/test_spill_inventory.py +28 -0
  442. monkeybot-2.1.1/tests/core/test_storage_backends.py +632 -0
  443. monkeybot-2.1.1/tests/core/test_subagent_proto.py +368 -0
  444. monkeybot-2.1.1/tests/core/test_subagent_trace_propagation.py +577 -0
  445. monkeybot-2.1.1/tests/core/test_subagent_worker_paths.py +245 -0
  446. monkeybot-2.1.1/tests/core/test_terminal.py +491 -0
  447. monkeybot-2.1.1/tests/core/test_tool_integrity.py +195 -0
  448. monkeybot-2.1.1/tests/core/test_tool_result_ingress.py +155 -0
  449. monkeybot-2.1.1/tests/core/test_tool_shapers.py +154 -0
  450. monkeybot-2.1.1/tests/core/test_transcript.py +209 -0
  451. monkeybot-2.1.1/tests/core/test_truncated_tool_batch.py +175 -0
  452. monkeybot-2.1.1/tests/core/test_usage.py +223 -0
  453. monkeybot-2.1.1/tests/core/test_usage_migration.py +115 -0
  454. monkeybot-2.1.1/tests/core/test_utterance_buffer.py +131 -0
  455. monkeybot-2.1.1/tests/core/test_worker_pool.py +395 -0
  456. monkeybot-2.1.1/tests/core/test_workspace_layout.py +62 -0
  457. monkeybot-2.1.1/tests/core/test_workspace_symlinks.py +50 -0
  458. monkeybot-2.1.1/tests/core/test_workspace_write_scope.py +97 -0
  459. monkeybot-2.1.1/tests/core/workspace/test_factory.py +51 -0
  460. monkeybot-2.1.1/tests/core/workspace/test_local_storage.py +97 -0
  461. monkeybot-2.1.1/tests/core/workspace/test_protocol_contract.py +45 -0
  462. monkeybot-2.1.1/tests/evals/__init__.py +1 -0
  463. monkeybot-2.1.1/tests/evals/conftest.py +97 -0
  464. monkeybot-2.1.1/tests/evals/eval_hook.py +43 -0
  465. monkeybot-2.1.1/tests/evals/scenario_runner.py +169 -0
  466. monkeybot-2.1.1/tests/evals/scenarios/context_curation.yaml +14 -0
  467. monkeybot-2.1.1/tests/evals/scenarios/memory_write_inject.yaml +12 -0
  468. monkeybot-2.1.1/tests/evals/scenarios/subagent_roundtrip.yaml +17 -0
  469. monkeybot-2.1.1/tests/evals/scenarios/tool_read.yaml +17 -0
  470. monkeybot-2.1.1/tests/evals/scenarios/tool_search_memory.yaml +17 -0
  471. monkeybot-2.1.1/tests/evals/scenarios/turn_completion.yaml +10 -0
  472. monkeybot-2.1.1/tests/evals/test_agent_behavior.py +39 -0
  473. monkeybot-2.1.1/tests/evals/test_memory_integrity.py +60 -0
  474. monkeybot-2.1.1/tests/gateway/__init__.py +1 -0
  475. monkeybot-2.1.1/tests/gateway/realtime/__init__.py +0 -0
  476. monkeybot-2.1.1/tests/gateway/realtime/test_app.py +29 -0
  477. monkeybot-2.1.1/tests/gateway/realtime/test_deps.py +15 -0
  478. monkeybot-2.1.1/tests/gateway/realtime/test_guardrails.py +83 -0
  479. monkeybot-2.1.1/tests/gateway/realtime/test_manager.py +90 -0
  480. monkeybot-2.1.1/tests/gateway/realtime/test_metrics.py +92 -0
  481. monkeybot-2.1.1/tests/gateway/realtime/test_routes_client_text.py +199 -0
  482. monkeybot-2.1.1/tests/gateway/realtime/test_session.py +211 -0
  483. monkeybot-2.1.1/tests/gateway/realtime/test_wire.py +272 -0
  484. monkeybot-2.1.1/tests/gateway/sse/test_attachments.py +177 -0
  485. monkeybot-2.1.1/tests/gateway/sse/test_create_session_model.py +284 -0
  486. monkeybot-2.1.1/tests/gateway/sse/test_routes.py +460 -0
  487. monkeybot-2.1.1/tests/gateway/sse/test_scheduler_routes.py +120 -0
  488. monkeybot-2.1.1/tests/gateway/sse/test_session_bus.py +111 -0
  489. monkeybot-2.1.1/tests/gateway/sse/test_transcript_wiring.py +150 -0
  490. monkeybot-2.1.1/tests/gateway/test_otel_fastapi.py +87 -0
  491. monkeybot-2.1.1/tests/gateway/test_otel_lifespan.py +49 -0
  492. monkeybot-2.1.1/tests/gateway/test_pending_response_endpoints.py +249 -0
  493. monkeybot-2.1.1/tests/gateway/test_realtime_main.py +15 -0
  494. monkeybot-2.1.1/tests/gateway/test_resolve_provider.py +69 -0
  495. monkeybot-2.1.1/tests/gateway/test_sse_events.py +101 -0
  496. monkeybot-2.1.1/tests/integration/__init__.py +1 -0
  497. monkeybot-2.1.1/tests/integration/test_mb_e2e_simple_reply.py +112 -0
  498. monkeybot-2.1.1/tests/integration/test_observability_integration.py +382 -0
  499. monkeybot-2.1.1/tests/integration/test_prompt_caching_integration.py +139 -0
  500. monkeybot-2.1.1/tests/observability/conftest.py +43 -0
  501. monkeybot-2.1.1/tests/observability/test_init.py +115 -0
  502. monkeybot-2.1.1/tests/observability/test_instrumentation.py +131 -0
  503. monkeybot-2.1.1/tests/observability/test_loop_hook_spans.py +74 -0
  504. monkeybot-2.1.1/tests/observability/test_propagation.py +89 -0
  505. monkeybot-2.1.1/tests/observability/test_span_contract.py +240 -0
  506. monkeybot-2.1.1/tests/observability/test_spans.py +186 -0
  507. monkeybot-2.1.1/tests/observability/test_truncate.py +27 -0
  508. monkeybot-2.1.1/tests/observability/test_turn_complete_trace.py +57 -0
  509. monkeybot-2.1.1/tests/providers/conftest.py +78 -0
  510. monkeybot-2.1.1/tests/providers/test_anthropic_cache.py +489 -0
  511. monkeybot-2.1.1/tests/providers/test_anthropic_history.py +118 -0
  512. monkeybot-2.1.1/tests/providers/test_bedrock_estimate.py +14 -0
  513. monkeybot-2.1.1/tests/providers/test_gemini_live.py +272 -0
  514. monkeybot-2.1.1/tests/providers/test_gemini_usage.py +253 -0
  515. monkeybot-2.1.1/tests/providers/test_huggingface.py +61 -0
  516. monkeybot-2.1.1/tests/providers/test_nvidia.py +27 -0
  517. monkeybot-2.1.1/tests/providers/test_ollama.py +101 -0
  518. monkeybot-2.1.1/tests/providers/test_openai_compat_usage.py +290 -0
  519. monkeybot-2.1.1/tests/providers/test_openai_history.py +135 -0
  520. monkeybot-2.1.1/tests/providers/test_pricing.py +56 -0
  521. monkeybot-2.1.1/tests/providers/test_safe_parse_tool_args.py +61 -0
  522. monkeybot-2.1.1/tests/providers/test_sampling.py +136 -0
  523. monkeybot-2.1.1/tests/providers/test_source_grep_gates.py +66 -0
  524. monkeybot-2.1.1/tests/providers/test_vertex_claude_history.py +37 -0
  525. monkeybot-2.1.1/tests/scheduler/test_engine.py +162 -0
  526. monkeybot-2.1.1/tests/scheduler/test_interval.py +29 -0
  527. monkeybot-2.1.1/tests/skills/__init__.py +1 -0
  528. monkeybot-2.1.1/tests/skills/test_generate_image_script.py +208 -0
  529. monkeybot-2.1.1/tests/test_cold_start.py +74 -0
  530. monkeybot-2.1.1/tests/test_packaging_config.py +68 -0
  531. monkeybot-2.1.1/tests/test_release_script.py +41 -0
  532. monkeybot-2.1.1/tests/web_search/__init__.py +0 -0
  533. monkeybot-2.1.1/tests/web_search/test_web_search.py +305 -0
  534. monkeybot-2.1.1/uv.lock +4381 -0
@@ -0,0 +1,17 @@
1
+ .git
2
+ .github
3
+ **/.venv
4
+ **/node_modules
5
+ **/__pycache__
6
+ **/*.py[cod]
7
+ **/.pytest_cache
8
+ **/.mypy_cache
9
+ **/.ruff_cache
10
+ demo_agent/.emonk
11
+ demo_agent/workspace/data/*.db
12
+ demo_agent/workspace/data/*.db-*
13
+ **/.env
14
+ **/*.db-shm
15
+ **/*.db-wal
16
+ legacy
17
+ tests
@@ -0,0 +1,47 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master, develop]
6
+ pull_request:
7
+
8
+ jobs:
9
+ python:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Install ripgrep and GitHub CLI
15
+ run: sudo apt-get update && sudo apt-get install -y ripgrep gh
16
+
17
+ - uses: astral-sh/setup-uv@v5
18
+ with:
19
+ version: "latest"
20
+
21
+ - name: Sync dependencies
22
+ run: uv sync --extra claude --extra vertex-claude --extra bedrock
23
+
24
+ - name: Mypy
25
+ run: uv run mypy src/monkeybot
26
+
27
+ - name: Pytest
28
+ run: uv run pytest tests/ -q
29
+
30
+ - name: CLI pytest
31
+ working-directory: cli
32
+ run: |
33
+ uv sync
34
+ uv run pytest -q
35
+
36
+ - name: Browser MCP pytest
37
+ working-directory: integrations/browser-mcp
38
+ run: |
39
+ uv sync --dev
40
+ uv run pytest -q
41
+
42
+ - name: Evals self-checks (no live agent, no model calls)
43
+ run: |
44
+ uv sync --extra evals
45
+ uv run python evals/test_assertions.py
46
+ uv run python evals/test_report.py
47
+ uv run python evals/test_runner_sse.py
@@ -0,0 +1,158 @@
1
+ name: Live eval smoke
2
+
3
+ # Runs the live eval smoke suite (see docs/eval-pr-scorecard.md) and posts a Markdown
4
+ # scorecard as a PR comment. Only two trigger points, gated in the `gate` job below —
5
+ # LLM-judge calls cost money and take minutes, so this does not run on ordinary
6
+ # feature-branch -> develop PRs:
7
+ # (a) any PR from develop into main (release-promotion gate)
8
+ # (b) any PR that touches a dependency lockfile (catches silent SDK breakage,
9
+ # e.g. provider request/response shape changes, that code review won't see)
10
+ #
11
+ # Cost/time budget: smoke suite is ~7 scenarios x 2-5 turns x (agent call + judge call).
12
+ # Expect roughly $0.50-2.00 and 5-10 minutes per run depending on model pricing.
13
+ #
14
+ # Secrets required: NVIDIA_API_KEY (agent model, matches demo_agent's default free-tier
15
+ # provider) and OPENAI_API_KEY (deepeval judge model — JUDGE_PROVIDER/JUDGE_MODEL below
16
+ # pin it explicitly so scoring doesn't silently drift with deepeval's own default).
17
+
18
+ on:
19
+ pull_request:
20
+
21
+ permissions:
22
+ contents: read
23
+ pull-requests: write
24
+
25
+ jobs:
26
+ gate:
27
+ runs-on: ubuntu-latest
28
+ outputs:
29
+ run: ${{ steps.decide.outputs.run }}
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ with:
33
+ fetch-depth: 0
34
+
35
+ - id: decide
36
+ env:
37
+ BASE_REF: ${{ github.base_ref }}
38
+ HEAD_REF: ${{ github.head_ref }}
39
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
40
+ HEAD_SHA: ${{ github.event.pull_request.head.sha }}
41
+ run: |
42
+ run=false
43
+ if [[ "$BASE_REF" == "main" && "$HEAD_REF" == "develop" ]]; then
44
+ run=true
45
+ fi
46
+ changed="$(git diff --name-only "$BASE_SHA" "$HEAD_SHA")"
47
+ for f in uv.lock cli/uv.lock demo_agent/uv.lock; do
48
+ if grep -qxF "$f" <<<"$changed"; then
49
+ run=true
50
+ fi
51
+ done
52
+ echo "run=$run" >> "$GITHUB_OUTPUT"
53
+
54
+ secrets:
55
+ needs: gate
56
+ if: needs.gate.outputs.run == 'true'
57
+ runs-on: ubuntu-latest
58
+ steps:
59
+ - name: Require live-eval secrets
60
+ env:
61
+ NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
62
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
63
+ run: |
64
+ missing=()
65
+ [[ -z "$NVIDIA_API_KEY" ]] && missing+=("NVIDIA_API_KEY (agent model, https://build.nvidia.com)")
66
+ [[ -z "$OPENAI_API_KEY" ]] && missing+=("OPENAI_API_KEY (deepeval judge model)")
67
+ if [[ ${#missing[@]} -gt 0 ]]; then
68
+ echo "::error::Live eval smoke requires repository secrets that are not configured:"
69
+ for m in "${missing[@]}"; do echo "::error:: - $m"; done
70
+ exit 1
71
+ fi
72
+
73
+ live-eval:
74
+ needs: [gate, secrets]
75
+ if: needs.gate.outputs.run == 'true'
76
+ runs-on: ubuntu-latest
77
+ timeout-minutes: 30
78
+ steps:
79
+ - uses: actions/checkout@v4
80
+
81
+ - uses: astral-sh/setup-uv@v5
82
+ with:
83
+ version: "latest"
84
+
85
+ - name: Sync root deps (evals/report.py needs deepeval, langfuse)
86
+ run: uv sync --extra evals
87
+
88
+ - name: Sync demo_agent deps
89
+ working-directory: demo_agent
90
+ run: uv sync
91
+
92
+ - name: Boot monkeybot gateway (demo_agent workspace)
93
+ working-directory: demo_agent
94
+ env:
95
+ NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
96
+ SANDBOX_ENABLED: "false" # no Docker socket in this runner
97
+ # Small context window so context/summarization_trigger.yaml actually crosses the
98
+ # real summarization threshold; the other smoke scenarios are short enough to fit.
99
+ MODEL_CONTEXT_WINDOW: "8000"
100
+ run: |
101
+ uv run -m monkeybot.gateway.main > /tmp/gateway.log 2>&1 &
102
+ echo $! > /tmp/gateway.pid
103
+ for i in $(seq 1 30); do
104
+ if curl -sf http://127.0.0.1:8787/health > /dev/null; then
105
+ echo "gateway healthy"
106
+ exit 0
107
+ fi
108
+ sleep 2
109
+ done
110
+ echo "gateway did not become healthy" >&2
111
+ cat /tmp/gateway.log >&2
112
+ exit 1
113
+
114
+ - name: Run smoke suite report
115
+ env:
116
+ AGENT_URL: http://127.0.0.1:8787
117
+ JUDGE_PROVIDER: openai
118
+ JUDGE_MODEL: gpt-4o-mini
119
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
120
+ run: |
121
+ uv run python -m evals.report \
122
+ --suite smoke \
123
+ --baseline evals/baselines/smoke.json \
124
+ --fail-on-regression \
125
+ | tee eval-report.md
126
+
127
+ - name: Post report as PR comment
128
+ if: always()
129
+ uses: actions/github-script@v7
130
+ with:
131
+ script: |
132
+ const fs = require("fs");
133
+ const body = fs.existsSync("eval-report.md")
134
+ ? fs.readFileSync("eval-report.md", "utf8")
135
+ : "## monkeybot Eval Scorecard\n\n`FAIL` — the report step did not complete " +
136
+ "(gateway boot or the report command itself errored before writing a report). " +
137
+ "See the workflow run logs for details.";
138
+ await github.rest.issues.createComment({
139
+ issue_number: context.issue.number,
140
+ owner: context.repo.owner,
141
+ repo: context.repo.repo,
142
+ body,
143
+ });
144
+
145
+ - name: Upload run + report artifacts
146
+ if: always()
147
+ uses: actions/upload-artifact@v4
148
+ with:
149
+ name: live-eval-smoke-${{ github.run_id }}
150
+ path: |
151
+ evals/runs/
152
+ eval-report.md
153
+ if-no-files-found: ignore
154
+
155
+ - name: Stop gateway
156
+ if: always()
157
+ working-directory: demo_agent
158
+ run: kill "$(cat /tmp/gateway.pid)" 2>/dev/null || true
@@ -0,0 +1,36 @@
1
+ name: Prepare release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ package:
7
+ description: "Which package to release"
8
+ required: true
9
+ type: choice
10
+ options: [core, cli]
11
+ bump:
12
+ description: "Version bump"
13
+ required: true
14
+ type: choice
15
+ options: [patch, minor, major]
16
+
17
+ permissions:
18
+ contents: write
19
+ pull-requests: write
20
+
21
+ jobs:
22
+ prepare:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ with:
27
+ ref: develop
28
+
29
+ - name: Configure git identity
30
+ run: |
31
+ git config user.name "github-actions[bot]"
32
+ git config user.email "github-actions[bot]@users.noreply.github.com"
33
+
34
+ - run: python3 scripts/release.py prepare ${{ inputs.package }} ${{ inputs.bump }}
35
+ env:
36
+ GH_TOKEN: ${{ github.token }}
@@ -0,0 +1,98 @@
1
+ name: Publish release
2
+
3
+ # Fires whenever main moves - i.e. right after an admin merges a release PR.
4
+ # Branch protection on main (require PR + restrict merges to admins) is the
5
+ # actual access control; this tags + GitHub-Releases + Trusted-Publishes to PyPI.
6
+ #
7
+ # PyPI Pending Trusted Publishers (one per project — environments must differ):
8
+ # monkeybot: Owner human-plus-machine / Repo monkeybot /
9
+ # Workflow publish-release.yml / Environment pypi
10
+ # monkeybot-cli: Owner human-plus-machine / Repo monkeybot /
11
+ # Workflow publish-release.yml / Environment pypi-cli
12
+ #
13
+ # GitHub: create Environments named exactly `pypi` and `pypi-cli`.
14
+ on:
15
+ push:
16
+ branches: [main]
17
+ paths:
18
+ - "pyproject.toml"
19
+ - "cli/pyproject.toml"
20
+ - "CHANGELOG.md"
21
+
22
+ permissions:
23
+ contents: write
24
+
25
+ jobs:
26
+ publish:
27
+ runs-on: ubuntu-latest
28
+ outputs:
29
+ packages: ${{ steps.release.outputs.packages }}
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ with:
33
+ fetch-depth: 0
34
+
35
+ - name: Configure git identity
36
+ run: |
37
+ git config user.name "github-actions[bot]"
38
+ git config user.email "github-actions[bot]@users.noreply.github.com"
39
+
40
+ - id: release
41
+ run: python3 scripts/release.py publish
42
+ env:
43
+ GH_TOKEN: ${{ github.token }}
44
+
45
+ # Core before CLI (separate jobs / environments — required for two pending publishers).
46
+ pypi-core:
47
+ needs: publish
48
+ if: contains(format(',{0},', needs.publish.outputs.packages), ',core,')
49
+ runs-on: ubuntu-latest
50
+ environment:
51
+ name: pypi
52
+ url: https://pypi.org/p/monkeybot
53
+ permissions:
54
+ id-token: write
55
+ contents: read
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+ - uses: astral-sh/setup-uv@v5
59
+ - uses: actions/setup-python@v5
60
+ with:
61
+ python-version: "3.12"
62
+ - name: Build core
63
+ run: uv build --out-dir dist/core .
64
+ - name: Publish core to PyPI
65
+ uses: pypa/gh-action-pypi-publish@release/v1
66
+ with:
67
+ packages-dir: dist/core
68
+ skip-existing: true
69
+
70
+ pypi-cli:
71
+ needs: [publish, pypi-core]
72
+ # Run when cli is in the release set. If core wasn't released this run,
73
+ # pypi-core is skipped — treat that as success so cli can still publish.
74
+ if: |
75
+ always() &&
76
+ needs.publish.result == 'success' &&
77
+ contains(format(',{0},', needs.publish.outputs.packages), ',cli,') &&
78
+ (needs.pypi-core.result == 'success' || needs.pypi-core.result == 'skipped')
79
+ runs-on: ubuntu-latest
80
+ environment:
81
+ name: pypi-cli
82
+ url: https://pypi.org/p/monkeybot-cli
83
+ permissions:
84
+ id-token: write
85
+ contents: read
86
+ steps:
87
+ - uses: actions/checkout@v4
88
+ - uses: astral-sh/setup-uv@v5
89
+ - uses: actions/setup-python@v5
90
+ with:
91
+ python-version: "3.12"
92
+ - name: Build cli
93
+ run: uv build --out-dir dist/cli cli
94
+ - name: Publish cli to PyPI
95
+ uses: pypa/gh-action-pypi-publish@release/v1
96
+ with:
97
+ packages-dir: dist/cli
98
+ skip-existing: true
@@ -0,0 +1,64 @@
1
+ # Internal (not shipped in OSS)
2
+ internal/
3
+
4
+ # Environment
5
+ .env
6
+ .env.*
7
+ !.env.example
8
+
9
+ # Local scaffolded harness config (defaults ship in monkeybot-cli scaffold_defaults/)
10
+ /monkeybot_config/
11
+
12
+ # Demo agent live config (materialized from monkeybot_config_example/ by demo_agent/run.sh)
13
+ demo_agent/monkeybot_config/
14
+
15
+ # Live eval run artifacts (only evals/baselines/ is versioned)
16
+ /evals/runs/
17
+
18
+ # Python
19
+ __pycache__/
20
+ *.py[cod]
21
+ *.pyo
22
+ *.pyd
23
+ .Python
24
+ *.egg-info/
25
+ dist/
26
+ build/
27
+ .eggs/
28
+ *.egg
29
+
30
+ # uv
31
+ .venv/
32
+ .uv/
33
+
34
+ # Data (SQLite DB + memory files — never commit)
35
+ data/
36
+
37
+ # Testing & coverage
38
+ .pytest_cache/
39
+ .coverage
40
+ htmlcov/
41
+ .mypy_cache/
42
+ .ruff_cache/
43
+
44
+ # macOS
45
+ .DS_Store
46
+
47
+ # IDEs
48
+ .idea/
49
+ .vscode/
50
+ *.swp
51
+ *.swo
52
+
53
+ # Docker
54
+ docker/data/
55
+
56
+ # Planning Documents
57
+ .prt/
58
+ .monkeymode/
59
+
60
+ # Reference clones (read-only)
61
+ code/
62
+
63
+ # Local venv for evals dependency experiments
64
+ .evals-venv/
@@ -0,0 +1,20 @@
1
+ # Pre-commit hooks for monkeybot
2
+ # Install: uv run pre-commit install
3
+ # Run manually: uv run pre-commit run --all-files
4
+
5
+ repos:
6
+ - repo: local
7
+ hooks:
8
+ - id: mypy
9
+ name: mypy (src/monkeybot)
10
+ entry: uv run mypy src/monkeybot
11
+ language: system
12
+ pass_filenames: false
13
+ always_run: true
14
+
15
+ - id: pytest
16
+ name: pytest (changed tests or collection check)
17
+ entry: bash scripts/precommit-pytest.sh
18
+ language: system
19
+ files: ^(src/monkeybot|tests)/.*\.py$
20
+ pass_filenames: true
@@ -0,0 +1,34 @@
1
+ # AGENTS.md
2
+
3
+ ## Cursor Cloud specific instructions
4
+
5
+ monkeybot is a Python 3.11+ framework (managed with `uv`) whose product is the **FastAPI SSE gateway** (`python -m monkeybot.gateway.main`). Satellite sub-projects each have their own `pyproject.toml`/`uv.lock`/`.venv` and depend on the core via an editable path: `cli/` (the `monkeybot` CLI, recommended entrypoint), `integrations/browser-mcp/` (MCP server), and `evals/` (standalone eval service). Standard install/lint/test/build commands are documented in `README.md`, `docs/getting-started.md`, and `.github/workflows/ci.yml` (the authoritative CI recipe) — refer to those rather than duplicating them.
6
+
7
+ The startup update script already runs `uv sync` for the root (with the CI extras plus `evals` and `web-search`) and for `cli/` and `integrations/browser-mcp/`, so dependencies are ready. `uv` installs to `~/.local/bin`; if `uv` is not found, add that to `PATH`.
8
+
9
+ Non-obvious gotchas discovered during setup:
10
+
11
+ - **Run the gateway with no cloud credentials via `MODEL_PROVIDER=fake`.** It injects a deterministic scripted provider (default reply `hello`), exercising the full session → SSE → agent-loop → SQLite path without any API keys. Real providers (`gemini`, `openai`, `anthropic`, …) need keys/ADC in a repo-root `.env`.
12
+ - **Running the gateway requires scaffolded config** at the process cwd: `cd cli && uv run monkeybot new --dest .. --yes` creates `monkeybot_config/`, `workspace/`, and `data/` at the repo root (all gitignored except the stray `.env.example`/`scripts/setup-workspace.sh` — do not commit those). Do NOT put scaffolding in the update script.
13
+ - **The root pytest suite must NOT be run with the scaffold present.** A scaffolded `monkeybot_config/` + `workspace/` at the repo root makes 2 workspace-resolution tests fail (`tests/gateway/sse/test_routes.py::test_workspace_tree_and_file` and `tests/skills/test_generate_image_script.py::test_generate_image_script_success_mocked_vertex`); both pass in isolation. CI passes because it runs from a fresh checkout with no scaffold. Before `uv run pytest tests/ -q`, run tests in a clean tree (move `monkeybot_config/`, `workspace/`, `data/` aside, or use a checkout that was never scaffolded).
14
+ - **`ruff` is not enforced by CI** and currently reports pre-existing failures across `src/` and `tests/`. CI gates only `mypy src/monkeybot` + pytest (root, `cli/`, `integrations/browser-mcp/`) + the three `evals/test_*.py` standalone self-check scripts. Do not treat existing `ruff check .` failures as regressions.
15
+ - **`monkeybot doctor` reporting port 8080 "in use" or "no provider credentials" is expected** when the gateway is already running and/or you are using the `fake` provider — it is not a setup failure.
16
+
17
+ ## Git workflow
18
+
19
+ Always sync with the remote **before** writing code — do not assume the local checkout is current.
20
+
21
+ **Starting a new feature:**
22
+
23
+ 1. `git fetch origin develop && git checkout develop && git pull origin develop`
24
+ 2. Create the feature branch from that fresh tip: `git checkout -b cursor/<descriptive-name>-<suffix>`
25
+
26
+ **Continuing an existing feature branch:**
27
+
28
+ 1. `git fetch origin <branch-name> && git checkout <branch-name> && git pull origin <branch-name>`
29
+
30
+ **When the base branch (`develop`) has moved** and you need those changes on your feature branch:
31
+
32
+ - `git fetch origin develop` then `git merge origin/develop` (or `git rebase origin/develop` if that is the project convention)
33
+
34
+ Check `git status` and `git branch -a` first when the environment starts on a detached `HEAD` or an unfamiliar checkout.
@@ -0,0 +1,77 @@
1
+ # monkeybot Backlog
2
+
3
+ ---
4
+
5
+ ## Up Next — Major Priorities
6
+
7
+ ### 1. Chat Integration
8
+ - **Google Chat gateway** — incoming webhook + event handler for Google Chat spaces.
9
+ - **Slack gateway** — Slack Events API / socket mode integration.
10
+
11
+ ### 2. Evals *(in progress)*
12
+ - Integrate eval framework (langfuse, deepeval, or similar) into the harness — not just playground-level; needs to be first-class traceability in the agent loop.
13
+ - **Memory accuracy verification** — script exists (`scripts/verify_memory.py`) but needs a real eval strategy, not a one-off script.
14
+
15
+ ### 3. Scheduler
16
+ - Wire a `Scheduler` into the FastAPI lifespan as an optional background task when `config.yaml` has `scheduler.jobs` (reference: `legacy/src/monkeybot/core/scheduler.py`).
17
+ - Needs significant design work for cloud runtimes: Lambda/Cloud Functions have no persistent process, GKE/ECS can use sidecar or CronJob, etc. Think through heartbeat / self-scheduling before implementing.
18
+
19
+ ### 4. Sandbox Workspace Protection
20
+ - Add a hard-coded deny layer inside `SandboxExecutor` that blocks `run_command` from targeting harness-owned paths: `.monkeybot/`, `monkeybot.yaml`, `*.env`, `.agents/`, `config/`.
21
+ - Path-level policy at the executor — distinct from `command_allowlist.yaml` which is command-level. Agent should retain free rw access to `./code/`, `./data/`, etc.
22
+
23
+ ### 5. HITL Completion
24
+ - The loop and `/tool-confirmations` API endpoint exist; inspectors have `confirm` as a valid `Decision.kind` but no inspector currently returns it ("Story 5" placeholder).
25
+ - Wire an inspector that returns `confirm` for configurable tool patterns, flowing through the existing `_await_user_response` path.
26
+
27
+ ### 6. DurableRunStore Wiring (crash recovery) — DONE
28
+ - Subagent runs are persisted via `CoreToolExecutor` (`record_started` / `record_completed` / `record_failed`).
29
+ - Queue mode: set `MONKEYBOT_TASK_QUEUE=1` to enqueue with `record_pending` instead of inline spawn.
30
+ - Worker pool: standalone `python -m monkeybot.subagents.worker` consumes queued runs with atomic `claim()` (recommended for production — its own event loop, scales independently of the gateway). `MONKEYBOT_WORKER_POOL=1` runs the same loop in-process on the gateway and is development-only (competes with the SSE event loop).
31
+
32
+ ### 7. CLI-managed optional service dependencies
33
+ - `monkeybot chat` / `run` only spawn the gateway process; they don't start the Docker-backed optional services some `monkeybot.yaml` configs require: OpenSandbox (`sandbox.enabled`), Firestore emulator (`paths.db_url: firestore://...`), or the observability stack (Phoenix/Langfuse/OTel collector). `demo_agent/run.sh` currently does this orchestration via bash (build/start/health-check/cleanup), which means the CLI alone can't fully run an agent that uses those features.
34
+ - Decide and implement: should the CLI (`doctor`, `run`, `chat`) detect these from config and actually start/stop the containers (matching `run.sh` behavior, retiring the bash script), or just validate/warn with remediation hints while the user manages Docker manually?
35
+ - Open sub-questions if going the "CLI starts services" route: where do per-project Docker assets live (`opensandbox.docker.toml`, OTel collector yaml, compose files) — agent-project-owned files referenced from `monkeybot.yaml`, or CLI-shipped generic templates; and is the sandbox worker image (project-specific extra deps) something the CLI should build, or stay manual/documented.
36
+
37
+ ---
38
+
39
+ ## Do Later
40
+
41
+ ### Connectors
42
+ - **CLI gateway** — interactive stdin/stdout (reference: `legacy/src/monkeybot/gateway/cli.py`).
43
+ - **Webhook gateway** — generic HTTP + HMAC (reference: `legacy/src/monkeybot/gateway/webhook.py`).
44
+ - **`python -m monkeybot` CLI** — `run` / `serve` / `usage` / `schedule` subcommands (reference: `legacy/src/monkeybot/cli.py`).
45
+
46
+ ### Cloud Deployments
47
+ - **GCP server** — GCE / GKE deployment option (docs + examples exist; no IaC).
48
+ - **AWS serverless** — Lambda + API Gateway (example handler exists; not a full deploy path).
49
+ - **AWS server** — EC2 / ECS deployment option.
50
+ - **Docker CI image matrix** — multi-extras build matrix in CI.
51
+
52
+ ### Infra
53
+ - **Postgres as production default** — backend exists; gateway still defaults to SQLite; decide when/if this becomes the default.
54
+
55
+ ### Memory
56
+ - **INDEX.md size cap** *(deferred 2026-05-15)* — `MemoryOrganizer` appends without bound; acceptable for now via `ContextCurator` selection. When indices grow wastefully large, cap with a sliding window (N=200, archive to `INDEX.archive.md`) in `core/memory_organizer.py`.
57
+
58
+ ### MCP
59
+ - **MCP distro linkage** — confirm `monkeybot_config_example/monkeybot.example.yaml` paths (`paths.mcp_config`, `paths.skills_path`) match deployment; smoke-test against real MCP servers beyond the bundled LangChain docs URL.
60
+
61
+ ### Future platforms *(not scheduled)*
62
+
63
+ Moved from README — longer-term / speculative integrations without active implementation:
64
+
65
+ - **Azure OpenAI** — Azure-hosted OpenAI models
66
+ - **Azure Blob Storage** — memory backend (`[azure]` extra; docs note as planned)
67
+ - **Azure Key Vault** — secrets for Azure deployments
68
+ - **AWS Secrets Manager** — secret resolver at runtime
69
+ - **GCP Secret Manager** — finish `secrets.provider: gcp_secret_manager` wiring (schema exists; resolver not shipped)
70
+ - **Microsoft Teams** — Teams bot interface
71
+ - **Telegram** — Telegram bot interface
72
+ - **DynamoDB** — checkpointer / job storage backend
73
+ - **Cosmos DB** — Azure-native persistence options
74
+
75
+ ### Tooling
76
+ - **File-op tool audit** — evaluate removing `write_file` in favor of `create_file` + `find_and_replace` in `core_tool_executor.py` and `workspace_tools.py` (reference: Claude Code patterns).
77
+ - **Custom subagents** — allow operators to pre-configure named subagent profiles (own AGENT.md, restricted skill set, specific MCP servers) in `core_tool_executor.py`, `subagent_proto.py`, and `subagent_worker.py`.