connectonion 0.6.2__py3-none-any.whl → 0.6.3__py3-none-any.whl

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 (407) hide show
  1. connectonion/__init__.py +46 -9
  2. connectonion/cli/__init__.py +11 -1
  3. connectonion/cli/browser_agent/__init__.py +11 -1
  4. connectonion/cli/browser_agent/browser.py +13 -3
  5. connectonion/cli/browser_agent/element_finder.py +8 -0
  6. connectonion/cli/browser_agent/highlight_screenshot.py +9 -1
  7. connectonion/cli/browser_agent/scroll.py +8 -0
  8. connectonion/cli/co_ai/__init__.py +6 -0
  9. connectonion/cli/co_ai/agent.py +87 -0
  10. connectonion/cli/co_ai/agents/__init__.py +5 -0
  11. connectonion/cli/co_ai/agents/registry.py +57 -0
  12. connectonion/cli/co_ai/commands/__init__.py +45 -0
  13. connectonion/cli/co_ai/commands/compact.py +173 -0
  14. connectonion/cli/co_ai/commands/cost.py +77 -0
  15. connectonion/cli/co_ai/commands/export.py +60 -0
  16. connectonion/cli/co_ai/commands/help.py +80 -0
  17. connectonion/cli/co_ai/commands/init.py +101 -0
  18. connectonion/cli/co_ai/commands/sessions.py +55 -0
  19. connectonion/cli/co_ai/commands/tasks.py +63 -0
  20. connectonion/cli/co_ai/commands/undo.py +103 -0
  21. connectonion/cli/co_ai/context.py +127 -0
  22. connectonion/cli/co_ai/main.py +52 -0
  23. connectonion/cli/co_ai/plugins/__init__.py +6 -0
  24. connectonion/cli/co_ai/plugins/reminder.py +76 -0
  25. connectonion/cli/co_ai/plugins/shell_approval.py +105 -0
  26. connectonion/cli/co_ai/prompts/agents/explore.md +79 -0
  27. connectonion/cli/co_ai/prompts/agents/plan.md +60 -0
  28. connectonion/cli/co_ai/prompts/assembler.py +303 -0
  29. connectonion/cli/{docs/co-vibecoding-principles-docs-contexts-all-in-one.md → co_ai/prompts/connectonion/README.md} +26 -0
  30. connectonion/cli/co_ai/prompts/connectonion/api.md +457 -0
  31. connectonion/cli/co_ai/prompts/connectonion/cli/README.md +805 -0
  32. connectonion/cli/co_ai/prompts/connectonion/cli/auth.md +46 -0
  33. connectonion/cli/co_ai/prompts/connectonion/cli/browser.md +235 -0
  34. connectonion/cli/co_ai/prompts/connectonion/cli/copy.md +184 -0
  35. connectonion/cli/co_ai/prompts/connectonion/cli/create.md +335 -0
  36. connectonion/cli/co_ai/prompts/connectonion/cli/init.md +431 -0
  37. connectonion/cli/co_ai/prompts/connectonion/co-directory-structure.md +214 -0
  38. connectonion/cli/co_ai/prompts/connectonion/concepts/agent.md +1078 -0
  39. connectonion/cli/co_ai/prompts/connectonion/concepts/events.md +816 -0
  40. connectonion/cli/co_ai/prompts/connectonion/concepts/llm_do.md +256 -0
  41. connectonion/cli/co_ai/prompts/connectonion/concepts/max_iterations.md +362 -0
  42. connectonion/cli/co_ai/prompts/connectonion/concepts/models.md +641 -0
  43. connectonion/cli/co_ai/prompts/connectonion/concepts/plugins.md +100 -0
  44. connectonion/cli/co_ai/prompts/connectonion/concepts/prompts.md +122 -0
  45. connectonion/cli/co_ai/prompts/connectonion/concepts/tools.md +512 -0
  46. connectonion/cli/co_ai/prompts/connectonion/concepts/transcribe.md +156 -0
  47. connectonion/cli/co_ai/prompts/connectonion/concepts/trust.md +291 -0
  48. connectonion/cli/co_ai/prompts/connectonion/debug/README.md +18 -0
  49. connectonion/cli/co_ai/prompts/connectonion/debug/auto_debug.md +1026 -0
  50. connectonion/cli/co_ai/prompts/connectonion/debug/console.md +129 -0
  51. connectonion/cli/co_ai/prompts/connectonion/debug/eval-format.md +178 -0
  52. connectonion/cli/co_ai/prompts/connectonion/debug/eval.md +230 -0
  53. connectonion/cli/co_ai/prompts/connectonion/debug/exceptions.md +307 -0
  54. connectonion/cli/co_ai/prompts/connectonion/debug/log.md +117 -0
  55. connectonion/cli/co_ai/prompts/connectonion/debug/xray.md +215 -0
  56. connectonion/cli/co_ai/prompts/connectonion/design-decisions/001-choosing-input-method.md +202 -0
  57. connectonion/cli/co_ai/prompts/connectonion/design-decisions/002-choosing-llm-function-name.md +202 -0
  58. connectonion/cli/co_ai/prompts/connectonion/design-decisions/003-choosing-trust-keyword.md +141 -0
  59. connectonion/cli/co_ai/prompts/connectonion/design-decisions/004-cli-create-flow.md +117 -0
  60. connectonion/cli/co_ai/prompts/connectonion/design-decisions/005-designing-agent-network-protocol.md +503 -0
  61. connectonion/cli/co_ai/prompts/connectonion/design-decisions/006-agent-address-format.md +305 -0
  62. connectonion/cli/co_ai/prompts/connectonion/design-decisions/007-authentication-backend-design.md +240 -0
  63. connectonion/cli/co_ai/prompts/connectonion/design-decisions/008-naming-is-hard.md +228 -0
  64. connectonion/cli/co_ai/prompts/connectonion/design-decisions/009-why-connect-function.md +167 -0
  65. connectonion/cli/co_ai/prompts/connectonion/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
  66. connectonion/cli/co_ai/prompts/connectonion/design-decisions/011-global-config-identity-management.md +357 -0
  67. connectonion/cli/co_ai/prompts/connectonion/design-decisions/012-tool-execution-separation.md +259 -0
  68. connectonion/cli/co_ai/prompts/connectonion/design-decisions/013-debug-and-logging-design.md +253 -0
  69. connectonion/cli/co_ai/prompts/connectonion/design-decisions/014-hook-system-design.md +510 -0
  70. connectonion/cli/co_ai/prompts/connectonion/design-decisions/015-interactive-auto-debug-design.md +837 -0
  71. connectonion/cli/co_ai/prompts/connectonion/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
  72. connectonion/cli/co_ai/prompts/connectonion/design-decisions/017-session-logging-and-eval-format.md +120 -0
  73. connectonion/cli/co_ai/prompts/connectonion/design-decisions/018-event-api-naming.md +274 -0
  74. connectonion/cli/co_ai/prompts/connectonion/design-decisions/019-agent-lifecycle-design.md +655 -0
  75. connectonion/cli/co_ai/prompts/connectonion/design-decisions/020-trust-system-and-network-architecture.md +503 -0
  76. connectonion/cli/co_ai/prompts/connectonion/design-decisions/021-task-storage-jsonl-design.md +496 -0
  77. connectonion/cli/co_ai/prompts/connectonion/design-decisions/022-raw-asgi-implementation.md +273 -0
  78. connectonion/cli/co_ai/prompts/connectonion/examples/agent_reasoning.md +62 -0
  79. connectonion/cli/co_ai/prompts/connectonion/examples/atomic_tools.md +24 -0
  80. connectonion/cli/co_ai/prompts/connectonion/examples/load_guide.md +18 -0
  81. connectonion/cli/co_ai/prompts/connectonion/examples.md +0 -0
  82. connectonion/cli/co_ai/prompts/connectonion/hook-system-options.md +364 -0
  83. connectonion/cli/co_ai/prompts/connectonion/index.md +162 -0
  84. connectonion/cli/co_ai/prompts/connectonion/integrations/README.md +12 -0
  85. connectonion/cli/co_ai/prompts/connectonion/integrations/auth.md +450 -0
  86. connectonion/cli/co_ai/prompts/connectonion/integrations/google.md +431 -0
  87. connectonion/cli/co_ai/prompts/connectonion/integrations/microsoft.md +370 -0
  88. connectonion/cli/co_ai/prompts/connectonion/network/README.md +14 -0
  89. connectonion/cli/co_ai/prompts/connectonion/network/connect.md +543 -0
  90. connectonion/cli/co_ai/prompts/connectonion/network/connection.md +538 -0
  91. connectonion/cli/co_ai/prompts/connectonion/network/deploy.md +123 -0
  92. connectonion/cli/co_ai/prompts/connectonion/network/host.md +1049 -0
  93. connectonion/cli/co_ai/prompts/connectonion/network/protocol/agent-relay-protocol.md +495 -0
  94. connectonion/cli/co_ai/prompts/connectonion/network/protocol/announce-message.md +115 -0
  95. connectonion/cli/co_ai/prompts/connectonion/principles.md +124 -0
  96. connectonion/cli/co_ai/prompts/connectonion/quickstart.md +261 -0
  97. connectonion/cli/co_ai/prompts/connectonion/roadmap.md +81 -0
  98. connectonion/cli/co_ai/prompts/connectonion/templates/README.md +77 -0
  99. connectonion/cli/co_ai/prompts/connectonion/templates/meta-agent.md +152 -0
  100. connectonion/cli/co_ai/prompts/connectonion/templates/minimal.md +105 -0
  101. connectonion/cli/co_ai/prompts/connectonion/templates/playwright.md +130 -0
  102. connectonion/cli/co_ai/prompts/connectonion/templates/web-research.md +144 -0
  103. connectonion/cli/co_ai/prompts/connectonion/tui/README.md +95 -0
  104. connectonion/cli/co_ai/prompts/connectonion/tui/chat.md +181 -0
  105. connectonion/cli/co_ai/prompts/connectonion/tui/divider.md +63 -0
  106. connectonion/cli/co_ai/prompts/connectonion/tui/dropdown.md +83 -0
  107. connectonion/cli/co_ai/prompts/connectonion/tui/footer.md +44 -0
  108. connectonion/cli/co_ai/prompts/connectonion/tui/fuzzy.md +68 -0
  109. connectonion/cli/co_ai/prompts/connectonion/tui/input.md +84 -0
  110. connectonion/cli/co_ai/prompts/connectonion/tui/keys.md +77 -0
  111. connectonion/cli/co_ai/prompts/connectonion/tui/pick.md +71 -0
  112. connectonion/cli/co_ai/prompts/connectonion/tui/providers.md +89 -0
  113. connectonion/cli/co_ai/prompts/connectonion/tui/status_bar.md +67 -0
  114. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/README.md +156 -0
  115. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/calendar_plugin.md +68 -0
  116. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/eval.md +89 -0
  117. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/gmail_plugin.md +68 -0
  118. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/image_result_formatter.md +74 -0
  119. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/re_act.md +86 -0
  120. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/shell_approval.md +69 -0
  121. connectonion/cli/co_ai/prompts/connectonion/useful_tools/README.md +81 -0
  122. connectonion/cli/co_ai/prompts/connectonion/useful_tools/diff_writer.md +138 -0
  123. connectonion/cli/co_ai/prompts/connectonion/useful_tools/get_emails.md +499 -0
  124. connectonion/cli/co_ai/prompts/connectonion/useful_tools/gmail.md +135 -0
  125. connectonion/cli/co_ai/prompts/connectonion/useful_tools/google_calendar.md +106 -0
  126. connectonion/cli/co_ai/prompts/connectonion/useful_tools/memory.md +486 -0
  127. connectonion/cli/co_ai/prompts/connectonion/useful_tools/microsoft_calendar.md +106 -0
  128. connectonion/cli/co_ai/prompts/connectonion/useful_tools/outlook.md +120 -0
  129. connectonion/cli/co_ai/prompts/connectonion/useful_tools/send_email.md +403 -0
  130. connectonion/cli/co_ai/prompts/connectonion/useful_tools/shell.md +95 -0
  131. connectonion/cli/co_ai/prompts/connectonion/useful_tools/slash_command.md +96 -0
  132. connectonion/cli/co_ai/prompts/connectonion/useful_tools/terminal.md +97 -0
  133. connectonion/cli/co_ai/prompts/connectonion/useful_tools/todo_list.md +252 -0
  134. connectonion/cli/co_ai/prompts/connectonion/useful_tools/web_fetch.md +130 -0
  135. connectonion/cli/co_ai/prompts/connectonion/vibe-coding-guide.md +97 -0
  136. connectonion/cli/co_ai/prompts/connectonion/windows-support.md +258 -0
  137. connectonion/cli/co_ai/prompts/main.md +247 -0
  138. connectonion/cli/co_ai/prompts/reminders/plan_mode.md +34 -0
  139. connectonion/cli/co_ai/prompts/summarization.md +55 -0
  140. connectonion/cli/co_ai/prompts/tools/ask_user.md +61 -0
  141. connectonion/cli/co_ai/prompts/tools/background.md +57 -0
  142. connectonion/cli/co_ai/prompts/tools/edit.md +90 -0
  143. connectonion/cli/co_ai/prompts/tools/glob.md +52 -0
  144. connectonion/cli/co_ai/prompts/tools/grep.md +55 -0
  145. connectonion/cli/co_ai/prompts/tools/plan_mode.md +80 -0
  146. connectonion/cli/co_ai/prompts/tools/read.md +40 -0
  147. connectonion/cli/co_ai/prompts/tools/shell.md +67 -0
  148. connectonion/cli/co_ai/prompts/tools/task.md +51 -0
  149. connectonion/cli/co_ai/prompts/tools/todo.md +139 -0
  150. connectonion/cli/co_ai/prompts/tools/write.md +47 -0
  151. connectonion/cli/co_ai/prompts/workflow.md +89 -0
  152. connectonion/cli/co_ai/reminders.py +159 -0
  153. connectonion/cli/co_ai/sessions.py +110 -0
  154. connectonion/cli/co_ai/skills/__init__.py +37 -0
  155. connectonion/cli/co_ai/skills/builtin/commit/SKILL.md +63 -0
  156. connectonion/cli/co_ai/skills/builtin/review-pr/SKILL.md +76 -0
  157. connectonion/cli/co_ai/skills/loader.py +166 -0
  158. connectonion/cli/co_ai/skills/tool.py +46 -0
  159. connectonion/cli/co_ai/tools/__init__.py +92 -0
  160. connectonion/cli/co_ai/tools/ask_user.py +35 -0
  161. connectonion/cli/co_ai/tools/background.py +201 -0
  162. connectonion/cli/co_ai/tools/diff_writer.py +291 -0
  163. connectonion/cli/co_ai/tools/edit.py +89 -0
  164. connectonion/cli/co_ai/tools/glob.py +84 -0
  165. connectonion/cli/co_ai/tools/grep.py +158 -0
  166. connectonion/cli/co_ai/tools/load_guide.py +23 -0
  167. connectonion/cli/co_ai/tools/multi_edit.py +116 -0
  168. connectonion/cli/co_ai/tools/plan_mode.py +172 -0
  169. connectonion/cli/co_ai/tools/read.py +67 -0
  170. connectonion/cli/co_ai/tools/task.py +59 -0
  171. connectonion/cli/co_ai/tools/todo_list.py +159 -0
  172. connectonion/cli/co_ai/tools/write.py +126 -0
  173. connectonion/cli/commands/__init__.py +11 -1
  174. connectonion/cli/commands/ai_commands.py +34 -0
  175. connectonion/cli/commands/copy_commands.py +55 -6
  176. connectonion/cli/commands/create.py +20 -17
  177. connectonion/cli/commands/init.py +19 -22
  178. connectonion/cli/commands/project_cmd_lib.py +15 -0
  179. connectonion/cli/main.py +11 -0
  180. connectonion/console.py +15 -1
  181. connectonion/core/__init__.py +10 -1
  182. connectonion/core/agent.py +37 -16
  183. connectonion/core/exceptions.py +74 -0
  184. connectonion/core/llm.py +54 -6
  185. connectonion/core/tool_executor.py +32 -31
  186. connectonion/core/tool_factory.py +47 -10
  187. connectonion/debug/__init__.py +10 -1
  188. connectonion/debug/debug_explainer/__init__.py +10 -1
  189. connectonion/debug/execution_analyzer/__init__.py +10 -1
  190. connectonion/debug/execution_analyzer/execution_analysis.py +5 -2
  191. connectonion/debug/runtime_inspector/__init__.py +10 -1
  192. connectonion/docs/.package-ignore +6 -0
  193. connectonion/docs/README.md +2036 -0
  194. connectonion/docs/api.md +457 -0
  195. connectonion/docs/archive/001-ai-agent-is-just-prompt-plus-function.md +249 -0
  196. connectonion/docs/archive/README.md +53 -0
  197. connectonion/docs/archive/archive/consolidation-plan.md +72 -0
  198. connectonion/docs/archive/archive/core-principles-extracted.md +239 -0
  199. connectonion/docs/archive/archive/master-principles.md +222 -0
  200. connectonion/docs/archive/archive/principles.md +293 -0
  201. connectonion/docs/archive/archive/simplicity-principles.md +221 -0
  202. connectonion/docs/archive/attack-defense-insights.md +410 -0
  203. connectonion/docs/archive/business-model.md +305 -0
  204. connectonion/docs/archive/core-principles-unified.md +190 -0
  205. connectonion/docs/archive/discussion-journey.md +178 -0
  206. connectonion/docs/archive/economic-analysis.md +323 -0
  207. connectonion/docs/archive/features/01-share-and-find.md +256 -0
  208. connectonion/docs/archive/features/02-agent-authentication.md +93 -0
  209. connectonion/docs/archive/features/03-test-before-trust.md +71 -0
  210. connectonion/docs/archive/features/06-reliability-and-offline.md +197 -0
  211. connectonion/docs/archive/features/README.md +46 -0
  212. connectonion/docs/archive/features-roadmap.md +247 -0
  213. connectonion/docs/archive/mcp-comparison-insights.md +215 -0
  214. connectonion/docs/archive/migration-strategy.md +571 -0
  215. connectonion/docs/archive/mini-whitepaper.md +293 -0
  216. connectonion/docs/archive/network-protocol.md +394 -0
  217. connectonion/docs/archive/semantic-revolution.md +367 -0
  218. connectonion/docs/archive/technical-architecture.md +453 -0
  219. connectonion/docs/archive/the-semantic-insight.md +207 -0
  220. connectonion/docs/archive/threat-model.md +164 -0
  221. connectonion/docs/cli/README.md +805 -0
  222. connectonion/docs/cli/auth.md +46 -0
  223. connectonion/docs/cli/browser.md +235 -0
  224. connectonion/docs/cli/copy.md +232 -0
  225. connectonion/docs/cli/create.md +335 -0
  226. connectonion/docs/cli/init.md +431 -0
  227. connectonion/docs/co-directory-structure.md +214 -0
  228. connectonion/docs/concepts/agent.md +1078 -0
  229. connectonion/docs/concepts/events.md +699 -0
  230. connectonion/docs/concepts/llm_do.md +256 -0
  231. connectonion/docs/concepts/max_iterations.md +362 -0
  232. connectonion/docs/concepts/models.md +641 -0
  233. connectonion/docs/concepts/plugins.md +100 -0
  234. connectonion/docs/concepts/prompts.md +122 -0
  235. connectonion/docs/concepts/session.md +428 -0
  236. connectonion/docs/concepts/tools.md +512 -0
  237. connectonion/docs/concepts/transcribe.md +156 -0
  238. connectonion/docs/concepts/trust.md +291 -0
  239. connectonion/docs/connectonion.md +1256 -0
  240. connectonion/docs/debug/README.md +18 -0
  241. connectonion/docs/debug/auto_debug.md +1026 -0
  242. connectonion/docs/debug/console.md +129 -0
  243. connectonion/docs/debug/eval-format.md +178 -0
  244. connectonion/docs/debug/eval.md +230 -0
  245. connectonion/docs/debug/exceptions.md +307 -0
  246. connectonion/docs/debug/log.md +117 -0
  247. connectonion/docs/debug/xray.md +215 -0
  248. connectonion/docs/design-decisions/001-choosing-input-method.md +202 -0
  249. connectonion/docs/design-decisions/002-choosing-llm-function-name.md +202 -0
  250. connectonion/docs/design-decisions/003-choosing-trust-keyword.md +141 -0
  251. connectonion/docs/design-decisions/004-cli-create-flow.md +117 -0
  252. connectonion/docs/design-decisions/005-designing-agent-network-protocol.md +503 -0
  253. connectonion/docs/design-decisions/006-agent-address-format.md +305 -0
  254. connectonion/docs/design-decisions/007-authentication-backend-design.md +240 -0
  255. connectonion/docs/design-decisions/008-naming-is-hard.md +228 -0
  256. connectonion/docs/design-decisions/009-why-connect-function.md +167 -0
  257. connectonion/docs/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
  258. connectonion/docs/design-decisions/011-global-config-identity-management.md +357 -0
  259. connectonion/docs/design-decisions/012-tool-execution-separation.md +259 -0
  260. connectonion/docs/design-decisions/013-debug-and-logging-design.md +253 -0
  261. connectonion/docs/design-decisions/014-hook-system-design.md +510 -0
  262. connectonion/docs/design-decisions/015-interactive-auto-debug-design.md +837 -0
  263. connectonion/docs/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
  264. connectonion/docs/design-decisions/017-session-logging-and-eval-format.md +120 -0
  265. connectonion/docs/design-decisions/018-event-api-naming.md +274 -0
  266. connectonion/docs/design-decisions/019-agent-lifecycle-design.md +655 -0
  267. connectonion/docs/design-decisions/020-trust-system-and-network-architecture.md +503 -0
  268. connectonion/docs/design-decisions/021-task-storage-jsonl-design.md +496 -0
  269. connectonion/docs/design-decisions/022-raw-asgi-implementation.md +273 -0
  270. connectonion/docs/examples.md +0 -0
  271. connectonion/docs/hook-system-options.md +364 -0
  272. connectonion/docs/integrations/README.md +12 -0
  273. connectonion/docs/integrations/auth.md +450 -0
  274. connectonion/docs/integrations/google.md +431 -0
  275. connectonion/docs/integrations/microsoft.md +370 -0
  276. connectonion/docs/network/README.md +14 -0
  277. connectonion/docs/network/connect.md +629 -0
  278. connectonion/docs/network/deploy.md +124 -0
  279. connectonion/docs/network/host.md +1087 -0
  280. connectonion/docs/network/io.md +538 -0
  281. connectonion/docs/network/protocol/agent-relay-protocol.md +495 -0
  282. connectonion/docs/network/protocol/announce-message.md +115 -0
  283. connectonion/docs/principles.md +124 -0
  284. connectonion/docs/quickstart.md +261 -0
  285. connectonion/docs/roadmap.md +81 -0
  286. connectonion/docs/templates/README.md +77 -0
  287. connectonion/docs/templates/meta-agent.md +152 -0
  288. connectonion/docs/templates/minimal.md +105 -0
  289. connectonion/docs/templates/playwright.md +130 -0
  290. connectonion/docs/templates/web-research.md +144 -0
  291. connectonion/docs/tui/README.md +95 -0
  292. connectonion/docs/tui/chat.md +181 -0
  293. connectonion/docs/tui/divider.md +63 -0
  294. connectonion/docs/tui/dropdown.md +83 -0
  295. connectonion/docs/tui/footer.md +44 -0
  296. connectonion/docs/tui/fuzzy.md +68 -0
  297. connectonion/docs/tui/input.md +84 -0
  298. connectonion/docs/tui/keys.md +77 -0
  299. connectonion/docs/tui/pick.md +71 -0
  300. connectonion/docs/tui/providers.md +89 -0
  301. connectonion/docs/tui/status_bar.md +67 -0
  302. connectonion/docs/useful_plugins/README.md +160 -0
  303. connectonion/docs/useful_plugins/calendar_plugin.md +68 -0
  304. connectonion/docs/useful_plugins/eval.md +89 -0
  305. connectonion/docs/useful_plugins/gmail_plugin.md +68 -0
  306. connectonion/docs/useful_plugins/image_result_formatter.md +74 -0
  307. connectonion/docs/useful_plugins/re_act.md +86 -0
  308. connectonion/docs/useful_plugins/shell_approval.md +69 -0
  309. connectonion/docs/useful_plugins/system_reminder.md +210 -0
  310. connectonion/docs/useful_prompts/README.md +127 -0
  311. connectonion/docs/useful_prompts/coding_agent.md +214 -0
  312. connectonion/docs/useful_tools/README.md +81 -0
  313. connectonion/docs/useful_tools/ask_user.md +103 -0
  314. connectonion/docs/useful_tools/diff_writer.md +158 -0
  315. connectonion/docs/useful_tools/get_emails.md +519 -0
  316. connectonion/docs/useful_tools/gmail.md +155 -0
  317. connectonion/docs/useful_tools/google_calendar.md +126 -0
  318. connectonion/docs/useful_tools/memory.md +506 -0
  319. connectonion/docs/useful_tools/microsoft_calendar.md +126 -0
  320. connectonion/docs/useful_tools/outlook.md +140 -0
  321. connectonion/docs/useful_tools/send_email.md +423 -0
  322. connectonion/docs/useful_tools/shell.md +115 -0
  323. connectonion/docs/useful_tools/slash_command.md +116 -0
  324. connectonion/docs/useful_tools/terminal.md +115 -0
  325. connectonion/docs/useful_tools/todo_list.md +272 -0
  326. connectonion/docs/useful_tools/web_fetch.md +150 -0
  327. connectonion/docs/vibe-coding-guide.md +97 -0
  328. connectonion/docs/windows-support.md +258 -0
  329. connectonion/logger.py +3 -3
  330. connectonion/network/__init__.py +19 -6
  331. connectonion/network/asgi/__init__.py +81 -0
  332. connectonion/network/asgi/http.py +205 -0
  333. connectonion/network/asgi/websocket.py +217 -0
  334. connectonion/network/connect.py +232 -185
  335. connectonion/network/host/__init__.py +59 -0
  336. connectonion/network/host/auth.py +191 -0
  337. connectonion/network/host/routes.py +135 -0
  338. connectonion/network/host/server.py +289 -0
  339. connectonion/network/host/session.py +78 -0
  340. connectonion/network/io/__init__.py +21 -0
  341. connectonion/network/{connection.py → io/base.py} +17 -42
  342. connectonion/network/io/websocket.py +55 -0
  343. connectonion/network/relay.py +37 -16
  344. connectonion/network/trust/__init__.py +30 -0
  345. connectonion/network/trust/factory.py +138 -0
  346. connectonion/network/{trust_agents.py → trust/prompts.py} +3 -3
  347. connectonion/network/{trust_functions.py → trust/tools.py} +2 -2
  348. connectonion/prompt_files/__init__.py +11 -1
  349. connectonion/prompt_files/react_acknowledge.md +26 -0
  350. connectonion/prompts.py +10 -1
  351. connectonion/tui/chat.py +10 -1
  352. connectonion/tui/divider.py +10 -1
  353. connectonion/tui/dropdown.py +10 -1
  354. connectonion/tui/footer.py +8 -0
  355. connectonion/tui/fuzzy.py +11 -1
  356. connectonion/tui/input.py +118 -70
  357. connectonion/tui/keys.py +133 -6
  358. connectonion/tui/providers.py +11 -1
  359. connectonion/tui/status_bar.py +10 -1
  360. connectonion/useful_events_handlers/__init__.py +8 -0
  361. connectonion/useful_events_handlers/reflect.py +19 -4
  362. connectonion/useful_plugins/__init__.py +2 -1
  363. connectonion/useful_plugins/eval.py +2 -2
  364. connectonion/useful_plugins/gmail_plugin.py +3 -3
  365. connectonion/useful_plugins/image_result_formatter.py +3 -3
  366. connectonion/useful_plugins/re_act.py +114 -28
  367. connectonion/useful_plugins/shell_approval.py +2 -2
  368. connectonion/useful_plugins/system_reminder.py +103 -0
  369. connectonion/useful_plugins/ui_stream.py +18 -133
  370. connectonion/useful_prompts/README.md +61 -0
  371. connectonion/useful_prompts/__init__.py +45 -0
  372. connectonion/useful_prompts/coding_agent/README.md +106 -0
  373. connectonion/useful_prompts/coding_agent/assembler.py +123 -0
  374. connectonion/useful_prompts/coding_agent/prompts/main.md +227 -0
  375. connectonion/useful_prompts/coding_agent/prompts/tools/ask_user.md +61 -0
  376. connectonion/useful_prompts/coding_agent/prompts/tools/background.md +57 -0
  377. connectonion/useful_prompts/coding_agent/prompts/tools/edit.md +90 -0
  378. connectonion/useful_prompts/coding_agent/prompts/tools/glob.md +52 -0
  379. connectonion/useful_prompts/coding_agent/prompts/tools/grep.md +55 -0
  380. connectonion/useful_prompts/coding_agent/prompts/tools/plan_mode.md +80 -0
  381. connectonion/useful_prompts/coding_agent/prompts/tools/read.md +40 -0
  382. connectonion/useful_prompts/coding_agent/prompts/tools/shell.md +67 -0
  383. connectonion/useful_prompts/coding_agent/prompts/tools/task.md +51 -0
  384. connectonion/useful_prompts/coding_agent/prompts/tools/todo.md +139 -0
  385. connectonion/useful_prompts/coding_agent/prompts/tools/write.md +48 -0
  386. connectonion/useful_prompts/system-reminders/security-warning.md +14 -0
  387. connectonion/useful_prompts/system-reminders/test-reminder.md +11 -0
  388. connectonion/useful_tools/__init__.py +31 -4
  389. connectonion/useful_tools/ask_user.py +35 -0
  390. connectonion/useful_tools/bash.py +69 -0
  391. connectonion/useful_tools/diff_writer.py +186 -94
  392. connectonion/useful_tools/edit.py +102 -0
  393. connectonion/useful_tools/glob_files.py +97 -0
  394. connectonion/useful_tools/grep_files.py +171 -0
  395. connectonion/useful_tools/multi_edit.py +116 -0
  396. connectonion/useful_tools/read_file.py +73 -0
  397. connectonion/useful_tools/shell.py +50 -45
  398. connectonion/useful_tools/write_file.py +129 -0
  399. {connectonion-0.6.2.dist-info → connectonion-0.6.3.dist-info}/METADATA +10 -3
  400. connectonion-0.6.3.dist-info/RECORD +469 -0
  401. connectonion/network/asgi.py +0 -407
  402. connectonion/network/host.py +0 -616
  403. connectonion/network/trust.py +0 -166
  404. connectonion-0.6.2.dist-info/RECORD +0 -129
  405. /connectonion/cli/{docs → co_ai/prompts/connectonion}/connectonion.md +0 -0
  406. {connectonion-0.6.2.dist-info → connectonion-0.6.3.dist-info}/WHEEL +0 -0
  407. {connectonion-0.6.2.dist-info → connectonion-0.6.3.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,89 @@
1
+ """Edit tool for precise string replacement."""
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def edit(
7
+ file_path: str,
8
+ old_string: str,
9
+ new_string: str,
10
+ replace_all: bool = False,
11
+ ) -> str:
12
+ """
13
+ Replace a string in a file with precise matching.
14
+
15
+ More token-efficient than rewriting entire files. Use for small, targeted changes.
16
+ The old_string must exist in the file (and be unique unless replace_all=True).
17
+
18
+ Args:
19
+ file_path: Path to the file to edit
20
+ old_string: Exact string to replace (must be unique in file)
21
+ new_string: String to replace with
22
+ replace_all: If True, replace all occurrences; if False, old_string must be unique
23
+
24
+ Returns:
25
+ Success message or error description
26
+
27
+ Examples:
28
+ edit("app.py", "def foo():", "def bar():")
29
+ edit("config.json", '"debug": false', '"debug": true')
30
+ edit("README.md", "v1.0", "v2.0", replace_all=True)
31
+ """
32
+ path = Path(file_path)
33
+
34
+ if not path.exists():
35
+ return f"Error: File '{file_path}' does not exist"
36
+
37
+ if not path.is_file():
38
+ return f"Error: '{file_path}' is not a file"
39
+
40
+ content = path.read_text(encoding="utf-8")
41
+
42
+ # Check if old_string exists
43
+ count = content.count(old_string)
44
+
45
+ if count == 0:
46
+ # Try to help debug: show similar strings
47
+ lines_with_similar = []
48
+ for i, line in enumerate(content.splitlines(), 1):
49
+ # Check if any significant part of old_string is in the line
50
+ if len(old_string) > 10:
51
+ # For longer strings, check first 20 chars
52
+ if old_string[:20] in line or old_string[-20:] in line:
53
+ lines_with_similar.append(f" Line {i}: {line[:80]}")
54
+ elif old_string.strip() in line:
55
+ lines_with_similar.append(f" Line {i}: {line[:80]}")
56
+
57
+ msg = f"Error: String not found in '{file_path}'"
58
+ if lines_with_similar:
59
+ msg += f"\n\nSimilar content found:\n" + "\n".join(lines_with_similar[:5])
60
+ return msg
61
+
62
+ if count > 1 and not replace_all:
63
+ # Show where the duplicates are
64
+ lines_with_match = []
65
+ for i, line in enumerate(content.splitlines(), 1):
66
+ if old_string in line:
67
+ lines_with_match.append(f" Line {i}: {line[:80]}")
68
+
69
+ return (
70
+ f"Error: String appears {count} times in '{file_path}'. "
71
+ f"Use replace_all=True to replace all, or provide more context to make it unique.\n\n"
72
+ f"Found at:\n" + "\n".join(lines_with_match[:10])
73
+ )
74
+
75
+ # Perform replacement
76
+ if replace_all:
77
+ new_content = content.replace(old_string, new_string)
78
+ replaced_count = count
79
+ else:
80
+ new_content = content.replace(old_string, new_string, 1)
81
+ replaced_count = 1
82
+
83
+ # Write back
84
+ path.write_text(new_content, encoding="utf-8")
85
+
86
+ if replace_all and replaced_count > 1:
87
+ return f"Replaced {replaced_count} occurrences in '{file_path}'"
88
+ else:
89
+ return f"Successfully edited '{file_path}'"
@@ -0,0 +1,84 @@
1
+ """Glob tool for file pattern matching."""
2
+
3
+ from pathlib import Path
4
+ from typing import Optional
5
+
6
+ IGNORE_DIRS = {
7
+ ".git",
8
+ "node_modules",
9
+ "__pycache__",
10
+ ".venv",
11
+ "venv",
12
+ ".env",
13
+ "dist",
14
+ "build",
15
+ ".next",
16
+ ".nuxt",
17
+ "target",
18
+ ".idea",
19
+ ".vscode",
20
+ "*.egg-info",
21
+ }
22
+
23
+
24
+ def glob(pattern: str, path: Optional[str] = None) -> str:
25
+ """
26
+ Search for files matching a glob pattern.
27
+
28
+ Args:
29
+ pattern: Glob pattern (e.g., "**/*.py", "src/**/*.ts")
30
+ path: Directory to search in (default: current directory)
31
+
32
+ Returns:
33
+ Matching file paths, one per line, sorted by modification time (newest first)
34
+
35
+ Examples:
36
+ glob("**/*.py") # All Python files
37
+ glob("src/**/*.tsx") # All TSX files in src/
38
+ glob("**/test_*.py") # All test files
39
+ glob("*.md", "docs") # Markdown files in docs/
40
+ """
41
+ base = Path(path) if path else Path.cwd()
42
+
43
+ if not base.exists():
44
+ return f"Error: Path '{base}' does not exist"
45
+
46
+ if not base.is_dir():
47
+ return f"Error: Path '{base}' is not a directory"
48
+
49
+ matches = []
50
+ for p in base.glob(pattern):
51
+ if p.is_file() and not _should_ignore(p):
52
+ matches.append(p)
53
+
54
+ if not matches:
55
+ return f"No files found matching '{pattern}'"
56
+
57
+ # Sort by modification time (newest first)
58
+ matches.sort(key=lambda p: p.stat().st_mtime, reverse=True)
59
+
60
+ # Format output
61
+ results = []
62
+ for p in matches[:100]: # Limit to 100 results
63
+ rel_path = p.relative_to(base) if path else p.relative_to(Path.cwd())
64
+ results.append(str(rel_path))
65
+
66
+ output = "\n".join(results)
67
+
68
+ if len(matches) > 100:
69
+ output += f"\n\n... and {len(matches) - 100} more files"
70
+
71
+ return output
72
+
73
+
74
+ def _should_ignore(path: Path) -> bool:
75
+ """Check if path should be ignored."""
76
+ parts = path.parts
77
+ for part in parts:
78
+ if part in IGNORE_DIRS:
79
+ return True
80
+ # Handle patterns like *.egg-info
81
+ for ignore in IGNORE_DIRS:
82
+ if "*" in ignore and Path(part).match(ignore):
83
+ return True
84
+ return False
@@ -0,0 +1,158 @@
1
+ """Grep tool for content searching."""
2
+
3
+ import re
4
+ from pathlib import Path
5
+ from typing import Optional, Literal
6
+
7
+ from connectonion.cli.co_ai.tools.glob import IGNORE_DIRS
8
+
9
+
10
+ def grep(
11
+ pattern: str,
12
+ path: Optional[str] = None,
13
+ file_pattern: Optional[str] = None,
14
+ output_mode: Literal["files", "content", "count"] = "files",
15
+ context_lines: int = 0,
16
+ ignore_case: bool = False,
17
+ max_results: int = 50,
18
+ ) -> str:
19
+ """
20
+ Search for content in files using regex.
21
+
22
+ Args:
23
+ pattern: Regular expression pattern to search for
24
+ path: File or directory to search in (default: current directory)
25
+ file_pattern: Glob pattern to filter files (e.g., "*.py", "*.ts")
26
+ output_mode:
27
+ - "files": Return only matching file paths (default)
28
+ - "content": Return matching lines with context
29
+ - "count": Return match counts per file
30
+ context_lines: Number of lines to show before/after match (for content mode)
31
+ ignore_case: Case insensitive search
32
+ max_results: Maximum number of results to return
33
+
34
+ Returns:
35
+ Search results based on output_mode
36
+
37
+ Examples:
38
+ grep("def main") # Find "def main" in all files
39
+ grep("TODO|FIXME", file_pattern="*.py") # Find TODOs in Python files
40
+ grep("class.*Agent", output_mode="content") # Show matching lines
41
+ grep("import", output_mode="count") # Count imports per file
42
+ """
43
+ base = Path(path) if path else Path.cwd()
44
+
45
+ if not base.exists():
46
+ return f"Error: Path '{base}' does not exist"
47
+
48
+ # Compile regex
49
+ flags = re.IGNORECASE if ignore_case else 0
50
+ try:
51
+ regex = re.compile(pattern, flags)
52
+ except re.error as e:
53
+ return f"Error: Invalid regex pattern: {e}"
54
+
55
+ # Collect files to search
56
+ if base.is_file():
57
+ files = [base]
58
+ else:
59
+ if file_pattern:
60
+ files = list(base.glob(f"**/{file_pattern}"))
61
+ else:
62
+ files = list(base.glob("**/*"))
63
+
64
+ files = [f for f in files if f.is_file() and not _should_ignore(f) and _is_text_file(f)]
65
+
66
+ results = []
67
+ total_matches = 0
68
+
69
+ for file in files:
70
+ if total_matches >= max_results:
71
+ break
72
+
73
+ try:
74
+ content = file.read_text(encoding="utf-8", errors="ignore")
75
+ lines = content.splitlines()
76
+ except Exception:
77
+ continue
78
+
79
+ file_matches = []
80
+ for i, line in enumerate(lines):
81
+ if regex.search(line):
82
+ file_matches.append((i + 1, line)) # 1-indexed line number
83
+
84
+ if not file_matches:
85
+ continue
86
+
87
+ rel_path = _relative_path(file, base)
88
+
89
+ if output_mode == "files":
90
+ results.append(str(rel_path))
91
+ total_matches += 1
92
+
93
+ elif output_mode == "count":
94
+ results.append(f"{rel_path}: {len(file_matches)} matches")
95
+ total_matches += 1
96
+
97
+ elif output_mode == "content":
98
+ results.append(f"\n{rel_path}:")
99
+ for line_num, line_text in file_matches[:10]: # Limit per file
100
+ # Add context if requested
101
+ if context_lines > 0:
102
+ start = max(0, line_num - 1 - context_lines)
103
+ end = min(len(lines), line_num + context_lines)
104
+ for ctx_i in range(start, end):
105
+ prefix = ">" if ctx_i == line_num - 1 else " "
106
+ results.append(f" {prefix} {ctx_i + 1}: {lines[ctx_i]}")
107
+ results.append("")
108
+ else:
109
+ results.append(f" {line_num}: {line_text}")
110
+ total_matches += 1
111
+
112
+ if total_matches >= max_results:
113
+ break
114
+
115
+ if not results:
116
+ return f"No matches found for '{pattern}'"
117
+
118
+ output = "\n".join(results)
119
+
120
+ if total_matches >= max_results:
121
+ output += f"\n\n... results truncated at {max_results}"
122
+
123
+ return output
124
+
125
+
126
+ def _should_ignore(path: Path) -> bool:
127
+ """Check if path should be ignored."""
128
+ parts = path.parts
129
+ for part in parts:
130
+ if part in IGNORE_DIRS:
131
+ return True
132
+ for ignore in IGNORE_DIRS:
133
+ if "*" in ignore and Path(part).match(ignore):
134
+ return True
135
+ return False
136
+
137
+
138
+ def _is_text_file(path: Path) -> bool:
139
+ """Check if file is likely a text file."""
140
+ # Skip binary file extensions
141
+ binary_extensions = {
142
+ ".pyc", ".pyo", ".so", ".dylib", ".dll", ".exe",
143
+ ".png", ".jpg", ".jpeg", ".gif", ".ico", ".svg",
144
+ ".pdf", ".doc", ".docx", ".xls", ".xlsx",
145
+ ".zip", ".tar", ".gz", ".rar", ".7z",
146
+ ".mp3", ".mp4", ".wav", ".avi", ".mov",
147
+ ".ttf", ".woff", ".woff2", ".eot",
148
+ ".lock", ".bin", ".dat",
149
+ }
150
+ return path.suffix.lower() not in binary_extensions
151
+
152
+
153
+ def _relative_path(path: Path, base: Path) -> Path:
154
+ """Get relative path, handling edge cases."""
155
+ try:
156
+ return path.relative_to(base)
157
+ except ValueError:
158
+ return path
@@ -0,0 +1,23 @@
1
+ """Load ConnectOnion framework guides."""
2
+
3
+ from pathlib import Path
4
+
5
+ GUIDES_DIR = Path(__file__).parent.parent / "prompts" / "connectonion"
6
+
7
+
8
+ def load_guide(path: str) -> str:
9
+ """
10
+ Load a ConnectOnion framework guide.
11
+
12
+ Args:
13
+ path: Full path like "concepts/agent", "concepts/tools", "useful_tools/shell"
14
+
15
+ Returns:
16
+ Guide content
17
+ """
18
+ guide_file = GUIDES_DIR / f"{path}.md"
19
+
20
+ if not guide_file.exists():
21
+ return f"Guide '{path}' not found. Use full path: concepts/agent, concepts/tools, useful_tools/shell. See index.md."
22
+
23
+ return guide_file.read_text(encoding="utf-8")
@@ -0,0 +1,116 @@
1
+ """
2
+ Purpose: Atomic multiple string replacements in a single file (like Claude Code's MultiEdit)
3
+ LLM-Note:
4
+ Dependencies: imports from [pathlib, typing] | imported by [co_ai.tools.__init__]
5
+ Data flow: Agent calls multi_edit(file_path, edits) -> validates all edits -> applies sequentially -> returns status
6
+ State/Effects: reads and writes file on filesystem | atomic (all succeed or none applied)
7
+ Integration: exposes multi_edit(file_path, edits) function | used as agent tool
8
+ Errors: returns error if file not found | returns error if any old_string not found | rolls back on failure
9
+
10
+ Usage:
11
+ multi_edit("app.py", [
12
+ {"old_string": "def foo():", "new_string": "def bar():"},
13
+ {"old_string": "return None", "new_string": "return True"},
14
+ ])
15
+ """
16
+
17
+ from pathlib import Path
18
+ from typing import List, TypedDict, Optional
19
+
20
+
21
+ class EditOperation(TypedDict, total=False):
22
+ """Single edit operation."""
23
+ old_string: str # Required: exact string to replace
24
+ new_string: str # Required: replacement string
25
+ replace_all: bool # Optional: replace all occurrences (default: False)
26
+
27
+
28
+ def multi_edit(
29
+ file_path: str,
30
+ edits: List[EditOperation],
31
+ ) -> str:
32
+ """
33
+ Apply multiple string replacements to a file atomically.
34
+
35
+ All edits succeed or none are applied. Edits are applied sequentially,
36
+ so earlier edits affect the text that later edits search for.
37
+
38
+ Args:
39
+ file_path: Path to the file to edit
40
+ edits: List of edit operations, each with:
41
+ - old_string: Exact string to replace
42
+ - new_string: Replacement string
43
+ - replace_all: If True, replace all occurrences (default: False)
44
+
45
+ Returns:
46
+ Success message or error description
47
+
48
+ Examples:
49
+ multi_edit("app.py", [
50
+ {"old_string": "def foo():", "new_string": "def bar():"},
51
+ {"old_string": "foo()", "new_string": "bar()", "replace_all": True},
52
+ ])
53
+ """
54
+ path = Path(file_path)
55
+
56
+ if not path.exists():
57
+ return f"Error: File '{file_path}' does not exist"
58
+
59
+ if not path.is_file():
60
+ return f"Error: '{file_path}' is not a file"
61
+
62
+ if not edits:
63
+ return "Error: No edits provided"
64
+
65
+ # Read original content
66
+ original_content = path.read_text(encoding="utf-8")
67
+ content = original_content
68
+
69
+ # Validate and apply edits
70
+ applied = []
71
+ for i, edit in enumerate(edits):
72
+ old_string = edit.get("old_string", "")
73
+ new_string = edit.get("new_string", "")
74
+ replace_all = edit.get("replace_all", False)
75
+
76
+ if not old_string:
77
+ return f"Error: Edit {i+1} missing 'old_string'"
78
+
79
+ # Check if old_string exists in current content
80
+ count = content.count(old_string)
81
+
82
+ if count == 0:
83
+ # Show what edits were successful before failure
84
+ if applied:
85
+ applied_msg = "\n".join([f" {j+1}. Replaced '{e['old']}'" for j, e in enumerate(applied)])
86
+ return (
87
+ f"Error: Edit {i+1} failed - string not found after previous edits.\n"
88
+ f"Looking for: {repr(old_string[:100])}\n\n"
89
+ f"Successfully applied before failure:\n{applied_msg}\n\n"
90
+ f"No changes were saved (atomic operation)."
91
+ )
92
+ return f"Error: Edit {i+1} - string not found in '{file_path}': {repr(old_string[:100])}"
93
+
94
+ if count > 1 and not replace_all:
95
+ return (
96
+ f"Error: Edit {i+1} - string appears {count} times. "
97
+ f"Use replace_all=True or provide more context.\n"
98
+ f"String: {repr(old_string[:100])}"
99
+ )
100
+
101
+ # Apply this edit
102
+ if replace_all:
103
+ content = content.replace(old_string, new_string)
104
+ applied.append({"old": old_string[:50], "count": count})
105
+ else:
106
+ content = content.replace(old_string, new_string, 1)
107
+ applied.append({"old": old_string[:50], "count": 1})
108
+
109
+ # All edits validated and applied in memory - now write to file
110
+ path.write_text(content, encoding="utf-8")
111
+
112
+ # Build success message
113
+ total_replacements = sum(e["count"] for e in applied)
114
+ if len(edits) == 1:
115
+ return f"Successfully edited '{file_path}'"
116
+ return f"Successfully applied {len(edits)} edits ({total_replacements} replacements) to '{file_path}'"
@@ -0,0 +1,172 @@
1
+ """Plan Mode tools for planning before implementation."""
2
+
3
+ from pathlib import Path
4
+ from typing import Optional
5
+ from rich.console import Console
6
+ from rich.panel import Panel
7
+ from rich.markdown import Markdown
8
+
9
+ from connectonion.cli.co_ai.reminders import REMINDERS
10
+
11
+ console = Console()
12
+
13
+ # Plan mode state (module-level for simplicity)
14
+ _plan_mode_active = False
15
+ _plan_file_path: Optional[Path] = None
16
+
17
+
18
+ def get_plan_file_path() -> Path:
19
+ """Get the default plan file path."""
20
+ co_dir = Path.cwd() / ".co"
21
+ co_dir.mkdir(exist_ok=True)
22
+ return co_dir / "PLAN.md"
23
+
24
+
25
+ def is_plan_mode_active() -> bool:
26
+ """Check if plan mode is currently active."""
27
+ return _plan_mode_active
28
+
29
+
30
+ def enter_plan_mode() -> str:
31
+ """
32
+ Enter plan mode for designing implementation before coding.
33
+
34
+ Use this when you need to:
35
+ - Plan a complex feature implementation
36
+ - Design architecture before writing code
37
+ - Get user approval on approach before making changes
38
+
39
+ In plan mode:
40
+ - Explore the codebase to understand structure
41
+ - Design the implementation approach
42
+ - Write your plan to .co/PLAN.md
43
+ - Exit plan mode when ready for user approval
44
+
45
+ Returns:
46
+ Confirmation message with instructions
47
+
48
+ Example workflow:
49
+ 1. enter_plan_mode() - Start planning
50
+ 2. Use glob/grep/read_file to explore
51
+ 3. Write plan to .co/PLAN.md
52
+ 4. exit_plan_mode() - Get user approval
53
+ 5. Implement after approval
54
+ """
55
+ global _plan_mode_active, _plan_file_path
56
+
57
+ if _plan_mode_active:
58
+ return "Already in plan mode. Use exit_plan_mode() when ready for user approval."
59
+
60
+ _plan_mode_active = True
61
+ _plan_file_path = get_plan_file_path()
62
+
63
+ # Create initial plan file
64
+ initial_content = """# Implementation Plan
65
+
66
+ ## Summary
67
+ [One-sentence description of what will be implemented]
68
+
69
+ ## Current Understanding
70
+ [What you learned from exploring the codebase]
71
+
72
+ ## Files to Modify
73
+ - `path/to/file.py` - What changes needed
74
+
75
+ ## Files to Create
76
+ - `path/to/new_file.py` - Purpose
77
+
78
+ ## Implementation Steps
79
+ 1. Step 1 - Details
80
+ 2. Step 2 - Details
81
+ 3. Step 3 - Details
82
+
83
+ ## Considerations
84
+ - Any risks or trade-offs
85
+
86
+ ---
87
+ *Plan created by OO. Waiting for user approval.*
88
+ """
89
+
90
+ _plan_file_path.write_text(initial_content, encoding="utf-8")
91
+
92
+ console.print(Panel(
93
+ "[bold green]Entered Plan Mode[/]\n\n"
94
+ "You are now in planning mode. In this mode:\n"
95
+ "1. [cyan]Explore[/] - Use glob/grep/read_file to understand the codebase\n"
96
+ "2. [cyan]Design[/] - Write your implementation plan\n"
97
+ "3. [cyan]Document[/] - Update .co/PLAN.md with your plan\n"
98
+ "4. [cyan]Exit[/] - Call exit_plan_mode() for user approval\n\n"
99
+ f"Plan file: [dim]{_plan_file_path}[/]",
100
+ title="Plan Mode",
101
+ border_style="green"
102
+ ))
103
+
104
+ plan_mode_reminder = REMINDERS.get("plan_mode_active", "")
105
+ return f"Entered plan mode. Write your plan to {_plan_file_path}, then call exit_plan_mode() when ready for user approval.\n\n{plan_mode_reminder}"
106
+
107
+
108
+ def exit_plan_mode() -> str:
109
+ """
110
+ Exit plan mode and request user approval for the plan.
111
+
112
+ Call this after you have:
113
+ 1. Explored the codebase
114
+ 2. Written your implementation plan to .co/PLAN.md
115
+
116
+ The user will review the plan and either:
117
+ - Approve: You can proceed with implementation
118
+ - Request changes: Update the plan and try again
119
+ - Reject: Abandon the plan
120
+
121
+ Returns:
122
+ The plan content for user review
123
+ """
124
+ global _plan_mode_active, _plan_file_path
125
+
126
+ if not _plan_mode_active:
127
+ return "Not in plan mode. Use enter_plan_mode() first."
128
+
129
+ plan_file = _plan_file_path or get_plan_file_path()
130
+
131
+ if not plan_file.exists():
132
+ return f"Plan file not found at {plan_file}. Write your plan first."
133
+
134
+ plan_content = plan_file.read_text(encoding="utf-8")
135
+
136
+ # Reset state
137
+ _plan_mode_active = False
138
+ _plan_file_path = None
139
+
140
+ # Display plan for user approval
141
+ console.print(Panel(
142
+ Markdown(plan_content),
143
+ title="📋 Implementation Plan - Review Required",
144
+ border_style="yellow"
145
+ ))
146
+
147
+ console.print()
148
+ console.print("[bold yellow]Please review the plan above.[/]")
149
+ console.print("Reply with:")
150
+ console.print(" [green]'approve'[/] or [green]'yes'[/] - Proceed with implementation")
151
+ console.print(" [yellow]'modify: <feedback>'[/] - Request changes to the plan")
152
+ console.print(" [red]'reject'[/] or [red]'no'[/] - Abandon this plan")
153
+ console.print()
154
+
155
+ return f"Exited plan mode. Plan saved to {plan_file}. Waiting for user approval.\n\n---\n\n{plan_content}"
156
+
157
+
158
+ def write_plan(content: str) -> str:
159
+ """
160
+ Write or update the implementation plan.
161
+
162
+ Use this to document your implementation plan while in plan mode.
163
+
164
+ Args:
165
+ content: The plan content in markdown format
166
+
167
+ Returns:
168
+ Confirmation message
169
+ """
170
+ plan_file = get_plan_file_path()
171
+ plan_file.write_text(content, encoding="utf-8")
172
+ return f"Plan updated: {plan_file}"