aru-code 0.59.0__tar.gz → 0.61.0__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 (218) hide show
  1. {aru_code-0.59.0/aru_code.egg-info → aru_code-0.61.0}/PKG-INFO +1 -1
  2. aru_code-0.61.0/aru/__init__.py +1 -0
  3. {aru_code-0.59.0 → aru_code-0.61.0}/aru/agents/base.py +60 -5
  4. {aru_code-0.59.0 → aru_code-0.61.0}/aru/agents/planner.py +4 -3
  5. {aru_code-0.59.0 → aru_code-0.61.0}/aru/auth.py +3 -0
  6. {aru_code-0.59.0 → aru_code-0.61.0}/aru/cli.py +18 -13
  7. aru_code-0.61.0/aru/codex_oauth.py +588 -0
  8. {aru_code-0.59.0 → aru_code-0.61.0}/aru/commands.py +118 -3
  9. {aru_code-0.59.0 → aru_code-0.61.0}/aru/context.py +2 -2
  10. {aru_code-0.59.0 → aru_code-0.61.0}/aru/history_blocks.py +66 -5
  11. {aru_code-0.59.0 → aru_code-0.61.0}/aru/memory/extractor.py +2 -2
  12. {aru_code-0.59.0 → aru_code-0.61.0}/aru/permissions.py +12 -4
  13. {aru_code-0.59.0 → aru_code-0.61.0}/aru/providers.py +225 -1
  14. {aru_code-0.59.0 → aru_code-0.61.0}/aru/runner.py +84 -0
  15. {aru_code-0.59.0 → aru_code-0.61.0}/aru/session.py +15 -1
  16. aru_code-0.61.0/aru/state.py +181 -0
  17. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/delegate.py +10 -1
  18. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/file_ops.py +46 -0
  19. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/registry.py +12 -2
  20. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/tasklist.py +17 -2
  21. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/app.py +35 -43
  22. {aru_code-0.59.0 → aru_code-0.61.0/aru_code.egg-info}/PKG-INFO +1 -1
  23. {aru_code-0.59.0 → aru_code-0.61.0}/aru_code.egg-info/SOURCES.txt +5 -0
  24. {aru_code-0.59.0 → aru_code-0.61.0}/pyproject.toml +1 -1
  25. aru_code-0.61.0/tests/test_codex_oauth.py +406 -0
  26. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_confabulation_regression.py +74 -13
  27. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_connect_command.py +3 -1
  28. aru_code-0.61.0/tests/test_connect_oauth.py +387 -0
  29. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_runner_recovery.py +11 -1
  30. aru_code-0.61.0/tests/test_state_recent_models.py +239 -0
  31. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_slash_model.py +3 -3
  32. aru_code-0.59.0/aru/__init__.py +0 -1
  33. {aru_code-0.59.0 → aru_code-0.61.0}/LICENSE +0 -0
  34. {aru_code-0.59.0 → aru_code-0.61.0}/README.md +0 -0
  35. {aru_code-0.59.0 → aru_code-0.61.0}/aru/_debug/__init__.py +0 -0
  36. {aru_code-0.59.0 → aru_code-0.61.0}/aru/_debug/analyze_trace.py +0 -0
  37. {aru_code-0.59.0 → aru_code-0.61.0}/aru/_debug/loop_tracer.py +0 -0
  38. {aru_code-0.59.0 → aru_code-0.61.0}/aru/agent_factory.py +0 -0
  39. {aru_code-0.59.0 → aru_code-0.61.0}/aru/agents/__init__.py +0 -0
  40. {aru_code-0.59.0 → aru_code-0.61.0}/aru/agents/catalog.py +0 -0
  41. {aru_code-0.59.0 → aru_code-0.61.0}/aru/cache_patch.py +0 -0
  42. {aru_code-0.59.0 → aru_code-0.61.0}/aru/checkpoints.py +0 -0
  43. {aru_code-0.59.0 → aru_code-0.61.0}/aru/config.py +0 -0
  44. {aru_code-0.59.0 → aru_code-0.61.0}/aru/display.py +0 -0
  45. {aru_code-0.59.0 → aru_code-0.61.0}/aru/doom_loop.py +0 -0
  46. {aru_code-0.59.0 → aru_code-0.61.0}/aru/events.py +0 -0
  47. {aru_code-0.59.0 → aru_code-0.61.0}/aru/format/__init__.py +0 -0
  48. {aru_code-0.59.0 → aru_code-0.61.0}/aru/format/manager.py +0 -0
  49. {aru_code-0.59.0 → aru_code-0.61.0}/aru/format/runner.py +0 -0
  50. {aru_code-0.59.0 → aru_code-0.61.0}/aru/lsp/__init__.py +0 -0
  51. {aru_code-0.59.0 → aru_code-0.61.0}/aru/lsp/client.py +0 -0
  52. {aru_code-0.59.0 → aru_code-0.61.0}/aru/lsp/manager.py +0 -0
  53. {aru_code-0.59.0 → aru_code-0.61.0}/aru/lsp/protocol.py +0 -0
  54. {aru_code-0.59.0 → aru_code-0.61.0}/aru/memory/__init__.py +0 -0
  55. {aru_code-0.59.0 → aru_code-0.61.0}/aru/memory/loader.py +0 -0
  56. {aru_code-0.59.0 → aru_code-0.61.0}/aru/memory/store.py +0 -0
  57. {aru_code-0.59.0 → aru_code-0.61.0}/aru/plugin_cache.py +0 -0
  58. {aru_code-0.59.0 → aru_code-0.61.0}/aru/plugins/__init__.py +0 -0
  59. {aru_code-0.59.0 → aru_code-0.61.0}/aru/plugins/custom_tools.py +0 -0
  60. {aru_code-0.59.0 → aru_code-0.61.0}/aru/plugins/hooks.py +0 -0
  61. {aru_code-0.59.0 → aru_code-0.61.0}/aru/plugins/manager.py +0 -0
  62. {aru_code-0.59.0 → aru_code-0.61.0}/aru/plugins/tool_api.py +0 -0
  63. {aru_code-0.59.0 → aru_code-0.61.0}/aru/runtime.py +0 -0
  64. {aru_code-0.59.0 → aru_code-0.61.0}/aru/select.py +0 -0
  65. {aru_code-0.59.0 → aru_code-0.61.0}/aru/sinks.py +0 -0
  66. {aru_code-0.59.0 → aru_code-0.61.0}/aru/streaming.py +0 -0
  67. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tool_policy.py +0 -0
  68. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/__init__.py +0 -0
  69. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/_diff.py +0 -0
  70. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/_shared.py +0 -0
  71. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/apply_patch.py +0 -0
  72. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/apply_patch_prompt.txt +0 -0
  73. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/ast_tools.py +0 -0
  74. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/codebase.py +0 -0
  75. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/delegate_prompt.txt +0 -0
  76. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/gitignore.py +0 -0
  77. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/lsp.py +0 -0
  78. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/mcp_client.py +0 -0
  79. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/memory_tool.py +0 -0
  80. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/plan_mode.py +0 -0
  81. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/ranker.py +0 -0
  82. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/search.py +0 -0
  83. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/shell.py +0 -0
  84. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/skill.py +0 -0
  85. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/web.py +0 -0
  86. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tools/worktree.py +0 -0
  87. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/__init__.py +0 -0
  88. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/log_bridge.py +0 -0
  89. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/notifications.py +0 -0
  90. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/sanitize.py +0 -0
  91. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/screens/__init__.py +0 -0
  92. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/screens/choice.py +0 -0
  93. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/screens/confirm.py +0 -0
  94. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/screens/keymap.py +0 -0
  95. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/screens/search.py +0 -0
  96. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/screens/session_picker.py +0 -0
  97. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/screens/text_input.py +0 -0
  98. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/sinks.py +0 -0
  99. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/slash_bridge.py +0 -0
  100. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/themes.py +0 -0
  101. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/ui.py +0 -0
  102. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/__init__.py +0 -0
  103. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/chat.py +0 -0
  104. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/completer.py +0 -0
  105. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/context_pane.py +0 -0
  106. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/file_link.py +0 -0
  107. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/header.py +0 -0
  108. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/inline_choice.py +0 -0
  109. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/loaded_pane.py +0 -0
  110. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/prompt_area.py +0 -0
  111. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/prompt_queue.py +0 -0
  112. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/status.py +0 -0
  113. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/subagent_panel.py +0 -0
  114. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/tasklist_panel.py +0 -0
  115. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/thinking.py +0 -0
  116. {aru_code-0.59.0 → aru_code-0.61.0}/aru/tui/widgets/tools.py +0 -0
  117. {aru_code-0.59.0 → aru_code-0.61.0}/aru/ui.py +0 -0
  118. {aru_code-0.59.0 → aru_code-0.61.0}/aru_code.egg-info/dependency_links.txt +0 -0
  119. {aru_code-0.59.0 → aru_code-0.61.0}/aru_code.egg-info/entry_points.txt +0 -0
  120. {aru_code-0.59.0 → aru_code-0.61.0}/aru_code.egg-info/requires.txt +0 -0
  121. {aru_code-0.59.0 → aru_code-0.61.0}/aru_code.egg-info/top_level.txt +0 -0
  122. {aru_code-0.59.0 → aru_code-0.61.0}/setup.cfg +0 -0
  123. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_agents_base.py +0 -0
  124. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_agents_md_coverage.py +0 -0
  125. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_apply_patch.py +0 -0
  126. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_async_tool_permission.py +0 -0
  127. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_auth_store.py +0 -0
  128. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cache_patch_metrics.py +0 -0
  129. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cache_patch_stop_reason.py +0 -0
  130. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_catalog.py +0 -0
  131. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_chat_scrollable.py +0 -0
  132. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_checkpoints.py +0 -0
  133. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cli.py +0 -0
  134. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cli_advanced.py +0 -0
  135. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cli_base.py +0 -0
  136. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cli_new.py +0 -0
  137. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cli_session.py +0 -0
  138. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cli_shell.py +0 -0
  139. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_codebase.py +0 -0
  140. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_config.py +0 -0
  141. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_context.py +0 -0
  142. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_context_pane.py +0 -0
  143. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_cwd_awareness.py +0 -0
  144. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_delegate.py +0 -0
  145. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_doom_loop.py +0 -0
  146. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_events_backward_compat.py +0 -0
  147. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_events_schema.py +0 -0
  148. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_fork_ctx_concurrency.py +0 -0
  149. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_format.py +0 -0
  150. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_gitignore.py +0 -0
  151. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_guardrails_scenarios.py +0 -0
  152. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_invoke_skill.py +0 -0
  153. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_invoked_skills.py +0 -0
  154. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_loaded_pane_path.py +0 -0
  155. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_lsp.py +0 -0
  156. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_lsp_rename.py +0 -0
  157. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_main.py +0 -0
  158. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_markdown_to_text.py +0 -0
  159. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_mcp_client.py +0 -0
  160. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_mcp_health.py +0 -0
  161. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_memory.py +0 -0
  162. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_memory_tool.py +0 -0
  163. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_microcompact.py +0 -0
  164. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_permission_timeout_suspension.py +0 -0
  165. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_permissions.py +0 -0
  166. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_plan_mode_refactor.py +0 -0
  167. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_plugin_cache.py +0 -0
  168. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_plugin_errors.py +0 -0
  169. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_plugin_hooks_v2.py +0 -0
  170. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_plugins.py +0 -0
  171. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_providers.py +0 -0
  172. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_ranker.py +0 -0
  173. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_reasoning.py +0 -0
  174. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_runner_interrupt.py +0 -0
  175. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_runtime.py +0 -0
  176. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_select.py +0 -0
  177. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_session_free_cost.py +0 -0
  178. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_skill_disallowed_tools.py +0 -0
  179. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_status_breakdown.py +0 -0
  180. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_status_cost.py +0 -0
  181. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_streaming_sink.py +0 -0
  182. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_subagent_tool_events.py +0 -0
  183. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tasklist.py +0 -0
  184. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_thread_tool_timeout.py +0 -0
  185. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tool_policy.py +0 -0
  186. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_truncation_marker.py +0 -0
  187. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_app_boot.py +0 -0
  188. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_bindings.py +0 -0
  189. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_bus_flow.py +0 -0
  190. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_chat.py +0 -0
  191. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_chat_adversarial.py +0 -0
  192. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_completer.py +0 -0
  193. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_completer_dynamic.py +0 -0
  194. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_connect_wiring.py +0 -0
  195. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_copy.py +0 -0
  196. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_error_display.py +0 -0
  197. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_file_link.py +0 -0
  198. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_input_behaviour.py +0 -0
  199. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_layer12_recovery.py +0 -0
  200. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_layer13_recovery.py +0 -0
  201. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_mention_expand.py +0 -0
  202. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_modals.py +0 -0
  203. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_mode_cycle.py +0 -0
  204. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_native_selection.py +0 -0
  205. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_permission_flow.py +0 -0
  206. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_plan_task_render.py +0 -0
  207. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_prompt_queue.py +0 -0
  208. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_shell_bang.py +0 -0
  209. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_sidebar_toggle.py +0 -0
  210. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_slash_bridge.py +0 -0
  211. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_snapshot_smoke.py +0 -0
  212. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_subagent_panel.py +0 -0
  213. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_theme.py +0 -0
  214. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_thinking_and_boot.py +0 -0
  215. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_tui_widgets_visual.py +0 -0
  216. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_ui_adapter.py +0 -0
  217. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_worktree.py +0 -0
  218. {aru_code-0.59.0 → aru_code-0.61.0}/tests/test_worktree_session_restore.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aru-code
