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.
- {overcode-0.6.1/src/overcode.egg-info → overcode-0.6.2}/PKG-INFO +1 -1
- {overcode-0.6.1 → overcode-0.6.2}/docs/children.md +5 -2
- {overcode-0.6.1 → overcode-0.6.2}/docs/configuration.md +24 -8
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/auto-naming.md +16 -10
- overcode-0.6.2/docs/release-notes-0.6.2.md +27 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/tui-guide.md +2 -1
- {overcode-0.6.1 → overcode-0.6.2}/pyproject.toml +1 -1
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/bundled_skills.py +4 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/child_presets.py +4 -1
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/agent.py +8 -1
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/budget.py +4 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/config.py +34 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/naming.py +7 -5
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/registry.py +3 -1
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_virtual.py +9 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/command_palette.py +13 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/config.py +79 -9
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_stats_sync.py +46 -10
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/follow_mode.py +1 -1
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/history_reader.py +77 -23
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hook_handler.py +18 -5
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/launcher.py +78 -4
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/lifecycle.py +3 -2
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/monitor_daemon.py +3 -2
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/namer.py +177 -74
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/naming_lab.py +14 -6
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry-v2/overcode-telemetry-core.mjs +23 -14
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/paths.py +1 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/process_resources.py +53 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/rename.py +2 -3
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/session_manager.py +14 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/stats_reader.py +13 -5
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summarizer_prompts.py +12 -2
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/transcript_index.py +91 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui.py +6 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/daemon.py +16 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/dialogs.py +20 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/session.py +29 -3
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/__init__.py +2 -0
- overcode-0.6.2/src/overcode/tui_widgets/auto_naming_modal.py +259 -0
- {overcode-0.6.1 → overcode-0.6.2/src/overcode.egg-info}/PKG-INFO +1 -1
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/SOURCES.txt +2 -0
- {overcode-0.6.1 → overcode-0.6.2}/LICENSE +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/MANIFEST.in +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/README.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/README.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/advanced-features.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/architecture.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/backends.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/claude-session-files.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/cli-reference.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/00_overview.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/01_usage_log.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/02_learning_journey.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/03_overagent.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/483-484/04_phasing_and_questions.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/README.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/acp-agent-integration-analysis.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-agnostic-backends-opencode.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-backend-hermes.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-backends-codex-grok.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/agent-observability-0.6.1.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/background-shell-classification.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/README.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/SYNTHESIS.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/candidates.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-bernstein.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-bobbit.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-ccmanager.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-claude-squad.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-cmux.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-composio.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-dmux.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-gastown.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-kagan.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-orca.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-superset.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/overcode-vs-vibe-kanban.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/bakeoffs/zellij-vs-tmux.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/billing-code-ids.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/cost-model-0.6.1.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/e2e-devcontainer-testing.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/engine-0.6.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/model-alias-resolution.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/opencode-parity.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/opencode-stats-reader-performance.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/quality-review-2026-10.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/design/scaling-audit-2026-09-22.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/getting-started.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.3.0.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.4.2.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.1.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.2.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.3.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.4.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.5.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.6.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.7.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.5.8.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.6.0.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/release-notes-0.6.1.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/releasing.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/skill-profiles.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/tui-refactoring-plan.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/ux-performance-analysis-2026-03-09.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/docs/wrappers.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/setup.cfg +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/setup.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/__init__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/activity_log.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_bundle.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_files.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_identity.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_io.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_scanner.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/agent_worktree.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/__init__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/_stats_common.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/base.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/claude_code.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/codex.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/codex_stats.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/grok.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/grok_stats.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/hermes.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/hermes_stats.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/jsonl_tail.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2_patterns.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2_plugin_install.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode2_stats.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/opencode_stats.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/overagent.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/backends/shell.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/burn.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/child_lifecycle.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_bg.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_bg_ledger.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_config.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/claude_pid.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/__init__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/__main__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/_shared.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/activity.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/daemon.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/doctor.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/focal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/hooks.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/jobs.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/keys.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/lifecycle.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/models.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/monitoring.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/parallelism.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/perms.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/quota.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/sister.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/skill_profiles.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/skills.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/split.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/tags.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/trip.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/view.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cli/wrappers.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/clock.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/codes.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/__init__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/column.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/context.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/emoji.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/hover.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/layout.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_context.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_git.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_identity.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_performance.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_supervision.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_time.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/columns/render_usage.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/conversation_spend.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/conversation_warning.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/cost_check.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_cadence.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_claude_skill.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_housekeeping.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_logging.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_presence.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_process_probe.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/daemon_utils.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/claude_prices.json +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/keymaps/default.yaml +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/keymaps/vscode.yaml +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data/model_metadata.json +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/data_export.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/dependency_check.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/doctor.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/energy.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_protocol.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_recorders.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_socket.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/engine_wake.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/entrypoint.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/episodes.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/exceptions.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/git_context.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/git_stats.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hermes_plugin/__init__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hermes_plugin/plugin.yaml +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hook_dialects.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/hook_status_detector.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/idle_stages.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/implementations.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/job_launcher.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/job_manager.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/journey.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/json_store.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/keymap.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/launch_settings.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/layout_migration.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/ledger.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/mentor.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/model_metadata.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/monitor_daemon_core.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/monitor_daemon_state.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/month_files.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/name_source.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/naming_policy.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/notifier.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry-v2/index.js +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry-v2/tui.js +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/opencode_plugin/overcode-telemetry.js +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/overagent.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/pane_capture_gate.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/pid_utils.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/presence_logger.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/price_table.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/pricing.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/prompt_lab.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/protocols.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/quota_calibration.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/quota_engine.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/quota_model.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/sandbox_detect.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/session_archive.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/session_identity.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/settings.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/sister_controller.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/sister_poller.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/skill_library.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/spawn.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/spend_recompute.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/ssh_provisioner.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/standing_instructions.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/stat_gate.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_constants.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_detector.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_detector_factory.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_history.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_patterns.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/status_theme.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/statusline_tap.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summarizer_client.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summarizer_component.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summary_columns.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/summary_groups.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/supervisor_daemon.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/supervisor_daemon_core.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_files.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_history.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_publisher.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/swarm_view.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/__init__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/renderer.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/tmux_driver.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/tui_eye.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/testing/tui_eye_skill.md +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/time_context.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tmux_manager.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tmux_utils.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/trip.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui.tcss +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/__init__.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/activity.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/claude_bg.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/command_bar.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/diagnostics.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/input.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/jobs.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/mentor.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/navigation.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/overagent.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/sisters.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/swarm.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/view.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_actions/view_control.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_engine.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_engine_link.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_helpers.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_logic.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_render.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_split.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_theme.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_timers.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/agent_select_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/agent_visibility_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/billing_code_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/billing_codes_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/column_header.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/command_bar.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/command_palette.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/daemon_panel.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/daemon_status_bar.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/dialog_style.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/help_overlay.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/instruction_history_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/job_summary.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/journey_panel.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/jump_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/modal_base.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/naming_lab.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/new_agent_defaults_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/new_agent_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/passthru_config_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/preview_pane.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/rename_agent_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/session_summary.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/sister_selection_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/skills_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/status_colours_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/status_timeline.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/summary_config_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/summary_prompt_lab.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/swarm_rows.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/tmux_config_modal.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/tui_widgets/tui_log_panel.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/upgrade_consent.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/usage_analytics.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/usage_monitor.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/view_control.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_api.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_control_api.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_server.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/web_server_runner.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/worker_guard.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode/wrapper.py +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/dependency_links.txt +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/entry_points.txt +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/requires.txt +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/src/overcode.egg-info/top_level.txt +0 -0
- {overcode-0.6.1 → overcode-0.6.2}/tests/test_e2e_multi_agent_jokes.py +0 -0
|
@@ -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
|
-
|
|
911
|
-
|
|
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).
|
|
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.
|
|
933
|
-
|
|
934
|
-
|
|
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.
|
|
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
|
-
- **
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
|
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
|
-
|
|
308
|
-
|
|
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)
|
|
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
|
|
@@ -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
|
-
|
|
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
|
|
198
|
-
"
|
|
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,
|
|
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
|
-
|
|
1051
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1125
|
-
|
|
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
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
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",
|
|
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,
|