durin-agent 0.1.0a1__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 (676) hide show
  1. durin_agent-0.1.0a1/.github/workflows/ci.yml +36 -0
  2. durin_agent-0.1.0a1/.github/workflows/release.yml +105 -0
  3. durin_agent-0.1.0a1/.gitignore +57 -0
  4. durin_agent-0.1.0a1/PKG-INFO +57 -0
  5. durin_agent-0.1.0a1/README.md +99 -0
  6. durin_agent-0.1.0a1/docs/01_roadmap.md +216 -0
  7. durin_agent-0.1.0a1/docs/02_bitacora.md +1034 -0
  8. durin_agent-0.1.0a1/docs/03_memory_design.md +462 -0
  9. durin_agent-0.1.0a1/docs/07_external_agents_review.md +618 -0
  10. durin_agent-0.1.0a1/docs/08_memory_phase2_proposal.md +1323 -0
  11. durin_agent-0.1.0a1/docs/09_code_audit.md +177 -0
  12. durin_agent-0.1.0a1/docs/09_daily_driver_plan.md +205 -0
  13. durin_agent-0.1.0a1/docs/10_smoke_test_report.md +379 -0
  14. durin_agent-0.1.0a1/docs/10_textual_migration.md +243 -0
  15. durin_agent-0.1.0a1/docs/ARCHITECTURE.md +905 -0
  16. durin_agent-0.1.0a1/docs/INSTALL.md +287 -0
  17. durin_agent-0.1.0a1/docs/RELEASING.md +147 -0
  18. durin_agent-0.1.0a1/docs/archive/04_agent_strategies_catalog.md +253 -0
  19. durin_agent-0.1.0a1/docs/archive/05_log_swebench.md +99 -0
  20. durin_agent-0.1.0a1/docs/archive/06_log_experiments.md +529 -0
  21. durin_agent-0.1.0a1/docs/archive/README.md +30 -0
  22. durin_agent-0.1.0a1/durin/__init__.py +45 -0
  23. durin_agent-0.1.0a1/durin/__main__.py +8 -0
  24. durin_agent-0.1.0a1/durin/agent/__init__.py +20 -0
  25. durin_agent-0.1.0a1/durin/agent/agent_mode.py +360 -0
  26. durin_agent-0.1.0a1/durin/agent/context.py +332 -0
  27. durin_agent-0.1.0a1/durin/agent/hook.py +141 -0
  28. durin_agent-0.1.0a1/durin/agent/loop.py +1883 -0
  29. durin_agent-0.1.0a1/durin/agent/memory.py +1276 -0
  30. durin_agent-0.1.0a1/durin/agent/model_presets.py +66 -0
  31. durin_agent-0.1.0a1/durin/agent/progress_hook.py +200 -0
  32. durin_agent-0.1.0a1/durin/agent/runner.py +2156 -0
  33. durin_agent-0.1.0a1/durin/agent/skills.py +275 -0
  34. durin_agent-0.1.0a1/durin/agent/subagent.py +548 -0
  35. durin_agent-0.1.0a1/durin/agent/tools/__init__.py +31 -0
  36. durin_agent-0.1.0a1/durin/agent/tools/_telemetry.py +37 -0
  37. durin_agent-0.1.0a1/durin/agent/tools/ask_user.py +192 -0
  38. durin_agent-0.1.0a1/durin/agent/tools/base.py +296 -0
  39. durin_agent-0.1.0a1/durin/agent/tools/context.py +59 -0
  40. durin_agent-0.1.0a1/durin/agent/tools/cron.py +434 -0
  41. durin_agent-0.1.0a1/durin/agent/tools/file_state.py +205 -0
  42. durin_agent-0.1.0a1/durin/agent/tools/filesystem.py +1121 -0
  43. durin_agent-0.1.0a1/durin/agent/tools/image_generation.py +223 -0
  44. durin_agent-0.1.0a1/durin/agent/tools/interpret_audio.py +242 -0
  45. durin_agent-0.1.0a1/durin/agent/tools/interpret_image.py +207 -0
  46. durin_agent-0.1.0a1/durin/agent/tools/loader.py +116 -0
  47. durin_agent-0.1.0a1/durin/agent/tools/long_task.py +227 -0
  48. durin_agent-0.1.0a1/durin/agent/tools/mcp.py +664 -0
  49. durin_agent-0.1.0a1/durin/agent/tools/memory_drill.py +65 -0
  50. durin_agent-0.1.0a1/durin/agent/tools/memory_ingest.py +90 -0
  51. durin_agent-0.1.0a1/durin/agent/tools/memory_search.py +184 -0
  52. durin_agent-0.1.0a1/durin/agent/tools/memory_store.py +168 -0
  53. durin_agent-0.1.0a1/durin/agent/tools/message.py +250 -0
  54. durin_agent-0.1.0a1/durin/agent/tools/notebook.py +162 -0
  55. durin_agent-0.1.0a1/durin/agent/tools/output_spill.py +113 -0
  56. durin_agent-0.1.0a1/durin/agent/tools/path_utils.py +42 -0
  57. durin_agent-0.1.0a1/durin/agent/tools/plan_mode.py +384 -0
  58. durin_agent-0.1.0a1/durin/agent/tools/registry.py +125 -0
  59. durin_agent-0.1.0a1/durin/agent/tools/repo_overview.py +284 -0
  60. durin_agent-0.1.0a1/durin/agent/tools/runtime_state.py +59 -0
  61. durin_agent-0.1.0a1/durin/agent/tools/sandbox.py +127 -0
  62. durin_agent-0.1.0a1/durin/agent/tools/schema.py +232 -0
  63. durin_agent-0.1.0a1/durin/agent/tools/search.py +441 -0
  64. durin_agent-0.1.0a1/durin/agent/tools/self.py +475 -0
  65. durin_agent-0.1.0a1/durin/agent/tools/session_search.py +297 -0
  66. durin_agent-0.1.0a1/durin/agent/tools/shell.py +434 -0
  67. durin_agent-0.1.0a1/durin/agent/tools/sleep.py +147 -0
  68. durin_agent-0.1.0a1/durin/agent/tools/spawn.py +78 -0
  69. durin_agent-0.1.0a1/durin/agent/tools/subagent_lifecycle.py +457 -0
  70. durin_agent-0.1.0a1/durin/agent/tools/todos.py +214 -0
  71. durin_agent-0.1.0a1/durin/agent/tools/web.py +655 -0
  72. durin_agent-0.1.0a1/durin/api/__init__.py +1 -0
  73. durin_agent-0.1.0a1/durin/api/server.py +399 -0
  74. durin_agent-0.1.0a1/durin/bus/__init__.py +6 -0
  75. durin_agent-0.1.0a1/durin/bus/events.py +48 -0
  76. durin_agent-0.1.0a1/durin/bus/queue.py +44 -0
  77. durin_agent-0.1.0a1/durin/channels/__init__.py +6 -0
  78. durin_agent-0.1.0a1/durin/channels/base.py +257 -0
  79. durin_agent-0.1.0a1/durin/channels/dingtalk.py +754 -0
  80. durin_agent-0.1.0a1/durin/channels/discord.py +808 -0
  81. durin_agent-0.1.0a1/durin/channels/email.py +683 -0
  82. durin_agent-0.1.0a1/durin/channels/feishu.py +1917 -0
  83. durin_agent-0.1.0a1/durin/channels/manager.py +472 -0
  84. durin_agent-0.1.0a1/durin/channels/matrix.py +916 -0
  85. durin_agent-0.1.0a1/durin/channels/mochat.py +943 -0
  86. durin_agent-0.1.0a1/durin/channels/msteams.py +773 -0
  87. durin_agent-0.1.0a1/durin/channels/qq.py +690 -0
  88. durin_agent-0.1.0a1/durin/channels/registry.py +71 -0
  89. durin_agent-0.1.0a1/durin/channels/slack.py +729 -0
  90. durin_agent-0.1.0a1/durin/channels/telegram.py +1300 -0
  91. durin_agent-0.1.0a1/durin/channels/websocket.py +1811 -0
  92. durin_agent-0.1.0a1/durin/channels/wecom.py +554 -0
  93. durin_agent-0.1.0a1/durin/channels/weixin.py +1389 -0
  94. durin_agent-0.1.0a1/durin/channels/whatsapp.py +383 -0
  95. durin_agent-0.1.0a1/durin/cli/__init__.py +1 -0
  96. durin_agent-0.1.0a1/durin/cli/commands.py +1884 -0
  97. durin_agent-0.1.0a1/durin/cli/completers.py +135 -0
  98. durin_agent-0.1.0a1/durin/cli/config_cmd.py +284 -0
  99. durin_agent-0.1.0a1/durin/cli/doctor.py +474 -0
  100. durin_agent-0.1.0a1/durin/cli/dragdrop.py +120 -0
  101. durin_agent-0.1.0a1/durin/cli/footer.py +143 -0
  102. durin_agent-0.1.0a1/durin/cli/models.py +31 -0
  103. durin_agent-0.1.0a1/durin/cli/onboard.py +1169 -0
  104. durin_agent-0.1.0a1/durin/cli/stream.py +267 -0
  105. durin_agent-0.1.0a1/durin/cli/tui/__init__.py +12 -0
  106. durin_agent-0.1.0a1/durin/cli/tui/app.py +398 -0
  107. durin_agent-0.1.0a1/durin/cli/tui/durin.tcss +13 -0
  108. durin_agent-0.1.0a1/durin/cli/tui/screens/__init__.py +6 -0
  109. durin_agent-0.1.0a1/durin/cli/tui/screens/model_picker.py +83 -0
  110. durin_agent-0.1.0a1/durin/cli/tui/screens/session_picker.py +97 -0
  111. durin_agent-0.1.0a1/durin/cli/tui/shell_paste.py +97 -0
  112. durin_agent-0.1.0a1/durin/cli/tui/widgets/__init__.py +22 -0
  113. durin_agent-0.1.0a1/durin/cli/tui/widgets/chat_view.py +129 -0
  114. durin_agent-0.1.0a1/durin/cli/tui/widgets/footer_bar.py +106 -0
  115. durin_agent-0.1.0a1/durin/cli/tui/widgets/header_bar.py +81 -0
  116. durin_agent-0.1.0a1/durin/cli/tui/widgets/input_area.py +158 -0
  117. durin_agent-0.1.0a1/durin/cli/uninstall.py +250 -0
  118. durin_agent-0.1.0a1/durin/cli/upgrade.py +163 -0
  119. durin_agent-0.1.0a1/durin/command/__init__.py +6 -0
  120. durin_agent-0.1.0a1/durin/command/builtin.py +1839 -0
  121. durin_agent-0.1.0a1/durin/command/router.py +88 -0
  122. durin_agent-0.1.0a1/durin/config/__init__.py +34 -0
  123. durin_agent-0.1.0a1/durin/config/loader.py +172 -0
  124. durin_agent-0.1.0a1/durin/config/paths.py +76 -0
  125. durin_agent-0.1.0a1/durin/config/schema.py +635 -0
  126. durin_agent-0.1.0a1/durin/cron/__init__.py +6 -0
  127. durin_agent-0.1.0a1/durin/cron/service.py +664 -0
  128. durin_agent-0.1.0a1/durin/cron/types.py +83 -0
  129. durin_agent-0.1.0a1/durin/durin_sdk.py +109 -0
  130. durin_agent-0.1.0a1/durin/heartbeat/__init__.py +5 -0
  131. durin_agent-0.1.0a1/durin/heartbeat/service.py +253 -0
  132. durin_agent-0.1.0a1/durin/memory/__init__.py +61 -0
  133. durin_agent-0.1.0a1/durin/memory/consolidator_tags.py +79 -0
  134. durin_agent-0.1.0a1/durin/memory/drill.py +96 -0
  135. durin_agent-0.1.0a1/durin/memory/embedding.py +125 -0
  136. durin_agent-0.1.0a1/durin/memory/hot_layer.py +141 -0
  137. durin_agent-0.1.0a1/durin/memory/ingestion.py +96 -0
  138. durin_agent-0.1.0a1/durin/memory/paths.py +67 -0
  139. durin_agent-0.1.0a1/durin/memory/provenance.py +52 -0
  140. durin_agent-0.1.0a1/durin/memory/schema.py +41 -0
  141. durin_agent-0.1.0a1/durin/memory/search.py +325 -0
  142. durin_agent-0.1.0a1/durin/memory/session_md.py +147 -0
  143. durin_agent-0.1.0a1/durin/memory/storage.py +91 -0
  144. durin_agent-0.1.0a1/durin/memory/store.py +102 -0
  145. durin_agent-0.1.0a1/durin/memory/vector_index.py +208 -0
  146. durin_agent-0.1.0a1/durin/pairing/__init__.py +33 -0
  147. durin_agent-0.1.0a1/durin/pairing/store.py +254 -0
  148. durin_agent-0.1.0a1/durin/providers/__init__.py +45 -0
  149. durin_agent-0.1.0a1/durin/providers/anthropic_provider.py +646 -0
  150. durin_agent-0.1.0a1/durin/providers/azure_openai_provider.py +185 -0
  151. durin_agent-0.1.0a1/durin/providers/base.py +820 -0
  152. durin_agent-0.1.0a1/durin/providers/bedrock_provider.py +761 -0
  153. durin_agent-0.1.0a1/durin/providers/capabilities.py +382 -0
  154. durin_agent-0.1.0a1/durin/providers/data/model_capabilities.json +15604 -0
  155. durin_agent-0.1.0a1/durin/providers/factory.py +248 -0
  156. durin_agent-0.1.0a1/durin/providers/fallback_provider.py +273 -0
  157. durin_agent-0.1.0a1/durin/providers/github_copilot_provider.py +260 -0
  158. durin_agent-0.1.0a1/durin/providers/image_generation.py +395 -0
  159. durin_agent-0.1.0a1/durin/providers/local_llama_provider.py +217 -0
  160. durin_agent-0.1.0a1/durin/providers/openai_codex_provider.py +163 -0
  161. durin_agent-0.1.0a1/durin/providers/openai_compat_provider.py +1371 -0
  162. durin_agent-0.1.0a1/durin/providers/openai_responses/__init__.py +29 -0
  163. durin_agent-0.1.0a1/durin/providers/openai_responses/converters.py +110 -0
  164. durin_agent-0.1.0a1/durin/providers/openai_responses/parsing.py +297 -0
  165. durin_agent-0.1.0a1/durin/providers/registry.py +493 -0
  166. durin_agent-0.1.0a1/durin/providers/transcription.py +202 -0
  167. durin_agent-0.1.0a1/durin/security/__init__.py +1 -0
  168. durin_agent-0.1.0a1/durin/security/network.py +119 -0
  169. durin_agent-0.1.0a1/durin/session/__init__.py +5 -0
  170. durin_agent-0.1.0a1/durin/session/goal_state.py +111 -0
  171. durin_agent-0.1.0a1/durin/session/manager.py +768 -0
  172. durin_agent-0.1.0a1/durin/session/session_meta.py +356 -0
  173. durin_agent-0.1.0a1/durin/session/todo_state.py +135 -0
  174. durin_agent-0.1.0a1/durin/skills/README.md +32 -0
  175. durin_agent-0.1.0a1/durin/skills/clawhub/SKILL.md +53 -0
  176. durin_agent-0.1.0a1/durin/skills/cron/SKILL.md +57 -0
  177. durin_agent-0.1.0a1/durin/skills/github/SKILL.md +48 -0
  178. durin_agent-0.1.0a1/durin/skills/image-generation/SKILL.md +112 -0
  179. durin_agent-0.1.0a1/durin/skills/long-goal/SKILL.md +79 -0
  180. durin_agent-0.1.0a1/durin/skills/memory/SKILL.md +36 -0
  181. durin_agent-0.1.0a1/durin/skills/my/SKILL.md +72 -0
  182. durin_agent-0.1.0a1/durin/skills/my/references/examples.md +75 -0
  183. durin_agent-0.1.0a1/durin/skills/skill-creator/SKILL.md +374 -0
  184. durin_agent-0.1.0a1/durin/skills/skill-creator/scripts/init_skill.py +378 -0
  185. durin_agent-0.1.0a1/durin/skills/skill-creator/scripts/package_skill.py +152 -0
  186. durin_agent-0.1.0a1/durin/skills/skill-creator/scripts/quick_validate.py +213 -0
  187. durin_agent-0.1.0a1/durin/skills/summarize/SKILL.md +67 -0
  188. durin_agent-0.1.0a1/durin/skills/tmux/SKILL.md +121 -0
  189. durin_agent-0.1.0a1/durin/skills/tmux/scripts/find-sessions.sh +112 -0
  190. durin_agent-0.1.0a1/durin/skills/tmux/scripts/wait-for-text.sh +83 -0
  191. durin_agent-0.1.0a1/durin/skills/update-setup/SKILL.md +123 -0
  192. durin_agent-0.1.0a1/durin/skills/weather/SKILL.md +49 -0
  193. durin_agent-0.1.0a1/durin/telemetry/__init__.py +6 -0
  194. durin_agent-0.1.0a1/durin/telemetry/logger.py +115 -0
  195. durin_agent-0.1.0a1/durin/telemetry/schema.py +587 -0
  196. durin_agent-0.1.0a1/durin/templates/AGENTS.md +19 -0
  197. durin_agent-0.1.0a1/durin/templates/HEARTBEAT.md +16 -0
  198. durin_agent-0.1.0a1/durin/templates/SOUL.md +20 -0
  199. durin_agent-0.1.0a1/durin/templates/TOOLS.md +28 -0
  200. durin_agent-0.1.0a1/durin/templates/USER.md +49 -0
  201. durin_agent-0.1.0a1/durin/templates/__init__.py +0 -0
  202. durin_agent-0.1.0a1/durin/templates/agent/_snippets/untrusted_content.md +2 -0
  203. durin_agent-0.1.0a1/durin/templates/agent/consolidator_archive.md +24 -0
  204. durin_agent-0.1.0a1/durin/templates/agent/dream_phase1.md +40 -0
  205. durin_agent-0.1.0a1/durin/templates/agent/dream_phase2.md +37 -0
  206. durin_agent-0.1.0a1/durin/templates/agent/evaluator.md +17 -0
  207. durin_agent-0.1.0a1/durin/templates/agent/identity.md +34 -0
  208. durin_agent-0.1.0a1/durin/templates/agent/max_iterations_message.md +1 -0
  209. durin_agent-0.1.0a1/durin/templates/agent/platform_policy.md +10 -0
  210. durin_agent-0.1.0a1/durin/templates/agent/skills_section.md +6 -0
  211. durin_agent-0.1.0a1/durin/templates/agent/subagent_announce.md +8 -0
  212. durin_agent-0.1.0a1/durin/templates/agent/subagent_system.md +19 -0
  213. durin_agent-0.1.0a1/durin/templates/memory/MEMORY.md +23 -0
  214. durin_agent-0.1.0a1/durin/templates/memory/__init__.py +0 -0
  215. durin_agent-0.1.0a1/durin/utils/__init__.py +6 -0
  216. durin_agent-0.1.0a1/durin/utils/artifacts.py +162 -0
  217. durin_agent-0.1.0a1/durin/utils/document.py +283 -0
  218. durin_agent-0.1.0a1/durin/utils/evaluator.py +89 -0
  219. durin_agent-0.1.0a1/durin/utils/gitstore.py +390 -0
  220. durin_agent-0.1.0a1/durin/utils/helpers.py +719 -0
  221. durin_agent-0.1.0a1/durin/utils/history_image_prune.py +183 -0
  222. durin_agent-0.1.0a1/durin/utils/image_generation_intent.py +27 -0
  223. durin_agent-0.1.0a1/durin/utils/logging_bridge.py +47 -0
  224. durin_agent-0.1.0a1/durin/utils/media_decode.py +55 -0
  225. durin_agent-0.1.0a1/durin/utils/path.py +107 -0
  226. durin_agent-0.1.0a1/durin/utils/post_compaction_guard.py +217 -0
  227. durin_agent-0.1.0a1/durin/utils/progress_events.py +84 -0
  228. durin_agent-0.1.0a1/durin/utils/prompt_templates.py +35 -0
  229. durin_agent-0.1.0a1/durin/utils/restart.py +84 -0
  230. durin_agent-0.1.0a1/durin/utils/runtime.py +203 -0
  231. durin_agent-0.1.0a1/durin/utils/searchusage.py +168 -0
  232. durin_agent-0.1.0a1/durin/utils/session_attachments.py +74 -0
  233. durin_agent-0.1.0a1/durin/utils/subagent_channel_display.py +59 -0
  234. durin_agent-0.1.0a1/durin/utils/tool_argument_repair.py +160 -0
  235. durin_agent-0.1.0a1/durin/utils/tool_hints.py +140 -0
  236. durin_agent-0.1.0a1/durin/utils/tool_result_validation.py +144 -0
  237. durin_agent-0.1.0a1/durin/utils/webui_thread_disk.py +31 -0
  238. durin_agent-0.1.0a1/durin/utils/webui_titles.py +138 -0
  239. durin_agent-0.1.0a1/durin/utils/webui_transcript.py +423 -0
  240. durin_agent-0.1.0a1/durin/utils/webui_turn_helpers.py +48 -0
  241. durin_agent-0.1.0a1/durin/web/__init__.py +8 -0
  242. durin_agent-0.1.0a1/hatch_build.py +101 -0
  243. durin_agent-0.1.0a1/pyproject.toml +103 -0
  244. durin_agent-0.1.0a1/scripts/_vendor_sources.py +340 -0
  245. durin_agent-0.1.0a1/scripts/hypothesis_test/README.md +125 -0
  246. durin_agent-0.1.0a1/scripts/hypothesis_test/aider_prompts/base_prompts.py +60 -0
  247. durin_agent-0.1.0a1/scripts/hypothesis_test/aider_prompts/benchmark.py +1059 -0
  248. durin_agent-0.1.0a1/scripts/hypothesis_test/aider_prompts/benchmark_prompts.py +16 -0
  249. durin_agent-0.1.0a1/scripts/hypothesis_test/aider_prompts/editblock_prompts.py +172 -0
  250. durin_agent-0.1.0a1/scripts/hypothesis_test/aider_prompts/udiff_prompts.py +113 -0
  251. durin_agent-0.1.0a1/scripts/hypothesis_test/aider_prompts/wholefile_prompts.py +64 -0
  252. durin_agent-0.1.0a1/scripts/hypothesis_test/results.json +74 -0
  253. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v2.json +88 -0
  254. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v3_critic.json +1459 -0
  255. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v3_multitrial.json +5665 -0
  256. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v4_criteria.json +3767 -0
  257. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v5_multiscenario.json +14245 -0
  258. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v6_self_review.json +12504 -0
  259. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v7_durin_components.json +2939 -0
  260. durin_agent-0.1.0a1/scripts/hypothesis_test/results_v8_combos.json +3216 -0
  261. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment.py +434 -0
  262. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v2.py +322 -0
  263. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v3_critic.py +677 -0
  264. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v3_multitrial.py +121 -0
  265. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v4_criteria.py +462 -0
  266. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v5_multiscenario.py +251 -0
  267. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v6_self_review.py +297 -0
  268. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v7_durin_components.py +741 -0
  269. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v8_combos.py +451 -0
  270. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v9_soul.py +435 -0
  271. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v9b_minitest.py +364 -0
  272. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v9c_full.py +330 -0
  273. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v9d_nocap.py +333 -0
  274. durin_agent-0.1.0a1/scripts/hypothesis_test/run_experiment_v9e_complement.py +369 -0
  275. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_1/README_BUG.md +20 -0
  276. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_1/preferences.py +34 -0
  277. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_1/sender.py +44 -0
  278. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_1/templates.py +18 -0
  279. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_1/user_service.py +22 -0
  280. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_2/README_TASK.md +15 -0
  281. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_2/discounts.py +33 -0
  282. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_2/invoice.py +25 -0
  283. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_2/tax_rules.py +36 -0
  284. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_2/test_invoice.py +46 -0
  285. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_3/README_BUG.md +15 -0
  286. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_3/admin.py +22 -0
  287. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_3/prices.py +9 -0
  288. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_3/product_db.py +18 -0
  289. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_3/test_pricing.py +21 -0
  290. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_4/README_TASK.md +10 -0
  291. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_4/api.py +39 -0
  292. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_4/auth.py +33 -0
  293. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_4/models.py +35 -0
  294. durin_agent-0.1.0a1/scripts/hypothesis_test/scenario_4/test_api.py +44 -0
  295. durin_agent-0.1.0a1/scripts/refresh_model_capabilities.py +518 -0
  296. durin_agent-0.1.0a1/scripts/simulate_posture_session.py +340 -0
  297. durin_agent-0.1.0a1/tests/agent/__init__.py +0 -0
  298. durin_agent-0.1.0a1/tests/agent/conftest.py +93 -0
  299. durin_agent-0.1.0a1/tests/agent/test_agent_mode.py +444 -0
  300. durin_agent-0.1.0a1/tests/agent/test_cache_usage_telemetry.py +124 -0
  301. durin_agent-0.1.0a1/tests/agent/test_compaction_lock_timeout.py +209 -0
  302. durin_agent-0.1.0a1/tests/agent/test_consolidate_offset.py +619 -0
  303. durin_agent-0.1.0a1/tests/agent/test_consolidation_ratio.py +122 -0
  304. durin_agent-0.1.0a1/tests/agent/test_consolidator.py +392 -0
  305. durin_agent-0.1.0a1/tests/agent/test_context_aware.py +23 -0
  306. durin_agent-0.1.0a1/tests/agent/test_context_builder.py +349 -0
  307. durin_agent-0.1.0a1/tests/agent/test_context_prompt_cache.py +387 -0
  308. durin_agent-0.1.0a1/tests/agent/test_context_three_tier_prompt.py +185 -0
  309. durin_agent-0.1.0a1/tests/agent/test_context_transform_hook.py +196 -0
  310. durin_agent-0.1.0a1/tests/agent/test_cursor_recovery.py +188 -0
  311. durin_agent-0.1.0a1/tests/agent/test_dream.py +309 -0
  312. durin_agent-0.1.0a1/tests/agent/test_dream_tools.py +19 -0
  313. durin_agent-0.1.0a1/tests/agent/test_evaluator.py +63 -0
  314. durin_agent-0.1.0a1/tests/agent/test_gemini_thought_signature.py +205 -0
  315. durin_agent-0.1.0a1/tests/agent/test_git_store.py +234 -0
  316. durin_agent-0.1.0a1/tests/agent/test_heartbeat_isolated_sessions.py +56 -0
  317. durin_agent-0.1.0a1/tests/agent/test_heartbeat_service.py +289 -0
  318. durin_agent-0.1.0a1/tests/agent/test_hook_composite.py +402 -0
  319. durin_agent-0.1.0a1/tests/agent/test_loop_consolidation_tokens.py +261 -0
  320. durin_agent-0.1.0a1/tests/agent/test_loop_cron_timezone.py +27 -0
  321. durin_agent-0.1.0a1/tests/agent/test_loop_goal_wall_timeout.py +46 -0
  322. durin_agent-0.1.0a1/tests/agent/test_loop_image_generation_media.py +89 -0
  323. durin_agent-0.1.0a1/tests/agent/test_loop_progress.py +381 -0
  324. durin_agent-0.1.0a1/tests/agent/test_loop_runner_integration.py +301 -0
  325. durin_agent-0.1.0a1/tests/agent/test_loop_save_turn.py +953 -0
  326. durin_agent-0.1.0a1/tests/agent/test_loop_tool_context.py +89 -0
  327. durin_agent-0.1.0a1/tests/agent/test_max_messages_config.py +159 -0
  328. durin_agent-0.1.0a1/tests/agent/test_mcp_connection.py +44 -0
  329. durin_agent-0.1.0a1/tests/agent/test_mcp_transient_retry.py +368 -0
  330. durin_agent-0.1.0a1/tests/agent/test_memory_store.py +421 -0
  331. durin_agent-0.1.0a1/tests/agent/test_onboard_logic.py +1076 -0
  332. durin_agent-0.1.0a1/tests/agent/test_preemptive_compaction.py +232 -0
  333. durin_agent-0.1.0a1/tests/agent/test_runner_compaction_grace.py +225 -0
  334. durin_agent-0.1.0a1/tests/agent/test_runner_core.py +533 -0
  335. durin_agent-0.1.0a1/tests/agent/test_runner_errors.py +175 -0
  336. durin_agent-0.1.0a1/tests/agent/test_runner_fallback.py +613 -0
  337. durin_agent-0.1.0a1/tests/agent/test_runner_governance.py +643 -0
  338. durin_agent-0.1.0a1/tests/agent/test_runner_history_media_prune_telemetry.py +110 -0
  339. durin_agent-0.1.0a1/tests/agent/test_runner_hooks.py +189 -0
  340. durin_agent-0.1.0a1/tests/agent/test_runner_idle_timeout_breaker.py +298 -0
  341. durin_agent-0.1.0a1/tests/agent/test_runner_injections.py +1038 -0
  342. durin_agent-0.1.0a1/tests/agent/test_runner_mid_turn_precheck.py +227 -0
  343. durin_agent-0.1.0a1/tests/agent/test_runner_persistence.py +161 -0
  344. durin_agent-0.1.0a1/tests/agent/test_runner_post_compaction_guard.py +213 -0
  345. durin_agent-0.1.0a1/tests/agent/test_runner_progress_deltas.py +79 -0
  346. durin_agent-0.1.0a1/tests/agent/test_runner_reasoning.py +371 -0
  347. durin_agent-0.1.0a1/tests/agent/test_runner_safety.py +244 -0
  348. durin_agent-0.1.0a1/tests/agent/test_runner_tool_execution.py +493 -0
  349. durin_agent-0.1.0a1/tests/agent/test_runner_tool_result_validation.py +123 -0
  350. durin_agent-0.1.0a1/tests/agent/test_runner_turn_budget.py +228 -0
  351. durin_agent-0.1.0a1/tests/agent/test_runner_unknown_tool_guard.py +206 -0
  352. durin_agent-0.1.0a1/tests/agent/test_runtime_refresh.py +49 -0
  353. durin_agent-0.1.0a1/tests/agent/test_self_model_preset.py +294 -0
  354. durin_agent-0.1.0a1/tests/agent/test_session_atomic.py +263 -0
  355. durin_agent-0.1.0a1/tests/agent/test_session_delete.py +65 -0
  356. durin_agent-0.1.0a1/tests/agent/test_session_manager_history.py +475 -0
  357. durin_agent-0.1.0a1/tests/agent/test_session_media_persist.py +34 -0
  358. durin_agent-0.1.0a1/tests/agent/test_skill_creator_scripts.py +127 -0
  359. durin_agent-0.1.0a1/tests/agent/test_skills_loader.py +495 -0
  360. durin_agent-0.1.0a1/tests/agent/test_stop_preserves_context.py +165 -0
  361. durin_agent-0.1.0a1/tests/agent/test_subagent.py +53 -0
  362. durin_agent-0.1.0a1/tests/agent/test_subagent_lifecycle.py +577 -0
  363. durin_agent-0.1.0a1/tests/agent/test_task_cancel.py +504 -0
  364. durin_agent-0.1.0a1/tests/agent/test_tool_hint.py +308 -0
  365. durin_agent-0.1.0a1/tests/agent/test_tool_loader_entrypoints.py +76 -0
  366. durin_agent-0.1.0a1/tests/agent/test_tool_loader_scopes.py +77 -0
  367. durin_agent-0.1.0a1/tests/agent/test_tool_telemetry_extras.py +287 -0
  368. durin_agent-0.1.0a1/tests/agent/test_unified_session.py +506 -0
  369. durin_agent-0.1.0a1/tests/agent/tools/__init__.py +0 -0
  370. durin_agent-0.1.0a1/tests/agent/tools/test_ask_user.py +141 -0
  371. durin_agent-0.1.0a1/tests/agent/tools/test_interpret_audio.py +240 -0
  372. durin_agent-0.1.0a1/tests/agent/tools/test_interpret_image.py +204 -0
  373. durin_agent-0.1.0a1/tests/agent/tools/test_long_task.py +155 -0
  374. durin_agent-0.1.0a1/tests/agent/tools/test_self_tool.py +1117 -0
  375. durin_agent-0.1.0a1/tests/agent/tools/test_self_tool_runtime_sync.py +29 -0
  376. durin_agent-0.1.0a1/tests/agent/tools/test_session_search.py +201 -0
  377. durin_agent-0.1.0a1/tests/agent/tools/test_sleep.py +94 -0
  378. durin_agent-0.1.0a1/tests/agent/tools/test_subagent_lifecycle.py +561 -0
  379. durin_agent-0.1.0a1/tests/agent/tools/test_subagent_tools.py +448 -0
  380. durin_agent-0.1.0a1/tests/agent/tools/test_todo_write.py +119 -0
  381. durin_agent-0.1.0a1/tests/channels/test_base_channel.py +95 -0
  382. durin_agent-0.1.0a1/tests/channels/test_channel_manager_delta_coalescing.py +440 -0
  383. durin_agent-0.1.0a1/tests/channels/test_channel_manager_reasoning.py +228 -0
  384. durin_agent-0.1.0a1/tests/channels/test_channel_plugins.py +1285 -0
  385. durin_agent-0.1.0a1/tests/channels/test_dingtalk_channel.py +703 -0
  386. durin_agent-0.1.0a1/tests/channels/test_discord_channel.py +1315 -0
  387. durin_agent-0.1.0a1/tests/channels/test_email_channel.py +1003 -0
  388. durin_agent-0.1.0a1/tests/channels/test_feishu_domain.py +48 -0
  389. durin_agent-0.1.0a1/tests/channels/test_feishu_markdown_rendering.py +68 -0
  390. durin_agent-0.1.0a1/tests/channels/test_feishu_media_filename_security.py +38 -0
  391. durin_agent-0.1.0a1/tests/channels/test_feishu_mention.py +62 -0
  392. durin_agent-0.1.0a1/tests/channels/test_feishu_mentions.py +59 -0
  393. durin_agent-0.1.0a1/tests/channels/test_feishu_post_content.py +76 -0
  394. durin_agent-0.1.0a1/tests/channels/test_feishu_reaction.py +315 -0
  395. durin_agent-0.1.0a1/tests/channels/test_feishu_reply.py +1050 -0
  396. durin_agent-0.1.0a1/tests/channels/test_feishu_streaming.py +580 -0
  397. durin_agent-0.1.0a1/tests/channels/test_feishu_table_split.py +115 -0
  398. durin_agent-0.1.0a1/tests/channels/test_feishu_tool_hint_code_block.py +214 -0
  399. durin_agent-0.1.0a1/tests/channels/test_matrix_channel.py +1776 -0
  400. durin_agent-0.1.0a1/tests/channels/test_qq_ack_message.py +172 -0
  401. durin_agent-0.1.0a1/tests/channels/test_qq_channel.py +393 -0
  402. durin_agent-0.1.0a1/tests/channels/test_qq_media.py +333 -0
  403. durin_agent-0.1.0a1/tests/channels/test_slack_channel.py +657 -0
  404. durin_agent-0.1.0a1/tests/channels/test_telegram_channel.py +1855 -0
  405. durin_agent-0.1.0a1/tests/channels/test_websocket_channel.py +1505 -0
  406. durin_agent-0.1.0a1/tests/channels/test_websocket_envelope_media.py +420 -0
  407. durin_agent-0.1.0a1/tests/channels/test_websocket_http_routes.py +544 -0
  408. durin_agent-0.1.0a1/tests/channels/test_websocket_integration.py +518 -0
  409. durin_agent-0.1.0a1/tests/channels/test_websocket_media_route.py +380 -0
  410. durin_agent-0.1.0a1/tests/channels/test_wecom_channel.py +680 -0
  411. durin_agent-0.1.0a1/tests/channels/test_weixin_channel.py +1256 -0
  412. durin_agent-0.1.0a1/tests/channels/test_whatsapp_channel.py +379 -0
  413. durin_agent-0.1.0a1/tests/channels/ws_test_client.py +227 -0
  414. durin_agent-0.1.0a1/tests/cli/test_bot_identity.py +65 -0
  415. durin_agent-0.1.0a1/tests/cli/test_cli_input.py +349 -0
  416. durin_agent-0.1.0a1/tests/cli/test_commands.py +1737 -0
  417. durin_agent-0.1.0a1/tests/cli/test_completers.py +132 -0
  418. durin_agent-0.1.0a1/tests/cli/test_config_cmd.py +230 -0
  419. durin_agent-0.1.0a1/tests/cli/test_doctor_cmd.py +278 -0
  420. durin_agent-0.1.0a1/tests/cli/test_dragdrop.py +163 -0
  421. durin_agent-0.1.0a1/tests/cli/test_footer.py +170 -0
  422. durin_agent-0.1.0a1/tests/cli/test_interactive_retry_wait.py +132 -0
  423. durin_agent-0.1.0a1/tests/cli/test_restart_command.py +345 -0
  424. durin_agent-0.1.0a1/tests/cli/test_safe_file_history.py +72 -0
  425. durin_agent-0.1.0a1/tests/cli/test_uninstall_cmd.py +195 -0
  426. durin_agent-0.1.0a1/tests/cli/test_upgrade_cmd.py +148 -0
  427. durin_agent-0.1.0a1/tests/cli/tui/__init__.py +0 -0
  428. durin_agent-0.1.0a1/tests/cli/tui/test_app_scaffolding.py +37 -0
  429. durin_agent-0.1.0a1/tests/cli/tui/test_at_file_suggester.py +108 -0
  430. durin_agent-0.1.0a1/tests/cli/tui/test_d3_editor.py +143 -0
  431. durin_agent-0.1.0a1/tests/cli/tui/test_dragdrop_and_bindings.py +149 -0
  432. durin_agent-0.1.0a1/tests/cli/tui/test_layout_widgets.py +131 -0
  433. durin_agent-0.1.0a1/tests/cli/tui/test_modal_pickers.py +261 -0
  434. durin_agent-0.1.0a1/tests/cli/tui/test_shell_paste.py +61 -0
  435. durin_agent-0.1.0a1/tests/cli/tui/test_slash_commands.py +116 -0
  436. durin_agent-0.1.0a1/tests/cli/tui/test_streaming.py +156 -0
  437. durin_agent-0.1.0a1/tests/command/test_builtin_dream.py +143 -0
  438. durin_agent-0.1.0a1/tests/command/test_d1_commands.py +333 -0
  439. durin_agent-0.1.0a1/tests/command/test_d2_commands.py +284 -0
  440. durin_agent-0.1.0a1/tests/command/test_mode_commands.py +389 -0
  441. durin_agent-0.1.0a1/tests/command/test_model_command.py +192 -0
  442. durin_agent-0.1.0a1/tests/command/test_router_dispatchable.py +231 -0
  443. durin_agent-0.1.0a1/tests/config/test_config_migration.py +225 -0
  444. durin_agent-0.1.0a1/tests/config/test_config_paths.py +49 -0
  445. durin_agent-0.1.0a1/tests/config/test_dream_config.py +48 -0
  446. durin_agent-0.1.0a1/tests/config/test_env_interpolation.py +129 -0
  447. durin_agent-0.1.0a1/tests/config/test_model_presets.py +194 -0
  448. durin_agent-0.1.0a1/tests/cron/test_cron_persistence.py +166 -0
  449. durin_agent-0.1.0a1/tests/cron/test_cron_service.py +629 -0
  450. durin_agent-0.1.0a1/tests/cron/test_cron_tool_list.py +414 -0
  451. durin_agent-0.1.0a1/tests/cron/test_cron_tool_schema_contract.py +100 -0
  452. durin_agent-0.1.0a1/tests/cron/test_cron_tool_update.py +180 -0
  453. durin_agent-0.1.0a1/tests/heartbeat/test_heartbeat_context_bridge.py +120 -0
  454. durin_agent-0.1.0a1/tests/heartbeat/test_heartbeat_deliverability.py +230 -0
  455. durin_agent-0.1.0a1/tests/integration/__init__.py +0 -0
  456. durin_agent-0.1.0a1/tests/integration/test_defensive_guards_e2e.py +528 -0
  457. durin_agent-0.1.0a1/tests/memory/__init__.py +0 -0
  458. durin_agent-0.1.0a1/tests/memory/test_consolidator_tags.py +211 -0
  459. durin_agent-0.1.0a1/tests/memory/test_drill.py +165 -0
  460. durin_agent-0.1.0a1/tests/memory/test_embedding.py +233 -0
  461. durin_agent-0.1.0a1/tests/memory/test_hot_layer.py +126 -0
  462. durin_agent-0.1.0a1/tests/memory/test_ingestion.py +166 -0
  463. durin_agent-0.1.0a1/tests/memory/test_paths.py +63 -0
  464. durin_agent-0.1.0a1/tests/memory/test_phase2_smoke.py +229 -0
  465. durin_agent-0.1.0a1/tests/memory/test_provenance.py +88 -0
  466. durin_agent-0.1.0a1/tests/memory/test_search.py +243 -0
  467. durin_agent-0.1.0a1/tests/memory/test_search_vector_path.py +245 -0
  468. durin_agent-0.1.0a1/tests/memory/test_session_md.py +216 -0
  469. durin_agent-0.1.0a1/tests/memory/test_smoke_end_to_end.py +133 -0
  470. durin_agent-0.1.0a1/tests/memory/test_storage.py +176 -0
  471. durin_agent-0.1.0a1/tests/memory/test_store.py +154 -0
  472. durin_agent-0.1.0a1/tests/memory/test_vector_index.py +236 -0
  473. durin_agent-0.1.0a1/tests/pairing/test_store.py +178 -0
  474. durin_agent-0.1.0a1/tests/providers/test_anthropic_long_request_fallback.py +104 -0
  475. durin_agent-0.1.0a1/tests/providers/test_anthropic_merge_consecutive.py +139 -0
  476. durin_agent-0.1.0a1/tests/providers/test_anthropic_stream_idle.py +149 -0
  477. durin_agent-0.1.0a1/tests/providers/test_anthropic_thinking.py +92 -0
  478. durin_agent-0.1.0a1/tests/providers/test_anthropic_tool_result.py +57 -0
  479. durin_agent-0.1.0a1/tests/providers/test_azure_openai_provider.py +423 -0
  480. durin_agent-0.1.0a1/tests/providers/test_bedrock_provider.py +288 -0
  481. durin_agent-0.1.0a1/tests/providers/test_cached_tokens.py +233 -0
  482. durin_agent-0.1.0a1/tests/providers/test_capabilities.py +315 -0
  483. durin_agent-0.1.0a1/tests/providers/test_custom_provider.py +73 -0
  484. durin_agent-0.1.0a1/tests/providers/test_enforce_role_alternation.py +240 -0
  485. durin_agent-0.1.0a1/tests/providers/test_extra_body_config.py +214 -0
  486. durin_agent-0.1.0a1/tests/providers/test_image_generation.py +204 -0
  487. durin_agent-0.1.0a1/tests/providers/test_litellm_kwargs.py +1263 -0
  488. durin_agent-0.1.0a1/tests/providers/test_llm_response.py +57 -0
  489. durin_agent-0.1.0a1/tests/providers/test_local_endpoint_detection.py +118 -0
  490. durin_agent-0.1.0a1/tests/providers/test_longcat_provider.py +29 -0
  491. durin_agent-0.1.0a1/tests/providers/test_minimax_anthropic_provider.py +21 -0
  492. durin_agent-0.1.0a1/tests/providers/test_mistral_provider.py +20 -0
  493. durin_agent-0.1.0a1/tests/providers/test_openai_compat_timeout.py +53 -0
  494. durin_agent-0.1.0a1/tests/providers/test_openai_responses.py +522 -0
  495. durin_agent-0.1.0a1/tests/providers/test_parallel_tool_calls_overrides.py +229 -0
  496. durin_agent-0.1.0a1/tests/providers/test_prompt_cache_markers.py +87 -0
  497. durin_agent-0.1.0a1/tests/providers/test_provider_error_metadata.py +81 -0
  498. durin_agent-0.1.0a1/tests/providers/test_provider_retry.py +612 -0
  499. durin_agent-0.1.0a1/tests/providers/test_provider_retry_after_hints.py +42 -0
  500. durin_agent-0.1.0a1/tests/providers/test_provider_sdk_retry_defaults.py +33 -0
  501. durin_agent-0.1.0a1/tests/providers/test_providers_init.py +48 -0
  502. durin_agent-0.1.0a1/tests/providers/test_reasoning_content.py +128 -0
  503. durin_agent-0.1.0a1/tests/providers/test_responses_circuit_breaker.py +77 -0
  504. durin_agent-0.1.0a1/tests/providers/test_stepfun_reasoning.py +298 -0
  505. durin_agent-0.1.0a1/tests/providers/test_transcription.py +292 -0
  506. durin_agent-0.1.0a1/tests/providers/test_xiaomi_mimo_thinking.py +202 -0
  507. durin_agent-0.1.0a1/tests/scripts/__init__.py +0 -0
  508. durin_agent-0.1.0a1/tests/scripts/test_vendor_sources.py +433 -0
  509. durin_agent-0.1.0a1/tests/security/test_security_network.py +145 -0
  510. durin_agent-0.1.0a1/tests/session/__init__.py +0 -0
  511. durin_agent-0.1.0a1/tests/session/test_goal_state.py +131 -0
  512. durin_agent-0.1.0a1/tests/session/test_metadata_split.py +324 -0
  513. durin_agent-0.1.0a1/tests/session/test_session_fsync.py +130 -0
  514. durin_agent-0.1.0a1/tests/session/test_session_meta.py +388 -0
  515. durin_agent-0.1.0a1/tests/session/test_todo_state.py +126 -0
  516. durin_agent-0.1.0a1/tests/session/test_tool_call_meta_events.py +210 -0
  517. durin_agent-0.1.0a1/tests/telemetry/__init__.py +0 -0
  518. durin_agent-0.1.0a1/tests/telemetry/test_logger.py +82 -0
  519. durin_agent-0.1.0a1/tests/telemetry/test_schema_catalog.py +131 -0
  520. durin_agent-0.1.0a1/tests/test_api_attachment.py +496 -0
  521. durin_agent-0.1.0a1/tests/test_api_stream.py +363 -0
  522. durin_agent-0.1.0a1/tests/test_build_status.py +92 -0
  523. durin_agent-0.1.0a1/tests/test_context_documents.py +113 -0
  524. durin_agent-0.1.0a1/tests/test_docker.sh +56 -0
  525. durin_agent-0.1.0a1/tests/test_document_parsing.py +316 -0
  526. durin_agent-0.1.0a1/tests/test_msteams.py +888 -0
  527. durin_agent-0.1.0a1/tests/test_openai_api.py +427 -0
  528. durin_agent-0.1.0a1/tests/test_package_version.py +35 -0
  529. durin_agent-0.1.0a1/tests/test_prompt_tokens_anchor.py +172 -0
  530. durin_agent-0.1.0a1/tests/test_tool_contextvars.py +242 -0
  531. durin_agent-0.1.0a1/tests/test_truncate_direction.py +111 -0
  532. durin_agent-0.1.0a1/tests/test_truncate_text_shadowing.py +31 -0
  533. durin_agent-0.1.0a1/tests/tools/__init__.py +0 -0
  534. durin_agent-0.1.0a1/tests/tools/test_edit_advanced.py +423 -0
  535. durin_agent-0.1.0a1/tests/tools/test_edit_block_anchor.py +267 -0
  536. durin_agent-0.1.0a1/tests/tools/test_edit_enhancements.py +156 -0
  537. durin_agent-0.1.0a1/tests/tools/test_exec_allow_patterns.py +58 -0
  538. durin_agent-0.1.0a1/tests/tools/test_exec_env.py +148 -0
  539. durin_agent-0.1.0a1/tests/tools/test_exec_platform.py +347 -0
  540. durin_agent-0.1.0a1/tests/tools/test_exec_security.py +286 -0
  541. durin_agent-0.1.0a1/tests/tools/test_filesystem_tools.py +409 -0
  542. durin_agent-0.1.0a1/tests/tools/test_image_generation_tool.py +154 -0
  543. durin_agent-0.1.0a1/tests/tools/test_mcp_probe.py +106 -0
  544. durin_agent-0.1.0a1/tests/tools/test_mcp_tool.py +912 -0
  545. durin_agent-0.1.0a1/tests/tools/test_message_tool.py +437 -0
  546. durin_agent-0.1.0a1/tests/tools/test_message_tool_suppress.py +179 -0
  547. durin_agent-0.1.0a1/tests/tools/test_notebook_tool.py +147 -0
  548. durin_agent-0.1.0a1/tests/tools/test_output_spill.py +169 -0
  549. durin_agent-0.1.0a1/tests/tools/test_plan_mode_tools.py +261 -0
  550. durin_agent-0.1.0a1/tests/tools/test_read_enhancements.py +477 -0
  551. durin_agent-0.1.0a1/tests/tools/test_repo_overview.py +194 -0
  552. durin_agent-0.1.0a1/tests/tools/test_sandbox.py +121 -0
  553. durin_agent-0.1.0a1/tests/tools/test_search_tools.py +307 -0
  554. durin_agent-0.1.0a1/tests/tools/test_tool_loader.py +413 -0
  555. durin_agent-0.1.0a1/tests/tools/test_tool_registry.py +103 -0
  556. durin_agent-0.1.0a1/tests/tools/test_tool_telemetry.py +228 -0
  557. durin_agent-0.1.0a1/tests/tools/test_tool_validation.py +704 -0
  558. durin_agent-0.1.0a1/tests/tools/test_web_fetch_security.py +175 -0
  559. durin_agent-0.1.0a1/tests/tools/test_web_fetch_url_sanitization.py +157 -0
  560. durin_agent-0.1.0a1/tests/tools/test_web_search_tool.py +427 -0
  561. durin_agent-0.1.0a1/tests/utils/test_abbreviate_path.py +105 -0
  562. durin_agent-0.1.0a1/tests/utils/test_artifacts.py +87 -0
  563. durin_agent-0.1.0a1/tests/utils/test_gitstore.py +216 -0
  564. durin_agent-0.1.0a1/tests/utils/test_history_image_prune.py +248 -0
  565. durin_agent-0.1.0a1/tests/utils/test_image_generation_intent.py +25 -0
  566. durin_agent-0.1.0a1/tests/utils/test_media_decode.py +75 -0
  567. durin_agent-0.1.0a1/tests/utils/test_post_compaction_guard.py +188 -0
  568. durin_agent-0.1.0a1/tests/utils/test_restart.py +78 -0
  569. durin_agent-0.1.0a1/tests/utils/test_searchusage.py +306 -0
  570. durin_agent-0.1.0a1/tests/utils/test_strip_think.py +273 -0
  571. durin_agent-0.1.0a1/tests/utils/test_subagent_channel_display.py +57 -0
  572. durin_agent-0.1.0a1/tests/utils/test_token_estimation.py +32 -0
  573. durin_agent-0.1.0a1/tests/utils/test_tool_argument_repair.py +209 -0
  574. durin_agent-0.1.0a1/tests/utils/test_tool_result_validation.py +153 -0
  575. durin_agent-0.1.0a1/tests/utils/test_webui_thread_disk.py +20 -0
  576. durin_agent-0.1.0a1/tests/utils/test_webui_transcript.py +55 -0
  577. durin_agent-0.1.0a1/tests/utils/test_webui_turn_helpers.py +55 -0
  578. durin_agent-0.1.0a1/tests/utils/test_workspace_violation_throttle.py +120 -0
  579. durin_agent-0.1.0a1/webui/.gitignore +8 -0
  580. durin_agent-0.1.0a1/webui/README.md +116 -0
  581. durin_agent-0.1.0a1/webui/bun.lock +961 -0
  582. durin_agent-0.1.0a1/webui/components.json +20 -0
  583. durin_agent-0.1.0a1/webui/index.html +186 -0
  584. durin_agent-0.1.0a1/webui/package-lock.json +5309 -0
  585. durin_agent-0.1.0a1/webui/package.json +57 -0
  586. durin_agent-0.1.0a1/webui/postcss.config.js +6 -0
  587. durin_agent-0.1.0a1/webui/public/brand/durin_apple_touch.png +0 -0
  588. durin_agent-0.1.0a1/webui/public/brand/durin_favicon_32.png +0 -0
  589. durin_agent-0.1.0a1/webui/public/brand/durin_icon.png +0 -0
  590. durin_agent-0.1.0a1/webui/public/brand/durin_logo.png +0 -0
  591. durin_agent-0.1.0a1/webui/public/brand/durin_logo.webp +0 -0
  592. durin_agent-0.1.0a1/webui/src/App.tsx +507 -0
  593. durin_agent-0.1.0a1/webui/src/components/ChatList.tsx +150 -0
  594. durin_agent-0.1.0a1/webui/src/components/CodeBlock.tsx +105 -0
  595. durin_agent-0.1.0a1/webui/src/components/Composer.tsx +124 -0
  596. durin_agent-0.1.0a1/webui/src/components/ConnectionBadge.tsx +56 -0
  597. durin_agent-0.1.0a1/webui/src/components/DeleteConfirm.tsx +63 -0
  598. durin_agent-0.1.0a1/webui/src/components/EmptyState.tsx +26 -0
  599. durin_agent-0.1.0a1/webui/src/components/ImageLightbox.tsx +199 -0
  600. durin_agent-0.1.0a1/webui/src/components/LanguageSwitcher.tsx +67 -0
  601. durin_agent-0.1.0a1/webui/src/components/MarkdownText.tsx +39 -0
  602. durin_agent-0.1.0a1/webui/src/components/MarkdownTextRenderer.tsx +121 -0
  603. durin_agent-0.1.0a1/webui/src/components/MessageBubble.tsx +666 -0
  604. durin_agent-0.1.0a1/webui/src/components/MessageList.tsx +109 -0
  605. durin_agent-0.1.0a1/webui/src/components/Sidebar.tsx +134 -0
  606. durin_agent-0.1.0a1/webui/src/components/settings/SettingsView.tsx +1288 -0
  607. durin_agent-0.1.0a1/webui/src/components/thread/AgentActivityCluster.tsx +166 -0
  608. durin_agent-0.1.0a1/webui/src/components/thread/StreamErrorNotice.tsx +72 -0
  609. durin_agent-0.1.0a1/webui/src/components/thread/ThreadComposer.tsx +1215 -0
  610. durin_agent-0.1.0a1/webui/src/components/thread/ThreadHeader.tsx +96 -0
  611. durin_agent-0.1.0a1/webui/src/components/thread/ThreadMessages.tsx +119 -0
  612. durin_agent-0.1.0a1/webui/src/components/thread/ThreadShell.tsx +395 -0
  613. durin_agent-0.1.0a1/webui/src/components/thread/ThreadViewport.tsx +204 -0
  614. durin_agent-0.1.0a1/webui/src/components/ui/alert-dialog.tsx +135 -0
  615. durin_agent-0.1.0a1/webui/src/components/ui/avatar.tsx +48 -0
  616. durin_agent-0.1.0a1/webui/src/components/ui/button.tsx +56 -0
  617. durin_agent-0.1.0a1/webui/src/components/ui/dialog.tsx +116 -0
  618. durin_agent-0.1.0a1/webui/src/components/ui/dropdown-menu.tsx +177 -0
  619. durin_agent-0.1.0a1/webui/src/components/ui/input.tsx +24 -0
  620. durin_agent-0.1.0a1/webui/src/components/ui/scroll-area.tsx +46 -0
  621. durin_agent-0.1.0a1/webui/src/components/ui/separator.tsx +29 -0
  622. durin_agent-0.1.0a1/webui/src/components/ui/sheet.tsx +113 -0
  623. durin_agent-0.1.0a1/webui/src/components/ui/textarea.tsx +23 -0
  624. durin_agent-0.1.0a1/webui/src/components/ui/tooltip.tsx +26 -0
  625. durin_agent-0.1.0a1/webui/src/globals.css +228 -0
  626. durin_agent-0.1.0a1/webui/src/hooks/useAttachedImages.ts +233 -0
  627. durin_agent-0.1.0a1/webui/src/hooks/useClipboardAndDrop.ts +111 -0
  628. durin_agent-0.1.0a1/webui/src/hooks/useDurinStream.ts +568 -0
  629. durin_agent-0.1.0a1/webui/src/hooks/useSessions.ts +245 -0
  630. durin_agent-0.1.0a1/webui/src/hooks/useTheme.ts +48 -0
  631. durin_agent-0.1.0a1/webui/src/i18n/config.ts +93 -0
  632. durin_agent-0.1.0a1/webui/src/i18n/index.ts +72 -0
  633. durin_agent-0.1.0a1/webui/src/i18n/locales/en/common.json +383 -0
  634. durin_agent-0.1.0a1/webui/src/i18n/locales/es/common.json +349 -0
  635. durin_agent-0.1.0a1/webui/src/i18n/locales/fr/common.json +349 -0
  636. durin_agent-0.1.0a1/webui/src/i18n/locales/id/common.json +349 -0
  637. durin_agent-0.1.0a1/webui/src/i18n/locales/ja/common.json +349 -0
  638. durin_agent-0.1.0a1/webui/src/i18n/locales/ko/common.json +349 -0
  639. durin_agent-0.1.0a1/webui/src/i18n/locales/vi/common.json +349 -0
  640. durin_agent-0.1.0a1/webui/src/i18n/locales/zh-CN/common.json +371 -0
  641. durin_agent-0.1.0a1/webui/src/i18n/locales/zh-TW/common.json +349 -0
  642. durin_agent-0.1.0a1/webui/src/lib/api.ts +167 -0
  643. durin_agent-0.1.0a1/webui/src/lib/bootstrap.ts +76 -0
  644. durin_agent-0.1.0a1/webui/src/lib/durin-client.ts +482 -0
  645. durin_agent-0.1.0a1/webui/src/lib/format.ts +107 -0
  646. durin_agent-0.1.0a1/webui/src/lib/imageEncode.ts +97 -0
  647. durin_agent-0.1.0a1/webui/src/lib/media.ts +59 -0
  648. durin_agent-0.1.0a1/webui/src/lib/subagent-channel-display.ts +59 -0
  649. durin_agent-0.1.0a1/webui/src/lib/thread-display-compat.ts +22 -0
  650. durin_agent-0.1.0a1/webui/src/lib/tool-traces.ts +51 -0
  651. durin_agent-0.1.0a1/webui/src/lib/types.ts +296 -0
  652. durin_agent-0.1.0a1/webui/src/lib/utils.ts +6 -0
  653. durin_agent-0.1.0a1/webui/src/main.tsx +27 -0
  654. durin_agent-0.1.0a1/webui/src/providers/ClientProvider.tsx +37 -0
  655. durin_agent-0.1.0a1/webui/src/tests/api.test.ts +158 -0
  656. durin_agent-0.1.0a1/webui/src/tests/app-layout.test.tsx +429 -0
  657. durin_agent-0.1.0a1/webui/src/tests/durin-client.test.ts +467 -0
  658. durin_agent-0.1.0a1/webui/src/tests/format.i18n.test.ts +82 -0
  659. durin_agent-0.1.0a1/webui/src/tests/i18n.test.tsx +90 -0
  660. durin_agent-0.1.0a1/webui/src/tests/main-randomuuid.test.tsx +42 -0
  661. durin_agent-0.1.0a1/webui/src/tests/message-bubble.test.tsx +202 -0
  662. durin_agent-0.1.0a1/webui/src/tests/setup.ts +24 -0
  663. durin_agent-0.1.0a1/webui/src/tests/subagent-channel-display.test.ts +41 -0
  664. durin_agent-0.1.0a1/webui/src/tests/thread-composer-attach.test.tsx +173 -0
  665. durin_agent-0.1.0a1/webui/src/tests/thread-composer.test.tsx +326 -0
  666. durin_agent-0.1.0a1/webui/src/tests/thread-display-compat.test.ts +20 -0
  667. durin_agent-0.1.0a1/webui/src/tests/thread-messages.test.tsx +92 -0
  668. durin_agent-0.1.0a1/webui/src/tests/thread-shell.test.tsx +951 -0
  669. durin_agent-0.1.0a1/webui/src/tests/thread-viewport.test.tsx +164 -0
  670. durin_agent-0.1.0a1/webui/src/tests/useDurinStream.test.tsx +845 -0
  671. durin_agent-0.1.0a1/webui/src/tests/useSessions.test.tsx +349 -0
  672. durin_agent-0.1.0a1/webui/src/workers/imageEncode.worker.ts +264 -0
  673. durin_agent-0.1.0a1/webui/tailwind.config.js +109 -0
  674. durin_agent-0.1.0a1/webui/tsconfig.build.json +7 -0
  675. durin_agent-0.1.0a1/webui/tsconfig.json +32 -0
  676. durin_agent-0.1.0a1/webui/vite.config.ts +65 -0