3
- Version: 0.59.0
3
+ Version: 0.61.0
4
4
  Summary: A Claude Code clone built with Agno agents
5
5
  Author-email: Estevao <estevaofon@gmail.com>
6
6
  License-Expression: MIT
@@ -0,0 +1 @@
1
+ __version__ = "0.61.0"
@@ -3,6 +3,33 @@
3
3
  # Common rules shared across all agents (planner, executor, general).
4
4
  # Each agent appends its role-specific instructions to this base.
5
5
  BASE_INSTRUCTIONS = """\
6
+ ## Autonomy and Persistence
7
+
8
+ Persist until the task is fully handled end-to-end within the current turn whenever feasible: \
9
+ do not stop at analysis or partial fixes; carry changes through implementation, verification, \
10
+ and a clear explanation of outcomes unless the user explicitly pauses or redirects you. \
11
+ Assume the user wants you to make code changes or run tools to solve the problem — \
12
+ it is bad to output your proposed solution in a message and stop; go ahead and actually \
13
+ implement the change. If you encounter challenges or blockers, attempt to resolve them yourself.
14
+
15
+ ## Task execution
16
+
17
+ You are a coding agent. Please keep going until the query is completely resolved, before \
18
+ ending your turn and yielding back to the user. Only terminate your turn when you are sure \
19
+ that the problem is solved. Autonomously resolve the query to the best of your ability, \
20
+ using the tools available to you, before coming back to the user. Do NOT guess or make up \
21
+ an answer.
22
+
23
+ If a review, test run, plan step, or check surfaces concrete follow-up work that is clearly \
24
+ in scope, resolve it in the same turn. "More work I identified" is NOT a blocker — it is the \
25
+ next thing to do. The turn ends only when (a) the task is completely resolved and verified, \
26
+ (b) you hit a real blocker that needs information only the user has, or (c) the plan / task \
27
+ list is exhausted with every item terminal (completed / skipped / failed).
28
+
29
+ End your turn by reporting what you DID, not by previewing what should happen next. Phrases \
30
+ like "Próximo passo objetivo é…", "Next step is…", "I will now…" are forbidden as turn-end \
31
+ content — if you write them you must execute them in the same turn.
32
+
6
33
  ## Output rules — CRITICAL for token efficiency
7
34
 
8
35
  Minimize output tokens. Your responses should be fewer than 4 lines unless the user \
@@ -144,7 +171,10 @@ You are a software engineer agent. Your job is to implement code changes.
144
171
  You MUST call `create_task_list` as your FIRST action before any other tool call. \
145
172
  Define 1-10 concrete subtasks for the current step. Then execute them in order, \
146
173
  calling `update_task` to mark each as "completed" or "failed" as you go. \
147
- When all subtasks are done, STOP. Do not add extra actions beyond the task list.
174
+ When all subtasks finish, output a brief summary of what changed. The turn ends \
175
+ only when the macro plan / multi-task workflow is also exhausted; if there are \
176
+ more plan steps or skill-driven tasks pending, continue executing them in the \
177
+ same turn — finishing a subtask list is not finishing the user's request.
148
178
 
149
179
  ## Subtask granularity — CRITICAL
150
180
  Each subtask should touch at most **3-4 files**. If the step involves many files, \
@@ -212,8 +242,10 @@ response. Read-only fan-out has no write-path hazards.
212
242
  When given a plan, execute it step by step. When given a direct task, figure out what needs to be done and do it.
213
243
  **ZERO narration between tool calls.** No "Now I have enough context...", \
214
244
  "Let me check...", "Now I understand...", "I need to...". Just call the next tool silently. \
215
- Only output text AFTER all subtasks are finished a brief summary of what was done. \
216
- Text output is ONLY for the final result or when you hit a blocker that needs user input.
245
+ Output text only when (a) the user's full request is resolved including all macro plan \
246
+ steps and skill-driven tasks or (b) you hit a blocker that needs user input. Completing \
247
+ a single subtask list or a single delegated task is NOT a turn boundary; continue with the \
248
+ next pending item in the same turn.
217
249
 
218
250
  **Never retry failed shell commands with alternative syntax.** If a command fails, diagnose \
219
251
  the error — do not try `cmd /c`, absolute paths, or other wrappers hoping one works.
@@ -352,6 +384,23 @@ those tools — finish the plan and call exit_plan_mode instead.
352
384
  For simple tasks (1-2 file changes) where the user did NOT ask for a plan, \
353
385
  execute directly without entering plan mode.
354
386
 
387
+ ## Subtask lists vs the user's request — CRITICAL
388
+
389
+ `create_task_list` / `update_task` track subtasks for ONE unit of work — \
390
+ typically a single plan step, a single delegated task, or a single Task in a \
391
+ multi-task skill workflow (e.g. /subagent-driven-development). Finishing a \
392
+ subtask list is NOT finishing the user's request. When the `update_task` \
393
+ tool_result says "All subtasks finished. Output a brief summary", that summary \
394
+ is the summary of THAT unit only — not the whole turn.
395
+
396
+ Before yielding, check: is there a pending plan step? A skill workflow that \
397
+ declares more Tasks (Task 1..N)? A check that surfaced more work? If yes, \
398
+ keep going in the same turn — call `create_task_list` again for the next \
399
+ unit, or dispatch the next subagent, or call `update_plan_step` and move on. \
400
+ Phrases like "Se quiser, continuo direto para a Task N", "Próximo passo \
401
+ objetivo é…", "Next step is…" are forbidden as turn-end content. The turn \
402
+ ends only when the user's full request is exhausted.
403
+
355
404
  ## Plan execution
356
405
 
357
406
  When you see a `<system-reminder>` listing PLAN ACTIVE steps, work through them in order:
@@ -384,8 +433,14 @@ Safe parallel-write pattern (only when ALL three hold):
384
433
  2. The tasks touch disjoint file sets.
385
434
  3. No task's output is another task's input inside the same batch.
386
435
 
387
- If any of the three fails, run tasks sequentially — one `delegate_task` per \
388
- response, or stay in-session and execute the step yourself. Parallel fan-out \
436
+ If any of the three fails, run tasks sequentially — dispatch one \
437
+ `delegate_task` per assistant response (so the next one only starts after the \
438
+ previous returns), but keep doing this within the same turn until the multi-task \
439
+ plan/skill workflow is exhausted. "Sequential" means "not in parallel"; it does \
440
+ NOT mean "one task per turn" — finishing a single delegated task and then \
441
+ yielding to the user defeats skills like /subagent-driven-development that \
442
+ dispatch a fresh implementer per task. After each subagent returns, immediately \
443
+ dispatch the next pending task in the same turn. Parallel fan-out \
389
444
  for read-only research (explorer) follows the Delegation strategy rules above; \
390
445
  it does not carry these write-path hazards.\
391
446
  """
