overcode 0.6.1__tar.gz → 0.6.2__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 (352) hide show
  1. {overcode-0.6.1/src/overcode.egg-info → overcode-0.6.2}/PKG-INFO +1 -1
  2. {overcode-0.6.1 → overcode-0.6.2}/docs/children.md +5 -2
  3. {overcode-0.6.1 → overcode-0.6.2}/docs/configuration.md +24 -8
  4. {overcode-0.6.1 → overcode-0.6.2}/docs/design/auto-naming.md +16 -10
  5. overcode-0.6.2/docs/release-notes-0.6.2.md +27 -0
  6. {overcode-0.6.1 → overcode-0.6.2}/docs/tui-guide.md +2 -1
  7. {overcode-0.6.1 → overcode-0.6.2}/pyproject.toml +1 -1
  8. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/bundled_skills.py +4 -0
  9. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/child_presets.py +4 -1
  10. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/agent.py +8 -1
  11. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/budget.py +4 -0
  12. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/config.py +34 -0
  13. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/naming.py +7 -5
  14. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/registry.py +3 -1
  15. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_virtual.py +9 -0
  16. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/command_palette.py +13 -0
  17. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/config.py +79 -9
  18. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_stats_sync.py +46 -10
  19. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/follow_mode.py +1 -1
  20. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/history_reader.py +77 -23
  21. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hook_handler.py +18 -5
  22. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/launcher.py +78 -4
  23. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/lifecycle.py +3 -2
  24. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/monitor_daemon.py +3 -2
  25. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/namer.py +177 -74
  26. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/naming_lab.py +14 -6
  27. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry-v2/overcode-telemetry-core.mjs +23 -14
  28. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/paths.py +1 -0
  29. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/process_resources.py +53 -0
  30. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/rename.py +2 -3
  31. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/session_manager.py +14 -0
  32. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/stats_reader.py +13 -5
  33. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summarizer_prompts.py +12 -2
  34. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/transcript_index.py +91 -0
  35. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui.py +6 -0
  36. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/daemon.py +16 -0
  37. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/dialogs.py +20 -0
  38. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/session.py +29 -3
  39. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/__init__.py +2 -0
  40. overcode-0.6.2/src/overcode/tui_widgets/auto_naming_modal.py +259 -0
  41. {overcode-0.6.1 → overcode-0.6.2/src/overcode.egg-info}/PKG-INFO +1 -1
  42. {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/SOURCES.txt +2 -0
  43. {overcode-0.6.1 → overcode-0.6.2}/LICENSE +0 -0
  44. {overcode-0.6.1 → overcode-0.6.2}/MANIFEST.in +0 -0
  45. {overcode-0.6.1 → overcode-0.6.2}/README.md +0 -0
  46. {overcode-0.6.1 → overcode-0.6.2}/docs/README.md +0 -0
  47. {overcode-0.6.1 → overcode-0.6.2}/docs/advanced-features.md +0 -0
  48. {overcode-0.6.1 → overcode-0.6.2}/docs/architecture.md +0 -0
  49. {overcode-0.6.1 → overcode-0.6.2}/docs/backends.md +0 -0
  50. {overcode-0.6.1 → overcode-0.6.2}/docs/claude-session-files.md +0 -0
  51. {overcode-0.6.1 → overcode-0.6.2}/docs/cli-reference.md +0 -0
  52. {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/00_overview.md +0 -0
  53. {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/01_usage_log.md +0 -0
  54. {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/02_learning_journey.md +0 -0
  55. {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/03_overagent.md +0 -0
  56. {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/04_phasing_and_questions.md +0 -0
  57. {overcode-0.6.1 → overcode-0.6.2}/docs/design/README.md +0 -0
  58. {overcode-0.6.1 → overcode-0.6.2}/docs/design/acp-agent-integration-analysis.md +0 -0
  59. {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-agnostic-backends-opencode.md +0 -0
  60. {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-backend-hermes.md +0 -0
  61. {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-backends-codex-grok.md +0 -0
  62. {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-observability-0.6.1.md +0 -0
  63. {overcode-0.6.1 → overcode-0.6.2}/docs/design/background-shell-classification.md +0 -0
  64. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/README.md +0 -0
  65. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/SYNTHESIS.md +0 -0
  66. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/candidates.md +0 -0
  67. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-bernstein.md +0 -0
  68. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-bobbit.md +0 -0
  69. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-ccmanager.md +0 -0
  70. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-claude-squad.md +0 -0
  71. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-cmux.md +0 -0
  72. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-composio.md +0 -0
  73. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-dmux.md +0 -0
  74. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-gastown.md +0 -0
  75. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-kagan.md +0 -0
  76. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-orca.md +0 -0
  77. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-superset.md +0 -0
  78. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-vibe-kanban.md +0 -0
  79. {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/zellij-vs-tmux.md +0 -0
  80. {overcode-0.6.1 → overcode-0.6.2}/docs/design/billing-code-ids.md +0 -0
  81. {overcode-0.6.1 → overcode-0.6.2}/docs/design/cost-model-0.6.1.md +0 -0
  82. {overcode-0.6.1 → overcode-0.6.2}/docs/design/e2e-devcontainer-testing.md +0 -0
  83. {overcode-0.6.1 → overcode-0.6.2}/docs/design/engine-0.6.md +0 -0
  84. {overcode-0.6.1 → overcode-0.6.2}/docs/design/model-alias-resolution.md +0 -0
  85. {overcode-0.6.1 → overcode-0.6.2}/docs/design/opencode-parity.md +0 -0
  86. {overcode-0.6.1 → overcode-0.6.2}/docs/design/opencode-stats-reader-performance.md +0 -0
  87. {overcode-0.6.1 → overcode-0.6.2}/docs/design/quality-review-2026-10.md +0 -0
  88. {overcode-0.6.1 → overcode-0.6.2}/docs/design/scaling-audit-2026-09-22.md +0 -0
  89. {overcode-0.6.1 → overcode-0.6.2}/docs/getting-started.md +0 -0
  90. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.3.0.md +0 -0
  91. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.4.2.md +0 -0
  92. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.1.md +0 -0
  93. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.2.md +0 -0
  94. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.3.md +0 -0
  95. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.4.md +0 -0
  96. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.5.md +0 -0
  97. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.6.md +0 -0
  98. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.7.md +0 -0
  99. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.8.md +0 -0
  100. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.6.0.md +0 -0
  101. {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.6.1.md +0 -0
  102. {overcode-0.6.1 → overcode-0.6.2}/docs/releasing.md +0 -0
  103. {overcode-0.6.1 → overcode-0.6.2}/docs/skill-profiles.md +0 -0
  104. {overcode-0.6.1 → overcode-0.6.2}/docs/tui-refactoring-plan.md +0 -0
  105. {overcode-0.6.1 → overcode-0.6.2}/docs/ux-performance-analysis-2026-03-09.md +0 -0
  106. {overcode-0.6.1 → overcode-0.6.2}/docs/wrappers.md +0 -0
  107. {overcode-0.6.1 → overcode-0.6.2}/setup.cfg +0 -0
  108. {overcode-0.6.1 → overcode-0.6.2}/setup.py +0 -0
  109. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/__init__.py +0 -0
  110. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/activity_log.py +0 -0
  111. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_bundle.py +0 -0
  112. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_files.py +0 -0
  113. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_identity.py +0 -0
  114. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_io.py +0 -0
  115. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_scanner.py +0 -0
  116. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_worktree.py +0 -0
  117. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/__init__.py +0 -0
  118. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/_stats_common.py +0 -0
  119. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/base.py +0 -0
  120. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/claude_code.py +0 -0
  121. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/codex.py +0 -0
  122. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/codex_stats.py +0 -0
  123. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/grok.py +0 -0
  124. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/grok_stats.py +0 -0
  125. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/hermes.py +0 -0
  126. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/hermes_stats.py +0 -0
  127. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/jsonl_tail.py +0 -0
  128. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode.py +0 -0
  129. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2.py +0 -0
  130. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2_patterns.py +0 -0
  131. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2_plugin_install.py +0 -0
  132. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2_stats.py +0 -0
  133. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode_stats.py +0 -0
  134. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/overagent.py +0 -0
  135. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/shell.py +0 -0
  136. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/burn.py +0 -0
  137. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/child_lifecycle.py +0 -0
  138. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_bg.py +0 -0
  139. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_bg_ledger.py +0 -0
  140. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_config.py +0 -0
  141. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_pid.py +0 -0
  142. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/__init__.py +0 -0
  143. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/__main__.py +0 -0
  144. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/_shared.py +0 -0
  145. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/activity.py +0 -0
  146. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/daemon.py +0 -0
  147. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/doctor.py +0 -0
  148. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/focal.py +0 -0
  149. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/hooks.py +0 -0
  150. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/jobs.py +0 -0
  151. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/keys.py +0 -0
  152. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/lifecycle.py +0 -0
  153. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/models.py +0 -0
  154. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/monitoring.py +0 -0
  155. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/parallelism.py +0 -0
  156. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/perms.py +0 -0
  157. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/quota.py +0 -0
  158. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/sister.py +0 -0
  159. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/skill_profiles.py +0 -0
  160. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/skills.py +0 -0
  161. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/split.py +0 -0
  162. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/tags.py +0 -0
  163. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/trip.py +0 -0
  164. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/view.py +0 -0
  165. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/wrappers.py +0 -0
  166. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/clock.py +0 -0
  167. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/codes.py +0 -0
  168. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/__init__.py +0 -0
  169. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/column.py +0 -0
  170. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/context.py +0 -0
  171. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/emoji.py +0 -0
  172. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/hover.py +0 -0
  173. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/layout.py +0 -0
  174. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_context.py +0 -0
  175. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_git.py +0 -0
  176. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_identity.py +0 -0
  177. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_performance.py +0 -0
  178. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_supervision.py +0 -0
  179. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_time.py +0 -0
  180. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_usage.py +0 -0
  181. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/conversation_spend.py +0 -0
  182. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/conversation_warning.py +0 -0
  183. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cost_check.py +0 -0
  184. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_cadence.py +0 -0
  185. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_claude_skill.md +0 -0
  186. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_housekeeping.py +0 -0
  187. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_logging.py +0 -0
  188. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_presence.py +0 -0
  189. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_process_probe.py +0 -0
  190. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_utils.py +0 -0
  191. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/claude_prices.json +0 -0
  192. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/keymaps/default.yaml +0 -0
  193. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/keymaps/vscode.yaml +0 -0
  194. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/model_metadata.json +0 -0
  195. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data_export.py +0 -0
  196. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/dependency_check.py +0 -0
  197. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/doctor.py +0 -0
  198. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/energy.py +0 -0
  199. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_protocol.py +0 -0
  200. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_recorders.py +0 -0
  201. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_socket.py +0 -0
  202. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_wake.py +0 -0
  203. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/entrypoint.py +0 -0
  204. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/episodes.py +0 -0
  205. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/exceptions.py +0 -0
  206. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/git_context.py +0 -0
  207. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/git_stats.py +0 -0
  208. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hermes_plugin/__init__.py +0 -0
  209. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hermes_plugin/plugin.yaml +0 -0
  210. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hook_dialects.py +0 -0
  211. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hook_status_detector.py +0 -0
  212. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/idle_stages.py +0 -0
  213. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/implementations.py +0 -0
  214. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/job_launcher.py +0 -0
  215. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/job_manager.py +0 -0
  216. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/journey.py +0 -0
  217. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/json_store.py +0 -0
  218. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/keymap.py +0 -0
  219. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/launch_settings.py +0 -0
  220. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/layout_migration.py +0 -0
  221. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/ledger.py +0 -0
  222. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/mentor.py +0 -0
  223. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/model_metadata.py +0 -0
  224. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/monitor_daemon_core.py +0 -0
  225. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/monitor_daemon_state.py +0 -0
  226. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/month_files.py +0 -0
  227. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/name_source.py +0 -0
  228. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/naming_policy.py +0 -0
  229. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/notifier.py +0 -0
  230. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry-v2/index.js +0 -0
  231. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry-v2/tui.js +0 -0
  232. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry.js +0 -0
  233. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/overagent.py +0 -0
  234. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/pane_capture_gate.py +0 -0
  235. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/pid_utils.py +0 -0
  236. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/presence_logger.py +0 -0
  237. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/price_table.py +0 -0
  238. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/pricing.py +0 -0
  239. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/prompt_lab.py +0 -0
  240. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/protocols.py +0 -0
  241. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/quota_calibration.py +0 -0
  242. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/quota_engine.py +0 -0
  243. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/quota_model.py +0 -0
  244. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/sandbox_detect.py +0 -0
  245. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/session_archive.py +0 -0
  246. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/session_identity.py +0 -0
  247. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/settings.py +0 -0
  248. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/sister_controller.py +0 -0
  249. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/sister_poller.py +0 -0
  250. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/skill_library.py +0 -0
  251. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/spawn.py +0 -0
  252. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/spend_recompute.py +0 -0
  253. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/ssh_provisioner.py +0 -0
  254. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/standing_instructions.py +0 -0
  255. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/stat_gate.py +0 -0
  256. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_constants.py +0 -0
  257. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_detector.py +0 -0
  258. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_detector_factory.py +0 -0
  259. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_history.py +0 -0
  260. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_patterns.py +0 -0
  261. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_theme.py +0 -0
  262. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/statusline_tap.py +0 -0
  263. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summarizer_client.py +0 -0
  264. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summarizer_component.py +0 -0
  265. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summary_columns.py +0 -0
  266. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summary_groups.py +0 -0
  267. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/supervisor_daemon.py +0 -0
  268. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/supervisor_daemon_core.py +0 -0
  269. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm.py +0 -0
  270. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_files.py +0 -0
  271. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_history.py +0 -0
  272. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_publisher.py +0 -0
  273. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_view.py +0 -0
  274. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/__init__.py +0 -0
  275. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/renderer.py +0 -0
  276. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/tmux_driver.py +0 -0
  277. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/tui_eye.py +0 -0
  278. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/tui_eye_skill.md +0 -0
  279. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/time_context.py +0 -0
  280. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tmux_manager.py +0 -0
  281. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tmux_utils.py +0 -0
  282. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/trip.py +0 -0
  283. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui.tcss +0 -0
  284. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/__init__.py +0 -0
  285. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/activity.py +0 -0
  286. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/claude_bg.py +0 -0
  287. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/command_bar.py +0 -0
  288. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/diagnostics.py +0 -0
  289. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/input.py +0 -0
  290. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/jobs.py +0 -0
  291. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/mentor.py +0 -0
  292. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/navigation.py +0 -0
  293. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/overagent.py +0 -0
  294. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/sisters.py +0 -0
  295. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/swarm.py +0 -0
  296. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/view.py +0 -0
  297. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/view_control.py +0 -0
  298. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_engine.py +0 -0
  299. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_engine_link.py +0 -0
  300. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_helpers.py +0 -0
  301. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_logic.py +0 -0
  302. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_render.py +0 -0
  303. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_split.py +0 -0
  304. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_theme.py +0 -0
  305. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_timers.py +0 -0
  306. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/agent_select_modal.py +0 -0
  307. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/agent_visibility_modal.py +0 -0
  308. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/billing_code_modal.py +0 -0
  309. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/billing_codes_modal.py +0 -0
  310. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/column_header.py +0 -0
  311. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/command_bar.py +0 -0
  312. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/command_palette.py +0 -0
  313. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/daemon_panel.py +0 -0
  314. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/daemon_status_bar.py +0 -0
  315. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/dialog_style.py +0 -0
  316. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/help_overlay.py +0 -0
  317. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/instruction_history_modal.py +0 -0
  318. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/job_summary.py +0 -0
  319. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/journey_panel.py +0 -0
  320. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/jump_modal.py +0 -0
  321. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/modal_base.py +0 -0
  322. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/naming_lab.py +0 -0
  323. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/new_agent_defaults_modal.py +0 -0
  324. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/new_agent_modal.py +0 -0
  325. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/passthru_config_modal.py +0 -0
  326. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/preview_pane.py +0 -0
  327. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/rename_agent_modal.py +0 -0
  328. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/session_summary.py +0 -0
  329. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/sister_selection_modal.py +0 -0
  330. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/skills_modal.py +0 -0
  331. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/status_colours_modal.py +0 -0
  332. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/status_timeline.py +0 -0
  333. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/summary_config_modal.py +0 -0
  334. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/summary_prompt_lab.py +0 -0
  335. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/swarm_rows.py +0 -0
  336. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/tmux_config_modal.py +0 -0
  337. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/tui_log_panel.py +0 -0
  338. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/upgrade_consent.py +0 -0
  339. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/usage_analytics.py +0 -0
  340. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/usage_monitor.py +0 -0
  341. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/view_control.py +0 -0
  342. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_api.py +0 -0
  343. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_control_api.py +0 -0
  344. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_server.py +0 -0
  345. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_server_runner.py +0 -0
  346. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/worker_guard.py +0 -0
  347. {overcode-0.6.1 → overcode-0.6.2}/src/overcode/wrapper.py +0 -0
  348. {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/dependency_links.txt +0 -0
  349. {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/entry_points.txt +0 -0
  350. {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/requires.txt +0 -0
  351. {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/top_level.txt +0 -0
  352. {overcode-0.6.1 → overcode-0.6.2}/tests/test_e2e_multi_agent_jokes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: overcode
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: A supervisor for managing multiple Claude Code instances in tmux
5
5
  Author: Mike Bond
6
6
  Project-URL: Homepage, https://github.com/mkb23/overcode
@@ -121,7 +121,7 @@ The command reads the child's identity from its environment (overcode sets
121
121
  launches), so it only works inside an agent. When the child's turn ends:
122
122
 
123
123
  - **with a report**, it is `done`: ⚪ with ✅ or ❌. Any budget it didn't
124
- use goes back to its parent.
124
+ use goes back to its parent (unless budget reclaim is manual, below).
125
125
  - **without a report**, it is `waiting_oversight`: ⚪ with 📭. Its
126
126
  oversight policy (below) decides what happens next. If you or its parent
127
127
  prompt it again, it goes back to work.
@@ -212,7 +212,10 @@ children:
212
212
  its budget without a deduction. A preset can set a default budget, which
213
213
  `--budget` overrides.
214
214
  - When a child reports and turns done, whatever is left of its budget goes
215
- back to its parent.
215
+ back to its parent. With `children.budget_reclaim: manual` (config.yaml,
216
+ or "Budget reclaim" in the TUI palette) it stays with the child, so you
217
+ can keep talking to it without it running out, until the parent takes it
218
+ back with `overcode budget reclaim <child>`. The default is `auto`.
216
219
  - Budgets are soft limits. When an agent goes over its budget, it isn't
217
220
  killed, but its heartbeats and supervisor nudges stop. See
218
221
  [Cost Budgets](advanced-features.md#cost-budgets).
@@ -110,6 +110,8 @@ naming:
110
110
  children:
111
111
  preset: supervised # default for children: supervised | balanced | autonomous | yours
112
112
  presets: {} # change a built-in or add your own
113
+ budget_reclaim: auto # auto: a finished child's unused budget goes back to its
114
+ # parent; manual: only `overcode budget reclaim <child>`
113
115
 
114
116
  # Claude subscription quota: the Q% column's estimate
115
117
  # See "Subscription Quota" below
@@ -907,8 +909,9 @@ naming:
907
909
  warn_humans: false # warn (never refuse) when a name you type breaks the rules
908
910
  enabled: false # auto-naming: the engine names agents (off by default)
909
911
  first_after: {minutes: 5} # the first name, this long after the agent's first prompt
910
- max_renames: 2 # auto renames in an agent's life (the first name + one refinement)
911
- cost_cap_per_day: 0.50 # USD a day for the namer's model calls (per tmux session)
912
+ rename_every: {minutes: 30} # then a check per this much work (0: never re-checked)
913
+ max_renames: null # a cap on auto renames per agent (null: none)
914
+ cost_cap_per_day: 10.00 # USD a day for the namer's model calls (per tmux session)
912
915
  # provider: # the namer's model; default: the summarizer: block
913
916
  # api_type: anthropic
914
917
  # api_url: https://api.anthropic.com/v1/messages
@@ -918,7 +921,10 @@ naming:
918
921
  ```
919
922
 
920
923
  **Auto-naming** (`enabled: true`, `/` → "Auto-naming" in the TUI, or a
921
- children preset that sets it). The engine names an agent whose name is
924
+ children preset that sets it). `/` → "Auto-naming settings…" sets
925
+ `enabled`, `first_after`, `rename_every`, `max_renames`,
926
+ `cost_cap_per_day` and `cli_title` from the TUI, saving each change here
927
+ at once; `overcode config show` prints them. The engine names an agent whose name is
922
928
  `default` or `auto` `first_after.minutes` (default 5) after its first
923
929
  prompt (the launch prompt, or the first one you typed), once it has started
924
930
  on it: mid-turn or while it waits, whichever it is doing then. An agent
@@ -929,13 +935,23 @@ naming advice, case included ("use capitals" gets capitals); names that
929
935
  differ only in case count as the same name. `overcode name policy` says
930
936
  whether auto-naming is on and when it names, the new-agent dialog's tip
931
937
  for the name says what will happen to a name you leave as it is, and the
932
- naming lab's header says it too. One refinement comes after 20 turns and
933
- 30 minutes of work (or 150k output tokens), and renames only if the model
934
- says the task has changed. "Let overcode name it" (`overcode rename
938
+ naming lab's header says it too.
939
+
940
+ After the first name, the engine asks again every `rename_every.minutes`
941
+ (default 30) of work: green time, counted from the last check, so an agent
942
+ at rest is never asked, and the check comes mid-turn or idle, whenever
943
+ the work adds up. The model sees what the agent is doing now (its last
944
+ three prompts with how long ago each was, the files it edited since the
945
+ last check, and why its name was chosen) beside its brief, and keeps the
946
+ name unless the focus of the work has clearly moved on, so most checks
947
+ rename nothing. There is no cap on auto renames unless you set
948
+ `max_renames`. A check costs one call (well under a cent with a mini model);
949
+ `cost_cap_per_day` still bounds the lot. A naming prompt saved from the
950
+ naming lab before this had no place for the recent work; the engine adds
951
+ it at the end. "Let overcode name it" (`overcode rename
935
952
  <agent> --auto`, or "Named by" in the rename dialog) makes the name a
936
953
  `default` one again, without a `~` (overcode did not choose it), and the
937
- agent is named afresh by the same rule. An auto
938
- name changes at most `max_renames` times, at least 10 minutes apart. The
954
+ agent is named afresh by the same rule. The
939
955
  namer never renames a `human` or `parent` name. It does not wait for the
940
956
  TUI to go quiet: a rename interrupts nothing, and the old name still
941
957
  reaches the agent. A rename is overcode's ordinary
@@ -181,7 +181,7 @@ status going from green to waiting_user / waiting_heartbeat /
181
181
  waiting_oversight / done, as the daemon publishes it (so hookless agents
182
182
  count too); the turn count is the larger of those seen (kept in
183
183
  `agents/<id>/namer.json`) and the transcript's interaction count; the
184
- refinement needs 10x every threshold (turns and green minutes or tokens);
184
+ refinement needs 10x every threshold (turns and green minutes or tokens; replaced by `rename_every` in #547);
185
185
  a failed or unreadable call is retried no sooner than 10 minutes later.
186
186
  There is no wait for the TUI to go quiet (an earlier draft held renames
187
187
  for 30 s after any TUI keypress; it only delayed names, since a rename
@@ -204,14 +204,19 @@ from events and adds no polling.
204
204
  most 3 times (`first_tries`). "Let overcode name it" sets the source to
205
205
  `default` (no `~`: overcode did not choose the name) and clears the
206
206
  naming history (`hand_to_namer`), so the rule applies afresh.
207
- - **One refinement** comes at a Stop after 20 turns and 30 green minutes or
208
- 150k output tokens (`REFINE_AFTER`).
209
- It renames only when the namer is confident the task has changed (see the
210
- `keep` reply below). So `auto` names change at most twice in an agent's
211
- life (`max_renames`, default 2), and at least 10 minutes apart.
207
+ - **A check every `rename_every.minutes` of work** (default 30; #547,
208
+ replacing the one refinement after 20 turns). Green time since the last
209
+ answered check, any tick, mid-turn or idle (owner decision 2026-10-22:
210
+ "any time", not only at a Stop). The model sees the recent window (last
211
+ 3 prompts from `recent_prompts.jsonl` with their age, files edited since
212
+ the check, and the `why` of the current name) beside the brief, and is
213
+ told to keep an `auto` name unless the focus has clearly moved on.
214
+ No cap on auto renames by default (`max_renames: null`); a failed call
215
+ waits 10 minutes. A green-time count that starts again (a restart)
216
+ restarts the check's count.
212
217
  - Never while the name is `human` (or `parent`).
213
218
  - Calls run on the daemon's worker pool, with a per-day cost cap
214
- (`naming.cost_cap_per_day`, default $0.50). Spend goes in the ledger
219
+ (`naming.cost_cap_per_day`, default $10; was $0.50). Spend goes in the ledger
215
220
  under the billing code `overcode` (closing the gap the summariser has).
216
221
  At about 2 calls per agent with a mini model, 100 agents cost about $0.05.
217
222
 
@@ -262,7 +267,7 @@ of a root agent calls `codes.follow_agent_name` on its code (owner decision
262
267
 
263
268
  The model returns JSON: `{"candidates": ["jwt-refresh", "auth-refresh",
264
269
  "jwt-fix"], "keep": false, "why": "..."}`, best first. `keep: true` means
265
- the current name still fits, which is how refinements stay rare. Overcode
270
+ the current name still fits, which is how most checks rename nothing. Overcode
266
271
  then decides on its own, without the model:
267
272
 
268
273
  1. Normalise each candidate to overcode's name pattern. Drop any that
@@ -304,8 +309,9 @@ naming:
304
309
  llm_check: false # check the advice with the model too
305
310
  warn_humans: false
306
311
  first_after: {minutes: 5}
307
- max_renames: 2
308
- cost_cap_per_day: 0.50
312
+ rename_every: {minutes: 30}
313
+ max_renames: null
314
+ cost_cap_per_day: 10.00
309
315
  # provider: falls back to the summarizer: block (api_type, url, model, key var)
310
316
  ```
311
317
 
@@ -0,0 +1,27 @@
1
+ # overcode 0.6.2
2
+
3
+ - **A held key no longer kills agents one after another.** Holding `x`
4
+ confirmed the kill on the first key repeat, then moved on to the next
5
+ agent; a held key now confirms nothing (#548).
6
+ - **Restart and rename never type into a running agent.** Overcode waits for
7
+ the agent's shell to have the terminal back (read from the process table on
8
+ macOS and Linux, not the screen) and refuses if it never exits; this fixes
9
+ stray sessions from agents in Claude's background worker (#549). Agents also
10
+ no longer inherit a host Claude session's identity when tmux was started from
11
+ inside Claude (#550).
12
+ - **Model and effort follow `/model` and `/effort` within seconds.** After a
13
+ model switch, effort reads `-` until the next reply says what it is (#539).
14
+ - **Auto names follow the work.** With auto-naming on, a name is re-checked
15
+ every 30 min of work and changes when the work has moved on. "Auto-naming
16
+ settings…" in the palette sets the timings, a cap, and the daily cost cap
17
+ (now an amount you type, $10 by default) (#547).
18
+ - **Budget reclaim can be manual.** `children.budget_reclaim: manual` (or
19
+ "Budget reclaim" in the palette) keeps a finished child's unused budget with
20
+ the child, so you can keep talking to it, until its parent runs
21
+ `overcode budget reclaim <child>`. The default stays `auto` (#546).
22
+ - **Smaller fixes.** A subagent row's empty bell cell no longer makes its time
23
+ read as negative (#545).
24
+
25
+ **Upgrading:** nothing to convert. If you use auto-naming, names may now
26
+ change during long sessions, and the namer's daily cap rises from $0.50 to $10
27
+ unless you set `naming.cost_cap_per_day`.
@@ -471,7 +471,8 @@ name Claude still shows.
471
471
  same for the focused agent (`overcode rename <agent> --auto` / `--lock`).
472
472
 
473
473
  With auto-naming on (`/` → "Auto-naming", or `naming.enabled`; see
474
- [Naming](configuration.md#naming)), the engine names an agent with a
474
+ [Naming](configuration.md#naming); `/` → "Auto-naming settings…" sets
475
+ its timings, cap and cost cap), the engine names an agent with a
475
476
  default name 5 minutes after its first prompt
476
477
  (`naming.first_after.minutes`), once it has started on it, working or
477
478
  waiting; an agent never given a task is not named. It may rename it once
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "overcode"
7
- version = "0.6.1"
7
+ version = "0.6.2"
8
8
  description = "A supervisor for managing multiple Claude Code instances in tmux"
9
9
  authors = [
10
10
  {name = "Mike Bond"}
@@ -82,6 +82,10 @@ Other options:
82
82
  - `-B opencode` (or `codex`, `grok`, ...) launches a different agent CLI.
83
83
  - `-m <model>` picks the model.
84
84
  - `--budget 2.00` caps its spend, and is taken from your budget if you have one.
85
+ What it doesn't spend comes back to you when it finishes, unless
86
+ `overcode config show` says `children.budget_reclaim: manual`: then take
87
+ it back yourself with `overcode budget reclaim <child>` once you are done
88
+ talking to it.
85
89
  - `--allowed-tools "Read,Grep,Glob"` makes a read-only Claude Code child.
86
90
  - `--skills <profile>` switches on a skill profile.
87
91
 
@@ -73,7 +73,7 @@ BUILTIN_PRESETS: Dict[str, ChildPreset] = {
73
73
  DEFAULT_PRESET = "supervised"
74
74
 
75
75
  _PRESET_KEYS = ("on_stuck", "oversight_timeout", "archive_after", "budget", "description")
76
- _SECTION_KEYS = ("preset", "presets")
76
+ _SECTION_KEYS = ("preset", "presets", "budget_reclaim")
77
77
  _NEVER = ("never", "off", "none")
78
78
 
79
79
 
@@ -222,6 +222,9 @@ def load_presets(section: Any = None) -> Tuple[Dict[str, ChildPreset], str, List
222
222
  continue
223
223
  base = presets.get(name, BUILTIN_PRESETS[DEFAULT_PRESET])
224
224
  presets[name] = _apply_fields(base, name, raw, warnings)
225
+ reclaim = section.get("budget_reclaim")
226
+ if reclaim is not None and str(reclaim).strip().lower() not in ("auto", "manual"):
227
+ warnings.append(f"children.budget_reclaim: '{reclaim}' is not auto or manual — using auto")
225
228
  default = section.get("preset") or DEFAULT_PRESET
226
229
  default = str(default).strip()
227
230
  if default not in presets:
@@ -3,6 +3,7 @@ Agent commands: launch, list, attach, kill, follow, report, cleanup,
3
3
  set-value, set-budget, annotate, send, show.
4
4
  """
5
5
 
6
+ import time
6
7
  from typing import Annotated, Optional, List
7
8
 
8
9
  import typer
@@ -1217,7 +1218,13 @@ def restart(
1217
1218
  launcher = launcher.for_agent(sess)
1218
1219
 
1219
1220
  if model:
1220
- launcher.sessions.update_session(sess.id, model=model)
1221
+ # From now on the transcript's older model and effort no longer
1222
+ # apply; on another model the effort is unknown until it replies
1223
+ # (Claude picks it per model) (#539)
1224
+ changes = {"model": model, "model_chosen_at": time.time()}
1225
+ if model != sess.model:
1226
+ changes["effort"] = None
1227
+ launcher.sessions.update_session(sess.id, **changes)
1221
1228
  sess = launcher.sessions.get_session(sess.id)
1222
1229
 
1223
1230
  # Window gone (killed, reboot): bring it back in a new window, as the
@@ -114,6 +114,10 @@ def budget_reclaim(
114
114
 
115
115
  Examples:
116
116
  overcode budget reclaim my-dead-child
117
+
118
+ A child that finishes gives its unused budget back by itself unless
119
+ children.budget_reclaim is manual (config.yaml, or "Budget reclaim" in
120
+ the TUI palette); then this is how the parent takes it back.
117
121
  """
118
122
  from ..session_manager import SessionManager
119
123
 
@@ -36,12 +36,27 @@ CONFIG_TEMPLATE = """\
36
36
  # agents (`overcode launch --preset`; `overcode config presets` lists them)
37
37
  # children:
38
38
  # preset: supervised # default for children: supervised | balanced | autonomous | yours
39
+ # budget_reclaim: auto # auto: a finished child's unused budget goes back to its
40
+ # # parent; manual: the parent runs `overcode budget reclaim`
39
41
  # presets:
40
42
  # overnight:
41
43
  # on_stuck: timeout:8h # wait | fail | timeout:DURATION
42
44
  # archive_after: never # DURATION or never
43
45
  # budget: 5.00 # USD
44
46
 
47
+ # Auto-naming (Agent names in docs/configuration.md; "Auto-naming settings…"
48
+ # in the TUI palette sets the switches and timings)
49
+ # naming:
50
+ # enabled: false # the engine names agents with default/auto names
51
+ # advice: | # free text: how names should look (the policy)
52
+ # lowercase kebab-case, 1-3 words, what the work is about
53
+ # max_length: 18 # the namer's target length
54
+ # first_after: {minutes: 5} # the first name, this long after the first prompt
55
+ # rename_every: {minutes: 30} # then a check per this much work (0: never)
56
+ # max_renames: null # a cap on auto renames per agent (null: none)
57
+ # cost_cap_per_day: 10.00 # USD a day for the namer's model calls
58
+ # cli_title: true # keep Claude Code's session title in step
59
+
45
60
  # AI summarizer settings (for corporate API gateways)
46
61
  # summarizer:
47
62
  # api_url: https://api.openai.com/v1/chat/completions
@@ -160,6 +175,25 @@ def _config_show():
160
175
  if "api_key_var" in s:
161
176
  rprint(f" api_key_var: {s['api_key_var']}")
162
177
 
178
+ if "children" in config:
179
+ from ..config import get_budget_reclaim_mode
180
+ rprint(f" children.budget_reclaim: {get_budget_reclaim_mode()}")
181
+
182
+ if "naming" in config:
183
+ from ..config import describe_auto_naming, get_naming_config
184
+ cfg = get_naming_config()
185
+ every = cfg["rename_every"]["minutes"]
186
+ rprint(" naming:")
187
+ rprint(f" enabled: {cfg['enabled']}")
188
+ rprint(f" first_after: {cfg['first_after']['minutes']:g} min")
189
+ rprint(f" rename_every: {f'{every:g} min of work' if every else 'never'}")
190
+ rprint(f" max_renames: {cfg['max_renames'] if cfg['max_renames'] is not None else 'no cap'}")
191
+ rprint(f" cost_cap_per_day: ${cfg['cost_cap_per_day']:.2f}")
192
+ rprint(f" cli_title: {cfg['cli_title']}")
193
+ rprint(f" [dim]{describe_auto_naming(cfg)}[/dim]")
194
+ for warning in cfg["warnings"]:
195
+ rprint(f" [yellow]Warning:[/yellow] {warning}")
196
+
163
197
  if "status_theme" in config:
164
198
  from ..status_theme import resolve
165
199
  theme, warnings = resolve(config["status_theme"])
@@ -194,8 +194,8 @@ def name_policy(
194
194
  rprint(f"Aim for at most {cfg['max_length']} characters.")
195
195
 
196
196
  rprint(f"\n[bold]Auto-naming[/bold] {escape(describe_auto_naming(cfg))}")
197
- rprint("[dim](naming.enabled in config.yaml, or / Auto-naming in the TUI; "
198
- "naming.first_after.minutes sets how long after its first prompt)[/dim]")
197
+ rprint("[dim](naming: in config.yaml, or \"Auto-naming settings…\" in the TUI palette: "
198
+ "enabled, first_after.minutes, rename_every.minutes, max_renames)[/dim]")
199
199
 
200
200
  rprint("\n[bold]Always refused[/bold] (even with --force-name)")
201
201
  rprint(" a name outside letters, digits, - and _ (at most 64)")
@@ -246,10 +246,11 @@ def name_suggest(
246
246
  One model call (the summarizer's, or naming.provider), billed to the
247
247
  `overcode` billing code. Works whether or not naming.enabled is on.
248
248
  """
249
+ import time
249
250
  from pathlib import Path
250
251
  from ..config import get_naming_config
251
- from ..namer import (advice_for, gather_inputs, make_client, naming_context, recent_archived,
252
- record_spend, suggest)
252
+ from ..namer import (advice_for, gather_inputs, load_state, make_client, naming_context,
253
+ recent_archived, record_spend, suggest)
253
254
  from ..session_manager import SessionManager
254
255
  from ..summarizer_prompts import load_naming_prompt
255
256
  from ._shared import find_agent
@@ -278,7 +279,8 @@ def name_suggest(
278
279
  sessions = sm.list_sessions()
279
280
  archived = recent_archived(sm)
280
281
  inputs = gather_inputs(sess, tmux_session=tmux_session, sessions=sessions, archived=archived,
281
- max_length=cfg["max_length"], pane=pane)
282
+ max_length=cfg["max_length"], pane=pane,
283
+ state=load_state(tmux_session, sess.id), now=time.time())
282
284
  result = suggest(inputs, naming_context(cfg, sessions, archived, sess),
283
285
  client=make_client(cfg.get("provider")), template=load_naming_prompt(),
284
286
  advice=advice)
@@ -97,6 +97,7 @@ from .render_supervision import (
97
97
  render_wrapper_plain,
98
98
  )
99
99
  from .render_virtual import (
100
+ render_virtual_alert,
100
101
  hover_virtual_name,
101
102
  render_virtual_cost,
102
103
  render_virtual_expand,
@@ -251,7 +252,8 @@ SUMMARY_COLUMNS: List[SummaryColumn] = [
251
252
  name="Alert",
252
253
  description="Flags an agent that stalled and you haven't looked at since",
253
254
  sort_key=lambda ctx: int(ctx.is_unvisited_stalled),
254
- sort_desc=True),
255
+ sort_desc=True,
256
+ virtual_render=render_virtual_alert),
255
257
  SummaryColumn(id="time_in_state", ticks=True, group="identity", detail_levels=ALL, render=render_time_in_state,
256
258
  header="ST", name="Time in State",
257
259
  description="How long the agent has been in its current status",
@@ -115,6 +115,15 @@ def render_virtual_status(ctx: ColumnContext) -> ColumnOutput:
115
115
  return render_status_symbol(ctx)
116
116
 
117
117
 
118
+ def render_virtual_alert(ctx: ColumnContext) -> ColumnOutput:
119
+ """Blank, as an agent's bell cell with no bell: a member never rings it.
120
+
121
+ The "-" placeholder there would touch the time in state and read as a
122
+ minus sign (#545).
123
+ """
124
+ return [(" ", "dim")]
125
+
126
+
118
127
  def render_virtual_time(ctx: ColumnContext) -> ColumnOutput:
119
128
  """Time in state: since it started; its run time once finished."""
120
129
  seconds = virtual_seconds(_line(ctx), _now())
@@ -136,6 +136,14 @@ def _summarizer_state(app: Any) -> StateView:
136
136
  return _toggle(None)
137
137
 
138
138
 
139
+ def _budget_reclaim_state(app: Any) -> StateView:
140
+ try:
141
+ from .config import BUDGET_RECLAIM_MODES, get_budget_reclaim_mode
142
+ return _cycle(BUDGET_RECLAIM_MODES, get_budget_reclaim_mode())
143
+ except Exception:
144
+ return StateView(("auto", "manual"), None)
145
+
146
+
139
147
  def _auto_naming_state(app: Any) -> StateView:
140
148
  try:
141
149
  from .config import get_naming_config
@@ -408,6 +416,11 @@ COMMANDS: Tuple[PaletteCommand, ...] = (
408
416
  _C("open_passthru_config", "Passthru keys…", "Settings", "forward ctrl"),
409
417
  _C("open_status_colours", "Status colours…", "Settings",
410
418
  "theme light lights colour color blind colorblind custom glyph emoji legend"),
419
+ _C("toggle_budget_reclaim", "Budget reclaim", "Settings",
420
+ "refund child budget finished done return parent manual auto spend money",
421
+ state=_budget_reclaim_state),
422
+ _C("open_auto_naming_settings", "Auto-naming settings…", "Settings",
423
+ "names namer rename auto-name first name re-check every minutes cap cost title"),
411
424
  _C("open_agent_visibility", "Agent visibility…", "Settings",
412
425
  "show hide killed terminated ghost sleeping asleep done children subagents "
413
426
  "delegated work finished failures rows seconds swarm"),
@@ -1046,12 +1046,40 @@ def save_billing_defaults(new_agent_code: str, default_code: str) -> None:
1046
1046
  save_config(config)
1047
1047
 
1048
1048
 
1049
+ BUDGET_RECLAIM_MODES = ("auto", "manual")
1050
+
1051
+
1052
+ def get_budget_reclaim_mode() -> str:
1053
+ """``children.budget_reclaim`` (#546): ``auto`` (default) refunds a
1054
+ finished child's unused budget to its parent; ``manual`` leaves it with
1055
+ the child until the parent runs ``overcode budget reclaim <child>``, so
1056
+ the child can be talked to again without running out."""
1057
+ section = _get_config_value("children", {})
1058
+ mode = section.get("budget_reclaim", "auto") if isinstance(section, dict) else "auto"
1059
+ mode = str(mode).strip().lower()
1060
+ return mode if mode in BUDGET_RECLAIM_MODES else "auto"
1061
+
1062
+
1063
+ def save_budget_reclaim_mode(mode: str) -> None:
1064
+ """Set ``children.budget_reclaim`` in config.yaml, keeping the rest of ``children:``."""
1065
+ if mode not in BUDGET_RECLAIM_MODES:
1066
+ raise ValueError(f"budget_reclaim must be one of {BUDGET_RECLAIM_MODES}, not {mode!r}")
1067
+ config = load_config()
1068
+ children = config.get("children")
1069
+ children = dict(children) if isinstance(children, dict) else {}
1070
+ children["budget_reclaim"] = mode
1071
+ config["children"] = children
1072
+ save_config(config)
1073
+
1074
+
1049
1075
  NAMING_MAX_LENGTH_DEFAULT = 18
1050
- _NAMING_KEYS = ("enabled", "advice", "max_length", "rules", "first_after", "max_renames",
1051
- "cost_cap_per_day", "provider", "cli_title")
1076
+ NAMING_COST_CAP_DEFAULT = 10.0 # USD a day for the namer's model calls
1077
+ _NAMING_KEYS = ("enabled", "advice", "max_length", "rules", "first_after", "rename_every",
1078
+ "max_renames", "cost_cap_per_day", "provider", "cli_title")
1052
1079
  _NAMING_RULE_KEYS = ("pattern", "max_length", "forbid", "require", "no_repo_prefix",
1053
1080
  "recent_archived_hours", "llm_check", "warn_humans")
1054
1081
  _NAMING_FIRST_AFTER = {"minutes": 5.0}
1082
+ _NAMING_RENAME_EVERY = {"minutes": 30.0}
1055
1083
 
1056
1084
 
1057
1085
  def _positive_int(value) -> Optional[int]:
@@ -1088,6 +1116,28 @@ def save_naming_enabled(enabled: bool) -> None:
1088
1116
  save_config(config)
1089
1117
 
1090
1118
 
1119
+ # naming: keys whose value is {minutes: N} in config.yaml
1120
+ _NAMING_MINUTES_KEYS = ("first_after", "rename_every")
1121
+
1122
+
1123
+ def save_naming_setting(key: str, value) -> None:
1124
+ """Set one ``naming.<key>`` in config.yaml (the auto-naming dialog),
1125
+ keeping the rest of ``naming:``. ``first_after`` and ``rename_every``
1126
+ take minutes; ``max_renames`` None removes the cap."""
1127
+ config = load_config()
1128
+ naming = config.get("naming")
1129
+ naming = dict(naming) if isinstance(naming, dict) else {}
1130
+ if key in _NAMING_MINUTES_KEYS:
1131
+ block = naming.get(key)
1132
+ block = dict(block) if isinstance(block, dict) else {}
1133
+ block["minutes"] = value
1134
+ naming[key] = block
1135
+ else:
1136
+ naming[key] = value
1137
+ config["naming"] = naming
1138
+ save_config(config)
1139
+
1140
+
1091
1141
  def describe_auto_naming(cfg: Optional[dict] = None) -> str:
1092
1142
  """Auto-naming in one line, for the palette, the new-agent dialog, the
1093
1143
  naming lab and ``overcode name policy``."""
@@ -1098,7 +1148,13 @@ def describe_auto_naming(cfg: Optional[dict] = None) -> str:
1098
1148
  minutes = float(first.get("minutes") or 0)
1099
1149
  when = (f"{minutes:g} min after its first prompt" if minutes
1100
1150
  else "as soon as it starts on its first prompt")
1101
- return f"on: a default name is replaced {when}, following the naming advice"
1151
+ every = float((cfg.get("rename_every") or {}).get("minutes") or 0)
1152
+ then = (f"; then re-checked every {every:g} min of work, renamed when the work has moved on"
1153
+ if every else "")
1154
+ cap = cfg.get("max_renames")
1155
+ if every and cap is not None:
1156
+ then += f" (at most {cap} auto renames)"
1157
+ return f"on: a default name is replaced {when}, following the naming advice{then}"
1102
1158
 
1103
1159
 
1104
1160
  def get_naming_config() -> dict:
@@ -1121,8 +1177,9 @@ def get_naming_config() -> dict:
1121
1177
  warn_humans: false # warn (never refuse) a human's -n too
1122
1178
  first_after: {minutes: 5} # the first name, this long after the agent's
1123
1179
  # first prompt, once it has started on it
1124
- max_renames: 2
1125
- cost_cap_per_day: 0.50
1180
+ rename_every: {minutes: 30} # then a check per this much work (0 = never)
1181
+ max_renames: null # a cap on auto renames per agent (null = none)
1182
+ cost_cap_per_day: 10.00
1126
1183
  provider: {...} # api_type/api_url/model/api_key_var; default: the summarizer: block
1127
1184
  cli_title: true # keep Claude's own session name (--name, /rename) in step
1128
1185
 
@@ -1200,9 +1257,20 @@ def get_naming_config() -> dict:
1200
1257
  warnings.append(f"naming.first_after: '{key}' is not used — the first name comes "
1201
1258
  "first_after.minutes after the agent's first prompt")
1202
1259
  first_after = {k: _non_negative(raw_first.get(k, d), d) for k, d in _NAMING_FIRST_AFTER.items()}
1203
- max_renames = cfg.get("max_renames", 2)
1204
- max_renames = max_renames if isinstance(max_renames, int) and not isinstance(
1205
- max_renames, bool) and max_renames >= 0 else 2
1260
+ raw_every = cfg.get("rename_every") or {}
1261
+ if not isinstance(raw_every, dict):
1262
+ warnings.append("naming.rename_every: should be a mapping like {minutes: 30} — ignored")
1263
+ raw_every = {}
1264
+ for key in raw_every:
1265
+ if key not in _NAMING_RENAME_EVERY:
1266
+ warnings.append(f"naming.rename_every: '{key}' is not used — names are re-checked "
1267
+ "every rename_every.minutes of work")
1268
+ rename_every = {k: _non_negative(raw_every.get(k, d), d) for k, d in _NAMING_RENAME_EVERY.items()}
1269
+ max_renames = cfg.get("max_renames")
1270
+ if max_renames is not None and not (isinstance(max_renames, int) and not isinstance(
1271
+ max_renames, bool) and max_renames >= 0):
1272
+ warnings.append("naming.max_renames: should be a whole number or null — no cap")
1273
+ max_renames = None
1206
1274
  provider = cfg.get("provider") if isinstance(cfg.get("provider"), dict) else None
1207
1275
  if cfg.get("provider") is not None and provider is None:
1208
1276
  warnings.append("naming.provider: should be a mapping — using the summarizer: block")
@@ -1213,8 +1281,10 @@ def get_naming_config() -> dict:
1213
1281
  "max_length": max_length,
1214
1282
  "rules": rules,
1215
1283
  "first_after": first_after,
1284
+ "rename_every": rename_every,
1216
1285
  "max_renames": max_renames,
1217
- "cost_cap_per_day": _non_negative(cfg.get("cost_cap_per_day", 0.50), 0.50),
1286
+ "cost_cap_per_day": _non_negative(cfg.get("cost_cap_per_day", NAMING_COST_CAP_DEFAULT),
1287
+ NAMING_COST_CAP_DEFAULT),
1218
1288
  "provider": provider,
1219
1289
  "cli_title": cfg.get("cli_title") is not False,
1220
1290
  "warnings": warnings,