@@ -0,0 +1,36 @@
1
+ name: CI
2
+
3
+ # Run the test suite on every PR and on pushes to main.
4
+ # Keep this fast and focused — the goal is "don't ship broken main";
5
+ # heavier integration tests can live in a separate workflow if needed.
6
+
7
+ on:
8
+ pull_request:
9
+ push:
10
+ branches:
11
+ - main
12
+
13
+ concurrency:
14
+ group: ci-${{ github.ref }}
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ test:
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+
23
+ - uses: actions/setup-python@v5
24
+ with:
25
+ python-version: "3.11"
26
+ cache: pip
27
+
28
+ - name: Install durin + dev extras
29
+ run: |
30
+ python -m pip install --upgrade pip
31
+ # Skip the webui bundle — CI doesn't need it and it would force
32
+ # bun/npm onto the runner just for tests.
33
+ DURIN_SKIP_WEBUI_BUILD=1 pip install -e ".[dev]"
34
+
35
+ - name: Run unit tests
36
+ run: pytest tests/ -q --maxfail=5
@@ -0,0 +1,105 @@
1
+ name: Release
2
+
3
+ # Builds an sdist + wheel on every tag of the form `vX.Y.Z[aN|bN|rcN]`,
4
+ # uploads them to a GitHub Release, then publishes to PyPI via OIDC
5
+ # trusted publishing (no API token required on the repo side).
6
+ #
7
+ # See docs/RELEASING.md for the maintainer workflow.
8
+
9
+ on:
10
+ push:
11
+ tags:
12
+ - "v[0-9]+.[0-9]+.[0-9]+*"
13
+
14
+ permissions:
15
+ contents: write # for creating the GitHub Release + attaching artifacts
16
+ id-token: write # for PyPI OIDC trusted publishing
17
+
18
+ jobs:
19
+ build:
20
+ runs-on: ubuntu-latest
21
+ outputs:
22
+ version: ${{ steps.meta.outputs.version }}
23
+ prerelease: ${{ steps.meta.outputs.prerelease }}
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+ with:
27
+ fetch-depth: 0
28
+
29
+ - uses: actions/setup-python@v5
30
+ with:
31
+ python-version: "3.11"
32
+
33
+ - name: Install bun (needed for the webui build hook)
34
+ uses: oven-sh/setup-bun@v2
35
+
36
+ - name: Install build dependencies
37
+ run: |
38
+ python -m pip install --upgrade pip
39
+ python -m pip install --upgrade build
40
+
41
+ - name: Verify version matches the tag
42
+ id: meta
43
+ run: |
44
+ TAG="${GITHUB_REF#refs/tags/v}"
45
+ PROJECT_VERSION=$(python -c "import tomllib,pathlib;print(tomllib.loads(pathlib.Path('pyproject.toml').read_text())['project']['version'])")
46
+ echo "tag=$TAG"
47
+ echo "pyproject=$PROJECT_VERSION"
48
+ if [ "$TAG" != "$PROJECT_VERSION" ]; then
49
+ echo "::error::Tag ($TAG) does not match pyproject version ($PROJECT_VERSION). Bump pyproject.toml before tagging."
50
+ exit 1
51
+ fi
52
+ echo "version=$TAG" >> "$GITHUB_OUTPUT"
53
+ # PEP 440 pre-releases contain a/b/rc/dev.
54
+ if echo "$TAG" | grep -Eq '(a|b|rc|dev)[0-9]+'; then
55
+ echo "prerelease=true" >> "$GITHUB_OUTPUT"
56
+ else
57
+ echo "prerelease=false" >> "$GITHUB_OUTPUT"
58
+ fi
59
+
60
+ - name: Build sdist + wheel
61
+ run: python -m build
62
+
63
+ - name: Upload artifacts
64
+ uses: actions/upload-artifact@v4
65
+ with:
66
+ name: dist
67
+ path: dist/*
68
+ if-no-files-found: error
69
+
70
+ github-release:
71
+ needs: build
72
+ runs-on: ubuntu-latest
73
+ steps:
74
+ - uses: actions/download-artifact@v4
75
+ with:
76
+ name: dist
77
+ path: dist
78
+
79
+ - name: Create GitHub Release
80
+ uses: softprops/action-gh-release@v2
81
+ with:
82
+ files: dist/*
83
+ generate_release_notes: true
84
+ prerelease: ${{ needs.build.outputs.prerelease == 'true' }}
85
+
86
+ pypi-publish:
87
+ needs: build
88
+ runs-on: ubuntu-latest
89
+ # Skip cleanly if PyPI trusted publishing isn't configured yet.
90
+ # The GitHub Release in the sibling job is still produced.
91
+ continue-on-error: true
92
+ environment:
93
+ name: pypi
94
+ url: https://pypi.org/p/durin-agent
95
+ steps:
96
+ - uses: actions/download-artifact@v4
97
+ with:
98
+ name: dist
99
+ path: dist
100
+
101
+ - name: Publish to PyPI
102
+ uses: pypa/gh-action-pypi-publish@release/v1
103
+ with:
104
+ packages-dir: dist/
105
+ skip-existing: true
@@ -0,0 +1,57 @@
1
+ # External projects for evaluation (not part of Durin)
2
+ /vendor/
3
+
4
+ # Python
5
+ __pycache__/
6
+ *.py[cod]
7
+ *$py.class
8
+ *.so
9
+ *.egg-info/
10
+ .Python
11
+ env/
12
+ venv/
13
+ .venv/
14
+ # Build artifacts (sdist + wheel produced by `python -m build`)
15
+ /dist/
16
+ /build/
17
+
18
+ # Node / WebUI
19
+ node_modules/
20
+ webui/dist/
21
+
22
+ # IDE
23
+ .idea/
24
+ .vscode/
25
+ *.swp
26
+ *.swo
27
+
28
+ # OS
29
+ .DS_Store
30
+ Thumbs.db
31
+
32
+ # Tools
33
+ .claude
34
+ .pytest_cache
35
+
36
+ # Runtime state (not source)
37
+ /logs/
38
+ /sessions/
39
+ /memory/
40
+ /plans/
41
+ gold.*.json
42
+ *.run*.json
43
+ *.pilot_*.json
44
+
45
+ # Eval run artifacts (dumped to root by swebench_eval.py)
46
+ /durin-*.json
47
+
48
+ # Workspace runtime files (generated by agent sessions)
49
+ /AGENTS.md
50
+ /HEARTBEAT.md
51
+ /SOUL.md
52
+ /TOOLS.md
53
+ /USER.md
54
+ /MEMORY.md
55
+ # Exercism dataset (clone only)
56
+ scripts/hypothesis_test/exercism_python/
57
+ scripts/hypothesis_test/v9_runs/
@@ -0,0 +1,57 @@
1
+ Metadata-Version: 2.4
2
+ Name: durin-agent
3
+ Version: 0.1.0a1
4
+ Summary: Personal AI agent with daily-driver CLI, modal TUI, and graph-based memory
5
+ Author: Marcelo Marmol
6
+ License: MIT
7
+ Keywords: agent,ai,memory,posture
8
+ Requires-Python: >=3.11
9
+ Requires-Dist: anthropic<1.0.0,>=0.45.0
10
+ Requires-Dist: chardet<6.0.0,>=3.0.2
11
+ Requires-Dist: croniter<7.0.0,>=6.0.0
12
+ Requires-Dist: dulwich<1.0.0,>=0.22.0
13
+ Requires-Dist: filelock>=3.25.2
14
+ Requires-Dist: httpx<1.0.0,>=0.28.0
15
+ Requires-Dist: jinja2<4.0.0,>=3.1.0
16
+ Requires-Dist: json-repair<1.0.0,>=0.57.0
17
+ Requires-Dist: lark-oapi<2.0.0,>=1.4.0
18
+ Requires-Dist: litellm>=1.40.0
19
+ Requires-Dist: loguru<1.0.0,>=0.7.3
20
+ Requires-Dist: openai>=2.8.0
21
+ Requires-Dist: openpyxl<4.0.0,>=3.1.0
22
+ Requires-Dist: prompt-toolkit<4.0.0,>=3.0.50
23
+ Requires-Dist: pydantic-settings<3.0.0,>=2.12.0
24
+ Requires-Dist: pydantic<3.0.0,>=2.12.0
25
+ Requires-Dist: pypdf<6.0.0,>=5.0.0
26
+ Requires-Dist: python-docx<2.0.0,>=1.1.0
27
+ Requires-Dist: python-pptx<2.0.0,>=1.0.0
28
+ Requires-Dist: python-telegram-bot[socks]<23.0,>=22.6
29
+ Requires-Dist: pyyaml<7.0.0,>=6.0
30
+ Requires-Dist: rich<15.0.0,>=14.0.0
31
+ Requires-Dist: textual<9.0.0,>=8.2.0
32
+ Requires-Dist: tiktoken<1.0.0,>=0.12.0
33
+ Requires-Dist: typer<1.0.0,>=0.20.0
34
+ Requires-Dist: websockets<15.0,>=13.0
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest-asyncio<2.0.0,>=1.3.0; extra == 'dev'
37
+ Requires-Dist: pytest-cov<7.0.0,>=6.0.0; extra == 'dev'
38
+ Requires-Dist: pytest<10.0.0,>=9.0.0; extra == 'dev'
39
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
40
+ Provides-Extra: discord
41
+ Requires-Dist: discord-py<3.0.0,>=2.5.2; extra == 'discord'
42
+ Provides-Extra: local
43
+ Requires-Dist: huggingface-hub>=0.20.0; extra == 'local'
44
+ Requires-Dist: llama-cpp-python>=0.3.0; extra == 'local'
45
+ Provides-Extra: mcp
46
+ Requires-Dist: mcp<2.0.0,>=1.26.0; extra == 'mcp'
47
+ Provides-Extra: memory
48
+ Requires-Dist: fastembed<1.0.0,>=0.4.0; extra == 'memory'
49
+ Requires-Dist: lancedb<1.0.0,>=0.30.0; extra == 'memory'
50
+ Provides-Extra: oauth
51
+ Requires-Dist: oauth-cli-kit>=0.1.0; extra == 'oauth'
52
+ Provides-Extra: slack
53
+ Requires-Dist: slack-sdk<4.0.0,>=3.39.0; extra == 'slack'
54
+ Requires-Dist: slackify-markdown<1.0.0,>=0.2.0; extra == 'slack'
55
+ Provides-Extra: web
56
+ Requires-Dist: ddgs<10.0.0,>=9.5.5; extra == 'web'
57
+ Requires-Dist: readability-lxml<1.0.0,>=0.8.4; extra == 'web'
@@ -0,0 +1,99 @@
1
+ # 🐈 durin
2
+
3
+ Personal AI assistant with persistent posture, graph-based memory, and a daily-driver CLI.
4
+
5
+ durin runs locally, stores its state under `~/.durin/`, and talks to any LLM
6
+ backend you wire up (Z.AI, Anthropic, OpenAI, Gemini, OpenRouter, local
7
+ llama.cpp, …). The default surface is a Textual TUI; an OpenAI-compatible API
8
+ gateway and channel plugins (Telegram, Slack, WhatsApp, Discord) ship in the
9
+ same package.
10
+
11
+ ## Quick start
12
+
13
+ ```bash
14
+ # Install (no git checkout required)
15
+ pipx install --pre durin-agent # PyPI, recommended
16
+ # or, from a GitHub release wheel:
17
+ pipx install https://github.com/mmarmol/durin/releases/latest/download/durin_agent-0.1.0a1-py3-none-any.whl
18
+
19
+ durin onboard --wizard # creates ~/.durin/config.json
20
+ durin doctor # confirm setup is healthy
21
+ durin agent --tui # launches the TUI
22
+ ```
23
+
24
+ For development you can still install from a checkout:
25
+
26
+ ```bash
27
+ git clone git@github.com:mmarmol/durin.git
28
+ cd durin
29
+ python -m venv .venv && source .venv/bin/activate
30
+ pip install -e .
31
+ ```
32
+
33
+ See [docs/INSTALL.md](docs/INSTALL.md) for prerequisites, optional extras,
34
+ and platform notes. Maintainers cutting a release: [docs/RELEASING.md](docs/RELEASING.md).
35
+
36
+ ## Lifecycle commands
37
+
38
+ | Need | Command |
39
+ |---|---|
40
+ | First-time setup | `durin onboard --wizard` |
41
+ | Inspect state | `durin status` |
42
+ | Diagnose what's wrong | `durin doctor` (add `--fix` for safe auto-fixes, `--ping` for network) |
43
+ | Show config | `durin config show` |
44
+ | Read one key | `durin config get agents.defaults.model` |
45
+ | Change one key | `durin config set agents.defaults.model glm-5.1` |
46
+ | Edit config in `$EDITOR` | `durin config edit` |
47
+ | Where does state live? | `durin config path` |
48
+ | Pull the latest build | `durin upgrade` |
49
+ | Remove durin + data | `durin uninstall --purge` |
50
+
51
+ ## Day-to-day
52
+
53
+ ```bash
54
+ durin agent --tui # rich TUI (default)
55
+ durin agent -m "hola" # one-shot
56
+ durin gateway # bring up channels (Telegram, Slack, …)
57
+ durin serve # OpenAI-compatible API on :8000
58
+ ```
59
+
60
+ Inside the TUI:
61
+
62
+ - `/sessions` — modal picker over saved sessions (Esc to cancel)
63
+ - `/model` or `Ctrl+L` — modal picker over configured presets
64
+ - `/memory list|show|search|drill` — inspect the agent's memory
65
+ - `/remember <fact>` / `/forget <id>` — author memory directly
66
+ - `/compact [hint]` / `/copy` / `/name <name>` — session ergonomics
67
+ - Drag-and-drop a file path into the input to attach it
68
+ - `@<prefix>` — fuzzy-complete a workspace file
69
+ - `!cmd` / `!!cmd` — shell shortcut (publishes / silent)
70
+ - `Alt+Enter` — newline; `Enter` — submit; `Esc` — cancel turn
71
+
72
+ ## Where state lives
73
+
74
+ | Path | What |
75
+ |---|---|
76
+ | `~/.durin/config.json` | Main config |
77
+ | `~/.durin/workspace/` | Default workspace |
78
+ | `~/.durin/sessions/` | Legacy global sessions |
79
+ | `~/.durin/history/cli_history` | Shell-style input history |
80
+ | `~/.durin/cron/` | Scheduled jobs |
81
+ | `~/.durin/media/` | Channel-attached media |
82
+ | `~/.durin/bridge/` | WhatsApp bridge install |
83
+ | `~/.cache/durin/telemetry/` | JSONL telemetry per session |
84
+ | `~/.cache/durin/models/` | Downloaded local-model weights |
85
+ | `~/.cache/durin/archive/` | Archived session payloads |
86
+ | `<workspace>/.durin/{plans,spills,tool-results}/` | Per-workspace agent scratch |
87
+
88
+ `durin uninstall` enumerates these before deleting anything.
89
+
90
+ ## Documentation
91
+
92
+ - [docs/INSTALL.md](docs/INSTALL.md) — prerequisites, optional extras
93
+ - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — system layout
94
+ - [docs/09_daily_driver_plan.md](docs/09_daily_driver_plan.md) — daily-driver roadmap
95
+ - [docs/01_roadmap.md](docs/01_roadmap.md) / [docs/02_bitacora.md](docs/02_bitacora.md) — historical context
96
+
97
+ ## License
98
+
99
+ MIT
@@ -0,0 +1,216 @@
1
+ # Roadmap
2
+
3
+ > Forward plan after empirical refutation of the previous "smart layer" direction. See `02_bitacora.md` for what was discarded and why.
4
+
5
+ ---
6
+
7
+ ## Current state (post-prune, 2026-05-18)
8
+
9
+ Durin is essentially a clean Nanobot baseline plus:
10
+ - Plumbing additions (`local_llama_provider`, multi-channel work, generic telemetry skeleton)
11
+ - Empirically validated execution: basic ReAct loop + tools + sandbox + sessions
12
+ - No active "smart layer" (posture, plan tiers, deliberation V3 all removed)
13
+
14
+ The codebase is ~2,500 lines lighter and 3,052 tests pass.
15
+
16
+ ---
17
+
18
+ ## Direction: two horizons backed by industry evidence
19
+
20
+ Both directions have strong empirical or industrial precedent, unlike what we built before.
21
+
22
+ ### Horizon 1a — Role-based SOUL.md routing — REFUTED (2026-05-19)
23
+
24
+ **Status**: closed. V9e ran 107 exercises × 3 conditions (none / specific / generic_agent), `max_tokens=131072`, glm-5.1. Pass rates: 69.2% / 71.0% / 73.8% — gap of 4.6pp within the noise floor (±4.4pp for N=107). The 23 divergent exercises distribute uniformly across the 6 possible patterns (chi² = 1.78, df=5, p≫0.05), and sign-test per-condition gives p=0.41–0.68 — **statistically indistinguishable from random model variance**. Error types are nearly identical across conditions (28/30/25 AssertionError, 1/1/2 setup errors). Jaccard similarity of fail-sets is 0.57–0.61 — most failures are shared difficulty, not differentiation. See `02_bitacora.md` and `06_log_experiments.md` for full V9e analysis.
25
+
26
+ **What initially looked promising**:
27
+ - Aider's published +33–41pp on GPT-4
28
+ - PartialOrderEval +58pp on HumanEval (arxiv 2508.03678)
29
+ - Hermes Agent's +40% speedup with skill-doc loading
30
+ - Our V9 v1: +20pp specific vs none (later shown to be a `max_tokens=4096` artifact in V9d)
31
+
32
+ **What survives as a real effect**:
33
+ - **Token efficiency**: SOUL ≠ ∅ reduces median output tokens 3–5× and reasoning chars 2.84× vs no SOUL, at identical correctness. This is robust across V9d and V9e.
34
+ - The benefit comes from **any SOUL**, not from matching role-to-task. A single generic engineering SOUL captures the effect without a router.
35
+
36
+ **Why we are NOT building the router**:
37
+ - No correctness signal in the regime where our model sits (frontier reasoning, 1M context)
38
+ - The "lyrics → none / structure → generic" anecdotal pattern (N=4/3/5 in divergent cases) is well within Bernoulli noise
39
+ - A router adds infrastructure (classifier LLM call, fragment library, integration) for an effect that wasn't measured
40
+
41
+ **What we DO carry forward**:
42
+ - Set a single generic-engineering SOUL as default in Durin's `ContextBuilder`. Cheap, captures the efficiency gain, no routing.
43
+ - The divergence-pattern hypothesis remains technically open but very low expected value — confirming it would require N≥50 repeated trials per (exercise, condition) to lift signal above noise, which costs money for no actionable downstream.
44
+
45
+ ---
46
+
47
+ ### Horizon 1b — Per-query dynamic context (Aider-style retrieval)
48
+
49
+ **What this is**: context-specific information pulled from the workspace or prior conversation, packed into the user message or system prompt at the start of a turn — not a SOUL.md fragment, but *information relevant to this exact question*.
50
+
51
+ **Examples in production**:
52
+ - Aider's PageRank repo map (which symbols/files are most relevant to this query)
53
+ - Cursor's @-references and codebase indexing
54
+ - Hermes Agent's skill-doc retrieval by task similarity
55
+ - Any RAG layer at the agent boundary
56
+
57
+ **Hypothesis**:
58
+ For tasks with a non-trivial codebase or knowledge base, query-conditioned context retrieval improves outcomes beyond what a static SOUL can provide. Where SOUL routing answers "what role should the agent be?", per-query context answers "what specific information does this query need?".
59
+
60
+ **Why kept separate from 1a**:
61
+ - Different mechanism (categorical routing vs procedural retrieval)
62
+ - Different signal (task type vs specific content)
63
+ - Different storage (small fragment library vs full codebase index or memory graph)
64
+ - This converges naturally with Horizon 2 (memory): retrieval ARGUMENTS the dynamic context from past steps/milestones. The architectural pattern is the same — only the source differs (codebase vs experiential memory).
65
+
66
+ **Sequencing note**:
67
+ Horizon 1b can be implemented standalone (Aider-style repo map), but is more naturally built as a consumer of the Horizon 2 memory system once that exists. We'll revisit after 1a delivers a result.
68
+
69
+ ---
70
+
71
+ ### Horizon 2 — Memory system (graph-based, dynamic projection)
72
+
73
+ **Evidence base**:
74
+ - Hermes Agent skill loop (solve → document → reuse): **+40% speedup**, validated in production
75
+ - Aider's PageRank repo map: validated by adoption and benchmark results
76
+ - Reflexion (academic): episodic failure memory measurably improves recovery
77
+ - Doc 03 design predates our experiments; the design is internally consistent and aligns with these patterns
78
+
79
+ **Hypothesis to validate during construction**:
80
+ A persistent graph with role-typed nodes (session, goal, pending, step, milestone) + dynamic projection biased by relevance → better cross-task and cross-session performance than session-scoped context alone.
81
+
82
+ **What to build** (see `03_memory_design.md` for the full design):
83
+ - Five node types per Doc 03 §3.2
84
+ - Importance-based milestone promotion at step exit
85
+ - Dynamic context projection (which milestones enter the active window)
86
+ - Cross-session persistence with decay
87
+
88
+ **Refinements based on industry research**:
89
+ - Adopt Hermes's pattern of *agent-written skill documents* alongside agent-written milestones
90
+ - Consider Aider's PageRank-style relevance ranking for code-related milestones
91
+ - Reflexion-style explicit failure-pattern tracking
92
+
93
+ **Decision rule for memory features**:
94
+ Each subcomponent must demonstrate measurable lift before we layer more on top. We will NOT build the full graph and then check if it works — we'll build minimum-viable retrieval (Hermes-style flat skill docs), measure, then incrementally add structure.
95
+
96
+ ---
97
+
98
+ ## What we are explicitly NOT doing
99
+
100
+ These have been tested or have strong reasons against. See `02_bitacora.md` for full rationale.
101
+
102
+ - ❌ Posture vector (5-axis dynamic behavioral state)
103
+ - ❌ Plan tiers / phases / forced verification gate / cycle escalation
104
+ - ❌ Deliberation V3 (single-call multi-perspective in one model)
105
+ - ❌ Phase-aware temperatures
106
+ - ❌ Self-verification / self-review loops (same-model)
107
+ - ❌ Pre-completion Critic (without genuinely different model)
108
+ - ❌ **Role-based SOUL.md router** (refuted V9e, 2026-05-19) — no correctness signal beyond noise; efficiency gain captured by single default SOUL without routing
109
+
110
+ ---
111
+
112
+ ## Sequencing
113
+
114
+ **Phase 1a — closed (refuted 2026-05-19)**. See section above. Action item: set a single generic-engineering SOUL as Durin's default to capture the efficiency gain.
115
+
116
+ **Phase 1c (Tool I/O hygiene + telemetry — current focus, May 2026)**:
117
+ SWE-agent's central NeurIPS 2024 finding — *tool I/O quality matters more than loop quality* — is the empirically strongest direction we haven't measured in Durin. Both candidates (windowed file viewer, capped search) are already implemented in our `read_file` and `grep` tools at permissive defaults. What's missing is per-call telemetry to know if the defaults are sized correctly for 1M-context frontier models or if information is silently dropped.
118
+
119
+ Steps:
120
+ 1. Instrument `read_file` and `grep` with per-call JSONL events: params, file/result sizes, truncation flags, follow-up patterns ✅ done
121
+ 2. Collect baseline over real workloads (V9e re-run with telemetry on; longer agentic sessions)
122
+ 3. Decide if defaults need tightening (toward SWE-agent's 100-line / 50-result limits) or are already correct
123
+ 4. **No defaults change without supporting data** — the cost of dropping information the model needs is asymmetric vs the token savings
124
+
125
+ External agents review (May 2026): see `07_external_agents_review.md` for code-level analysis of OpenHands, Hermes Agent, OpenCode, OpenClaude. That review surfaced concrete tool/loop adoption candidates with explicit weighing.
126
+
127
+ **Sprint A — Tool I/O hygiene (completed 2026-05-19)**: `repo_overview` tool, `read_file` suggestion-on-miss, block-anchor matcher in `edit_file`, `exec` output spill to disk. All 4 quick-wins shipped with telemetry. 35 new tests, full suite at 3,102.
128
+
129
+ **Sprint B — Permission-as-data agent modes (completed 2026-05-19)**: `/plan`, `/build`, `/mode` slash commands work in every channel via the shared `CommandRouter`. `enter_plan_mode` / `exit_plan_mode` tools for the LLM. Read-only filtering in the runner. Telemetry covers turn-start mode, mode switches, tool denials, and plan presentation. 51 new tests, full suite at 3,153. See `docs/ARCHITECTURE.md` §"Sprint B" for the per-channel autocomplete improvements that remain as polish (CLI completer, Telegram BotCommand registration).
130
+
131
+ **Subsequent pivot (May 2026)**: archive subsystem we'd been building was found redundant with `session.json` (which is now confirmed immutable, since TTL/autocompact was removed). Replaced with per-session `<safe_key>.meta.json` sidecar — single file per session indexing lifecycle events (plans today, extensible by `type` for future patterns). See `docs/02_bitacora.md` §"Pivot: session immutable + per-session meta file".
132
+
133
+ ---
134
+
135
+ ### Tools roadmap (May 2026 — 12-item plan)
136
+
137
+ Compiled from the comparative review of OpenHands / Hermes / OpenCode / OpenClaude tools (`07_external_agents_review.md`) filtered through Marcelo's priorities. Each row is independent unless dependencies are noted. Order reflects: trivial-first, then user-flagged high-interest, then multimodal chain, then heavyweight investments, then memory-foundation skills.
138
+
139
+ | # | Tool | Complexity | Value | Adopters | Depends on | Rationale |
140
+ |---|---|---|---|---|---|---|
141
+ | 1 | **TodoWrite** ✅ (2026-05-19) | LOW (1d) | High | All 4 (OpenHands, Hermes, OpenCode, OpenClaude) | — | Shipped as `todo_write`. Replaces full list each call. Echoed in runtime context. Allowed in plan mode. See bitácora. |
142
+ | 2 | **Sleep** ✅ (2026-05-19) | LOW (~2h) | Low-Medium | OpenClaude | — | Shipped as `sleep`. Bounded 0–300s; clamps over-asks; telemetry start/end. |
143
+ | 3 | **AskUserQuestion** ✅ (2026-05-19) | LOW-MED (2d) | High | OpenClaude, Hermes (`clarify`) | — | Shipped as `ask_user_question`. V1 yield-and-resume (no in-turn block); stores `pending_question` on session metadata for channel rendering. |
144
+ | 4 | **session_search** ✅ (2026-05-19) | LOW (2d) | Medium | Hermes | — | Shipped as `session_search`. Keyword/regex over `session.messages`, role filter, snippet around match, msg_index pointer. Allowed in plan mode. |
145
+ | 5 | **Subagent lifecycle expansion** ✅ (2026-05-19) | MED (~1 week) | High | OpenClaude (`TaskCreate/Get/Update/List/Stop/Output`), OpenCode, OpenHands | — | Shipped 4 tools: `subagent_list`, `subagent_status`, `subagent_stop`, `subagent_output`. Session-scoped security, LRU status retention, allowed in plan mode. |
146
+ | 6 | **Monitor** ✅ (2026-05-19) | LOW-MED (2-3d) | Medium | OpenClaude | #5 | Shipped as `subagent_monitor`. Cursor-based diff polling (`after_event` → `next_cursor`); finished output bundled when task completes. |
147
+ | 7 | **Cron extension** ✅ (2026-05-19) | LOW-MED (2-3d) | Medium | Hermes, OpenClaude | — | List + remove already existed. Added `action='update'`: rename, change message, swap schedule, toggle delivery. Requires ≥1 actual change. |
148
+ | 8 | **RemoteTrigger** | MED (3-5d) | Medium-High | OpenClaude | — | Launch agent run from external webhook. Requires HTTP endpoint + queue plumbing. |
149
+ | 9 | **Vision tool** (capability bridge to aux model) ✅ (2026-05-19) | MED (~1 week) | High | Hermes (`vision_analyze`), OpenClaude (`browser_vision`), OpenHands (browser get_state) | capabilities snapshot + aux_providers | Shipped as `interpret_image`. Config-gated (only registers when `aux_models.vision` is set); routes one-shot questions to the aux LLM with OpenAI-compat `image_url` block. Verified E2E (glm-5.1 primary → glm-5v-turbo aux). |
150
+ | 9b | **Audio bridge** (capability bridge to aux model) ✅ (2026-05-20) | MED | High | new — out-of-scope of original 12-list | capabilities snapshot + aux_providers | Shipped as `interpret_audio`. Same pattern as `interpret_image` for audio chat-multimodal. Verified E2E via Gemini 2.5 Flash (Ollama / LM Studio do not yet expose audio encoders; transcription-only path documented as future `transcribe_audio` tool). |
151
+ | 10 | **Document extraction enriched** (PDF/Office/OCR) | MED (~1 week) | High | Partial in all 4 | #9 | Already parse PDF/Office basic in `read_file`. Extend with OCR of embedded images (via #9), structured tables, layout-aware paragraphs. **Not started.** |
152
+ | 11 | **Browser minimal** (navigate + scrape + optional screenshot) | HIGH (~2 weeks) | High | Hermes (Playwright/CDP full), OpenHands (BrowserToolSet), OpenClaude (`WebBrowserTool`) | uses #9 for screenshots | Start minimal: navigate URL → text content + optional screenshot. Marcelo: "important for research". **Not started.** |
153
+ | 12 | **Skill progressive disclosure** ✅ partial (2026-05-20) | MED-HIGH (~2 weeks) | High | All 4 | — | Already partially in place: `SkillsLoader` indexes skills in summary + loads on-demand. Today's `disable_model_invocation` (pi-compat) closes the remaining gap (skills can be programmatic-only). Phase 2 memory work no longer blocked on this item. |
154
+
155
+ **Estimated totals**:
156
+ - Items 1-4 (independent UX quick wins): ~5 days
157
+ - Items 5-8 (async/orchestration, mostly independent): ~3 weeks
158
+ - Items 9-10 (multimodal pipeline, chained): ~2 weeks
159
+ - Item 11 (browser, heavy but independent): ~2 weeks
160
+ - Item 12 (skills, memory-foundation): ~2 weeks
161
+
162
+ Total ~ 2.5-3 months if strictly sequential. Items 9 + 11 can parallelize, dropping to ~2 months.
163
+
164
+ **Explicitly rejected** (with reason):
165
+ - `apply_patch` (Codex envelope) — only useful with OpenAI-family models, not our case
166
+ - LSP-as-tool — per-language maintenance burden
167
+ - Worktree (git) — no multi-branch workflows in our use cases
168
+ - `kanban_*` — over-structured vs TodoWrite, no demand
169
+ - `TeamCreate/Delete` (swarms) — over-engineering
170
+ - `mixture_of_agents` — N× cost without demonstrated use case
171
+ - Channel integrations (Discord/Feishu/HomeAssistant/etc.) — already have channels system, one-off integrations don't scale
172
+
173
+ **Decision rule for additions to this list**: must be either (a) language-agnostic and adopted by ≥2 of the 4 reference agents, or (b) explicitly flagged by the user for daily-driver use. Other "would be nice" tools deferred unless they meet one of those criteria.
174
+
175
+ ### Additions beyond the original 12-list (May 2026)
176
+
177
+ Items that emerged from running the tools roadmap and turned out to be worth shipping out-of-order:
178
+
179
+ | # | Addition | Date | Why |
180
+ |---|---|---|---|
181
+ | A | **Capability metadata + consensus snapshot** (`durin/providers/capabilities.py` + `data/model_capabilities.json` + `scripts/refresh_model_capabilities.py`) | 2026-05-19 | Pre-req for any "delegate to aux model" pattern; consolidates LiteLLM + OpenRouter + models.dev into one vendor-filtered consensus file (785 models) |
182
+ | B | **`AuxModelConfig` + `aux_providers`** plumbing (config schema + AgentLoop + ToolContext) | 2026-05-19 | Enables config-gated capability bridges. Supports `vision`, `audio`, extensible to others |
183
+ | C | **Mid-loop `context_transform` hook** (pi-inspired) | 2026-05-20 | One-line per-request transform of message list right before provider call. Foundation for token-budget pruning and dynamic context |
184
+ | D | **`disable_model_invocation` skill frontmatter flag** (pi-inspired) | 2026-05-20 | Skills hidden from LLM system prompt but still loadable programmatically. Closes most of item #12 |
185
+ | E | **Per-tool head/tail truncation** (pi-inspired) | 2026-05-20 | `shell`/`exec` output truncated from head (keep tail = errors); reads keep head. Small refinement of an old uniformity |
186
+ | F | **Real prompt-tokens anchor** (pi-inspired, perf C.1) | 2026-05-20 | Provider's actual `prompt_tokens` stamped on assistant messages → `estimate_prompt_tokens_chain` uses real numbers instead of estimating the whole chain |
187
+ | G | **`cache.usage` telemetry event** (pi-inspired, perf C.2) | 2026-05-20 | Per-turn structured event with `prompt_tokens`, `cached_tokens`, `cache_ratio_pct`. Surfaces existing server-side cache savings (e.g. z.ai's automatic prefix cache returns ~99% hits) |
188
+
189
+ ---
190
+
191
+ **Phase 1b (Per-query dynamic context)**:
192
+ Hold until Phase 2 (memory) provides the natural substrate. Standalone implementation would duplicate work the memory system will subsume.
193
+
194
+ **Phase 2 (Horizon 2 — Memory)**:
195
+ Higher investment, higher potential differentiation. Now unblocked: Phase 2 was waiting on Phase 1c telemetry + the perf infra (anchored tokens + cache visibility) to make compaction decisions over real data, both of which are now in place. Build incrementally: start with flat skill docs (Hermes-style), then add structure as evidence warrants. **Before designing**, read `~/git_personal/hermes-agent/agent/background_review.py` + `curator.py` + `memory_manager.py` — Hermes ships an essentially-complete production implementation of the Doc 03 pattern (forked agent with tool whitelist, ContextVar-gated provenance, frozen 3-tier system prompt). See `07_external_agents_review.md` §L1, §L2.
196
+
197
+ Once Phase 2 has retrieval, Phase 1b reduces to "use the memory retriever to fetch query-relevant context" — small additional work.
198
+
199
+ ---
200
+
201
+ ## Decision rules (carried over from bitácora lessons)
202
+
203
+ 1. **No component without empirical or industrial precedent.** "It seems like it should help" is not enough.
204
+ 2. **Mechanisms must demonstrably activate in realistic tests.** If the main code path never runs, the component is overhead.
205
+ 3. **Distrust same-model self-verification.** Need ground truth (tests) or different models.
206
+ 4. **Specificity > abstraction.** "Be cautious" doesn't change behavior; concrete rules do.
207
+ 5. **3+ trials minimum** for any quantitative claim.
208
+ 6. **Test in regimes where baseline can fail.** Ceiling-effect scenarios prove nothing.
209
+
210
+ ---
211
+
212
+ ## Last updated: 2026-05-20
213
+
214
+ > Latest pass: items #1–9 of the original 12-list shipped (incl. capability bridges for vision + audio), item #12 mostly closed by today's `disable_model_invocation` flag. Capability metadata pipeline (3-source consensus snapshot) shipped as a foundation. Pi coding agent reviewed and four refinements adopted: `context_transform` hook, skill disable flag, head/tail truncation per tool, anchored token accounting, cache visibility. Stale planning docs (`04_agent_strategies_catalog`, `05_log_swebench`, `06_log_experiments`) moved to `docs/archive/`. Memory (Phase 2) is now unblocked.
215
+
216
+ > Daily driver lifecycle (D6 + D7 + D8 in `09_daily_driver_plan.md`): `durin config`, `durin upgrade`, `durin uninstall`, `durin doctor`, plus README + INSTALL.md shipped. Distribution renamed to `durin-agent` on PyPI; tag-triggered workflow builds + publishes wheel/sdist to GitHub Releases + PyPI via OIDC trusted publishing. The install/configure/upgrade/diagnose/uninstall surfaces are now complete; the operator no longer needs to hand-edit JSON or guess where state lives, and can install via `pipx install --pre durin-agent` without a checkout.