@@ -42,9 +42,10 @@ async def review_plan(request: str, plan: str) -> str:
42
42
  )
43
43
  prompt = f"## User Request\n{request}\n\n## Generated Plan\n{plan}"
44
44
  try:
45
- response = await reviewer.arun(prompt)
46
- if response and response.content and response.content.strip():
47
- return response.content.strip()
45
+ from aru.runner import arun_text_only
46
+ content = await arun_text_only(reviewer, prompt)
47
+ if content and content.strip():
48
+ return content.strip()
48
49
  except Exception:
49
50
  pass
50
51
  return plan
@@ -13,6 +13,9 @@ Schema (``info``) — a tagged union on ``type`` so future auth methods
13
13
  "provider_type": "openai", "default_model": "...", # custom provider
14
14
  "context_limit": 128000}
15
15
  {"type": "local", "base_url": "http://..."} # keyless (e.g. Ollama)
16
+ {"type": "oauth", "refresh": "...", # ChatGPT (Codex) — wired
17
+ "access": "...", "expires": 1735689600000, # by /connect → "ChatGPT
18
+ "accountId": "acc-..."} # Pro/Plus (browser)"
16
19
 
17
20
  Consumption lives in :func:`aru.providers.apply_stored_credentials`, which
18
21
  layers these onto the in-memory provider registry at startup (and again
@@ -179,23 +179,27 @@ async def run_oneshot(prompt: str, print_only: bool = False, skip_permissions: b
179
179
  from aru.tools.skill import _update_invoke_skill_docstring
180
180
  _update_invoke_skill_docstring(config.skills)
181
181
  session = Session()
182
+ # Same precedence as run_tui: aru.json default_model wins, otherwise
183
+ # fall back to the most-recent /connect or /model selection persisted
184
+ # in ~/.aru/state.json. Built-in default kicks in only when neither
185
+ # source provides a usable ref.
182
186
  if config.default_model:
183
187
  session.model_ref = config.default_model
188
+ else:
189
+ try:
190
+ from aru import state as _state
191
+ last = _state.get_last_model()
192
+ except Exception:
193
+ last = None
194
+ if last:
195
+ session.model_ref = last
184
196
 
185
197
  ctx.session = session
186
198
  ctx.model_id = session.model_id
187
199
  small_ref = config.model_aliases.get("small") if config else None
188
200
  if not small_ref:
189
- from aru.providers import resolve_model_ref
190
- provider_key, _ = resolve_model_ref(session.model_ref)
191
- _small_defaults = {
192
- "anthropic": "anthropic/claude-haiku-4-5",
193
- "openai": "openai/gpt-4o-mini",
194
- "groq": "groq/llama-3.1-8b-instant",
195
- "deepseek": "deepseek/deepseek-chat",
196
- "ollama": "ollama/llama3.1",
197
- }
198
- small_ref = _small_defaults.get(provider_key, session.model_ref)
201
+ from aru.providers import default_small_model_ref
202
+ small_ref = default_small_model_ref(session.model_ref)
199
203
  ctx.small_model_ref = small_ref
200
204
 
201
205
  extra_instructions = config.get_extra_instructions()
@@ -213,10 +217,11 @@ async def run_oneshot(prompt: str, print_only: bool = False, skip_permissions: b
213
217
  instructions=build_instructions("general", extra_instructions),
214
218
  markdown=True,
215
219
  )
216
- response = await agent.arun(prompt)
217
- if response and response.content:
220
+ from aru.runner import arun_text_only
221
+ content = await arun_text_only(agent, prompt)
222
+ if content:
218
223
  # Print raw text to stdout for piping
219
- print(response.content)
224
+ print(content)
220
225
  else:
221
226
  # Full mode with tools
222
227
  from aru.runner import build_env_context