0.167.0

Added

  • Семантика «0 = без лимита» для ограничений агентского цикла. Раньше верхние предохранители хода агента имели жёсткий потолок (Min: 1), и пользователь не мог полностью отключить их для долгих автономных задач. Теперь значение 0 для трёх настроек означает «без лимита»:

  • agent_max_iterations (internal/settings/defs.go, internal/agent/runner.go). 0 = цикл ReAct выполняется до терминального stop, ctx-cancel или нижестоящих предохранителей (stream_idle_timeout_seconds, tool_timeout_seconds, agent_turn_timeout_minutes).

  • agent_turn_timeout_minutes (internal/agent/actor.go). 0 = контекст хода без deadline (context.WithCancel вместо WithTimeout); ход длится до финального ответа, /stop или отмены сессии. persistTurnTimeout вызывается только при turnTimeout > 0.

  • subagent_max_iterations (глобальная, internal/agent/subagent_config.go, subagent.go, spawn_tool.go). 0 = субагент ограничен только subagent_timeout_seconds.

Остающиеся предохранители при всех 0: stream_idle_timeout_seconds (молчание LLM), tool_timeout_seconds (один инструмент), /stop, agent_idle_timeout_minutes (между ходами), квоты LLM-провайдера.

Безопасность: безлимит через self-tool (my set max_iterations=0) запрещён — LLM не может снять свой потолок mid-run (runaway-risk); безлимит задаётся только администратором. Self-tool отображает iterations_remaining: ∞ (unlimited) в безлимитном режиме.

Clamp-защита: subagentMaxIterationsCap = 50 (константа) применяется к spawn-tool params и profile overrides; безлимитное 0 не клемпится. LoadSubagentsConfig ограничивает итоговое cfg.MaxIterations к cap через defer на именованном return (покрывает все ранние return). Отрицательные значения трактуются как sign-error и сбрасываются в cfg (0 зарезервирован за осознанным безлимитом). Clamp субагента поднят с жёстко зашитого 30 до 50 (синхронизирован с Max реестра).

Per-agent JSON subagents.max_iterations=0 по-прежнему означает «наследовать глобальную настройку» (НЕ безлимит) — без изменений, без рефакторинга *int.

Тесты: TestRunner_MaxIterations_Unlimited, TestLoadTurnTimeout_Zero, TestLoadSubagentsConfig_GlobalAboveCapClamped, TestLoadSubagentsConfig_PerAgentJSONAboveCapClamped, TestClampSubagentMaxIter (7 кейсов), TestSelfTool_SetMaxIterations_Zero_Rejected, TestSelfTool_CheckMaxIterations_Unlimited, TestSelfTool_CheckIterationsRemaining_Unlimited, TestSelfTool_CheckAll_Unlimited, TestSetMaxIterations_Zero_Valid, TestFormatMaxIterations, TestFormatIterationsRemaining.