connectonion 0.6.1__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 (413) 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 +95 -142
  5. connectonion/cli/browser_agent/element_finder.py +147 -0
  6. connectonion/cli/browser_agent/highlight_screenshot.py +182 -0
  7. connectonion/cli/browser_agent/prompt.md +188 -105
  8. connectonion/cli/browser_agent/prompts/element_matcher.md +59 -0
  9. connectonion/cli/browser_agent/prompts/form_filler.md +19 -0
  10. connectonion/cli/browser_agent/prompts/scroll_strategy.md +36 -0
  11. connectonion/cli/browser_agent/scripts/extract_elements.js +126 -0
  12. connectonion/cli/browser_agent/scroll.py +145 -0
  13. connectonion/cli/co_ai/__init__.py +6 -0
  14. connectonion/cli/co_ai/agent.py +87 -0
  15. connectonion/cli/co_ai/agents/__init__.py +5 -0
  16. connectonion/cli/co_ai/agents/registry.py +57 -0
  17. connectonion/cli/co_ai/commands/__init__.py +45 -0
  18. connectonion/cli/co_ai/commands/compact.py +173 -0
  19. connectonion/cli/co_ai/commands/cost.py +77 -0
  20. connectonion/cli/co_ai/commands/export.py +60 -0
  21. connectonion/cli/co_ai/commands/help.py +80 -0
  22. connectonion/cli/co_ai/commands/init.py +101 -0
  23. connectonion/cli/co_ai/commands/sessions.py +55 -0
  24. connectonion/cli/co_ai/commands/tasks.py +63 -0
  25. connectonion/cli/co_ai/commands/undo.py +103 -0
  26. connectonion/cli/co_ai/context.py +127 -0
  27. connectonion/cli/co_ai/main.py +52 -0
  28. connectonion/cli/co_ai/plugins/__init__.py +6 -0
  29. connectonion/cli/co_ai/plugins/reminder.py +76 -0
  30. connectonion/cli/co_ai/plugins/shell_approval.py +105 -0
  31. connectonion/cli/co_ai/prompts/agents/explore.md +79 -0
  32. connectonion/cli/co_ai/prompts/agents/plan.md +60 -0
  33. connectonion/cli/co_ai/prompts/assembler.py +303 -0
  34. connectonion/cli/{docs/co-vibecoding-principles-docs-contexts-all-in-one.md → co_ai/prompts/connectonion/README.md} +26 -0
  35. connectonion/cli/co_ai/prompts/connectonion/api.md +457 -0
  36. connectonion/cli/co_ai/prompts/connectonion/cli/README.md +805 -0
  37. connectonion/cli/co_ai/prompts/connectonion/cli/auth.md +46 -0
  38. connectonion/cli/co_ai/prompts/connectonion/cli/browser.md +235 -0
  39. connectonion/cli/co_ai/prompts/connectonion/cli/copy.md +184 -0
  40. connectonion/cli/co_ai/prompts/connectonion/cli/create.md +335 -0
  41. connectonion/cli/co_ai/prompts/connectonion/cli/init.md +431 -0
  42. connectonion/cli/co_ai/prompts/connectonion/co-directory-structure.md +214 -0
  43. connectonion/cli/co_ai/prompts/connectonion/concepts/agent.md +1078 -0
  44. connectonion/cli/co_ai/prompts/connectonion/concepts/events.md +816 -0
  45. connectonion/cli/co_ai/prompts/connectonion/concepts/llm_do.md +256 -0
  46. connectonion/cli/co_ai/prompts/connectonion/concepts/max_iterations.md +362 -0
  47. connectonion/cli/co_ai/prompts/connectonion/concepts/models.md +641 -0
  48. connectonion/cli/co_ai/prompts/connectonion/concepts/plugins.md +100 -0
  49. connectonion/cli/co_ai/prompts/connectonion/concepts/prompts.md +122 -0
  50. connectonion/cli/co_ai/prompts/connectonion/concepts/tools.md +512 -0
  51. connectonion/cli/co_ai/prompts/connectonion/concepts/transcribe.md +156 -0
  52. connectonion/cli/co_ai/prompts/connectonion/concepts/trust.md +291 -0
  53. connectonion/cli/co_ai/prompts/connectonion/debug/README.md +18 -0
  54. connectonion/cli/co_ai/prompts/connectonion/debug/auto_debug.md +1026 -0
  55. connectonion/cli/co_ai/prompts/connectonion/debug/console.md +129 -0
  56. connectonion/cli/co_ai/prompts/connectonion/debug/eval-format.md +178 -0
  57. connectonion/cli/co_ai/prompts/connectonion/debug/eval.md +230 -0
  58. connectonion/cli/co_ai/prompts/connectonion/debug/exceptions.md +307 -0
  59. connectonion/cli/co_ai/prompts/connectonion/debug/log.md +117 -0
  60. connectonion/cli/co_ai/prompts/connectonion/debug/xray.md +215 -0
  61. connectonion/cli/co_ai/prompts/connectonion/design-decisions/001-choosing-input-method.md +202 -0
  62. connectonion/cli/co_ai/prompts/connectonion/design-decisions/002-choosing-llm-function-name.md +202 -0
  63. connectonion/cli/co_ai/prompts/connectonion/design-decisions/003-choosing-trust-keyword.md +141 -0
  64. connectonion/cli/co_ai/prompts/connectonion/design-decisions/004-cli-create-flow.md +117 -0
  65. connectonion/cli/co_ai/prompts/connectonion/design-decisions/005-designing-agent-network-protocol.md +503 -0
  66. connectonion/cli/co_ai/prompts/connectonion/design-decisions/006-agent-address-format.md +305 -0
  67. connectonion/cli/co_ai/prompts/connectonion/design-decisions/007-authentication-backend-design.md +240 -0
  68. connectonion/cli/co_ai/prompts/connectonion/design-decisions/008-naming-is-hard.md +228 -0
  69. connectonion/cli/co_ai/prompts/connectonion/design-decisions/009-why-connect-function.md +167 -0
  70. connectonion/cli/co_ai/prompts/connectonion/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
  71. connectonion/cli/co_ai/prompts/connectonion/design-decisions/011-global-config-identity-management.md +357 -0
  72. connectonion/cli/co_ai/prompts/connectonion/design-decisions/012-tool-execution-separation.md +259 -0
  73. connectonion/cli/co_ai/prompts/connectonion/design-decisions/013-debug-and-logging-design.md +253 -0
  74. connectonion/cli/co_ai/prompts/connectonion/design-decisions/014-hook-system-design.md +510 -0
  75. connectonion/cli/co_ai/prompts/connectonion/design-decisions/015-interactive-auto-debug-design.md +837 -0
  76. connectonion/cli/co_ai/prompts/connectonion/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
  77. connectonion/cli/co_ai/prompts/connectonion/design-decisions/017-session-logging-and-eval-format.md +120 -0
  78. connectonion/cli/co_ai/prompts/connectonion/design-decisions/018-event-api-naming.md +274 -0
  79. connectonion/cli/co_ai/prompts/connectonion/design-decisions/019-agent-lifecycle-design.md +655 -0
  80. connectonion/cli/co_ai/prompts/connectonion/design-decisions/020-trust-system-and-network-architecture.md +503 -0
  81. connectonion/cli/co_ai/prompts/connectonion/design-decisions/021-task-storage-jsonl-design.md +496 -0
  82. connectonion/cli/co_ai/prompts/connectonion/design-decisions/022-raw-asgi-implementation.md +273 -0
  83. connectonion/cli/co_ai/prompts/connectonion/examples/agent_reasoning.md +62 -0
  84. connectonion/cli/co_ai/prompts/connectonion/examples/atomic_tools.md +24 -0
  85. connectonion/cli/co_ai/prompts/connectonion/examples/load_guide.md +18 -0
  86. connectonion/cli/co_ai/prompts/connectonion/examples.md +0 -0
  87. connectonion/cli/co_ai/prompts/connectonion/hook-system-options.md +364 -0
  88. connectonion/cli/co_ai/prompts/connectonion/index.md +162 -0
  89. connectonion/cli/co_ai/prompts/connectonion/integrations/README.md +12 -0
  90. connectonion/cli/co_ai/prompts/connectonion/integrations/auth.md +450 -0
  91. connectonion/cli/co_ai/prompts/connectonion/integrations/google.md +431 -0
  92. connectonion/cli/co_ai/prompts/connectonion/integrations/microsoft.md +370 -0
  93. connectonion/cli/co_ai/prompts/connectonion/network/README.md +14 -0
  94. connectonion/cli/co_ai/prompts/connectonion/network/connect.md +543 -0
  95. connectonion/cli/co_ai/prompts/connectonion/network/connection.md +538 -0
  96. connectonion/cli/co_ai/prompts/connectonion/network/deploy.md +123 -0
  97. connectonion/cli/co_ai/prompts/connectonion/network/host.md +1049 -0
  98. connectonion/cli/co_ai/prompts/connectonion/network/protocol/agent-relay-protocol.md +495 -0
  99. connectonion/cli/co_ai/prompts/connectonion/network/protocol/announce-message.md +115 -0
  100. connectonion/cli/co_ai/prompts/connectonion/principles.md +124 -0
  101. connectonion/cli/co_ai/prompts/connectonion/quickstart.md +261 -0
  102. connectonion/cli/co_ai/prompts/connectonion/roadmap.md +81 -0
  103. connectonion/cli/co_ai/prompts/connectonion/templates/README.md +77 -0
  104. connectonion/cli/co_ai/prompts/connectonion/templates/meta-agent.md +152 -0
  105. connectonion/cli/co_ai/prompts/connectonion/templates/minimal.md +105 -0
  106. connectonion/cli/co_ai/prompts/connectonion/templates/playwright.md +130 -0
  107. connectonion/cli/co_ai/prompts/connectonion/templates/web-research.md +144 -0
  108. connectonion/cli/co_ai/prompts/connectonion/tui/README.md +95 -0
  109. connectonion/cli/co_ai/prompts/connectonion/tui/chat.md +181 -0
  110. connectonion/cli/co_ai/prompts/connectonion/tui/divider.md +63 -0
  111. connectonion/cli/co_ai/prompts/connectonion/tui/dropdown.md +83 -0
  112. connectonion/cli/co_ai/prompts/connectonion/tui/footer.md +44 -0
  113. connectonion/cli/co_ai/prompts/connectonion/tui/fuzzy.md +68 -0
  114. connectonion/cli/co_ai/prompts/connectonion/tui/input.md +84 -0
  115. connectonion/cli/co_ai/prompts/connectonion/tui/keys.md +77 -0
  116. connectonion/cli/co_ai/prompts/connectonion/tui/pick.md +71 -0
  117. connectonion/cli/co_ai/prompts/connectonion/tui/providers.md +89 -0
  118. connectonion/cli/co_ai/prompts/connectonion/tui/status_bar.md +67 -0
  119. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/README.md +156 -0
  120. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/calendar_plugin.md +68 -0
  121. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/eval.md +89 -0
  122. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/gmail_plugin.md +68 -0
  123. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/image_result_formatter.md +74 -0
  124. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/re_act.md +86 -0
  125. connectonion/cli/co_ai/prompts/connectonion/useful_plugins/shell_approval.md +69 -0
  126. connectonion/cli/co_ai/prompts/connectonion/useful_tools/README.md +81 -0
  127. connectonion/cli/co_ai/prompts/connectonion/useful_tools/diff_writer.md +138 -0
  128. connectonion/cli/co_ai/prompts/connectonion/useful_tools/get_emails.md +499 -0
  129. connectonion/cli/co_ai/prompts/connectonion/useful_tools/gmail.md +135 -0
  130. connectonion/cli/co_ai/prompts/connectonion/useful_tools/google_calendar.md +106 -0
  131. connectonion/cli/co_ai/prompts/connectonion/useful_tools/memory.md +486 -0
  132. connectonion/cli/co_ai/prompts/connectonion/useful_tools/microsoft_calendar.md +106 -0
  133. connectonion/cli/co_ai/prompts/connectonion/useful_tools/outlook.md +120 -0
  134. connectonion/cli/co_ai/prompts/connectonion/useful_tools/send_email.md +403 -0
  135. connectonion/cli/co_ai/prompts/connectonion/useful_tools/shell.md +95 -0
  136. connectonion/cli/co_ai/prompts/connectonion/useful_tools/slash_command.md +96 -0
  137. connectonion/cli/co_ai/prompts/connectonion/useful_tools/terminal.md +97 -0
  138. connectonion/cli/co_ai/prompts/connectonion/useful_tools/todo_list.md +252 -0
  139. connectonion/cli/co_ai/prompts/connectonion/useful_tools/web_fetch.md +130 -0
  140. connectonion/cli/co_ai/prompts/connectonion/vibe-coding-guide.md +97 -0
  141. connectonion/cli/co_ai/prompts/connectonion/windows-support.md +258 -0
  142. connectonion/cli/co_ai/prompts/main.md +247 -0
  143. connectonion/cli/co_ai/prompts/reminders/plan_mode.md +34 -0
  144. connectonion/cli/co_ai/prompts/summarization.md +55 -0
  145. connectonion/cli/co_ai/prompts/tools/ask_user.md +61 -0
  146. connectonion/cli/co_ai/prompts/tools/background.md +57 -0
  147. connectonion/cli/co_ai/prompts/tools/edit.md +90 -0
  148. connectonion/cli/co_ai/prompts/tools/glob.md +52 -0
  149. connectonion/cli/co_ai/prompts/tools/grep.md +55 -0
  150. connectonion/cli/co_ai/prompts/tools/plan_mode.md +80 -0
  151. connectonion/cli/co_ai/prompts/tools/read.md +40 -0
  152. connectonion/cli/co_ai/prompts/tools/shell.md +67 -0
  153. connectonion/cli/co_ai/prompts/tools/task.md +51 -0
  154. connectonion/cli/co_ai/prompts/tools/todo.md +139 -0
  155. connectonion/cli/co_ai/prompts/tools/write.md +47 -0
  156. connectonion/cli/co_ai/prompts/workflow.md +89 -0
  157. connectonion/cli/co_ai/reminders.py +159 -0
  158. connectonion/cli/co_ai/sessions.py +110 -0
  159. connectonion/cli/co_ai/skills/__init__.py +37 -0
  160. connectonion/cli/co_ai/skills/builtin/commit/SKILL.md +63 -0
  161. connectonion/cli/co_ai/skills/builtin/review-pr/SKILL.md +76 -0
  162. connectonion/cli/co_ai/skills/loader.py +166 -0
  163. connectonion/cli/co_ai/skills/tool.py +46 -0
  164. connectonion/cli/co_ai/tools/__init__.py +92 -0
  165. connectonion/cli/co_ai/tools/ask_user.py +35 -0
  166. connectonion/cli/co_ai/tools/background.py +201 -0
  167. connectonion/cli/co_ai/tools/diff_writer.py +291 -0
  168. connectonion/cli/co_ai/tools/edit.py +89 -0
  169. connectonion/cli/co_ai/tools/glob.py +84 -0
  170. connectonion/cli/co_ai/tools/grep.py +158 -0
  171. connectonion/cli/co_ai/tools/load_guide.py +23 -0
  172. connectonion/cli/co_ai/tools/multi_edit.py +116 -0
  173. connectonion/cli/co_ai/tools/plan_mode.py +172 -0
  174. connectonion/cli/co_ai/tools/read.py +67 -0
  175. connectonion/cli/co_ai/tools/task.py +59 -0
  176. connectonion/cli/co_ai/tools/todo_list.py +159 -0
  177. connectonion/cli/co_ai/tools/write.py +126 -0
  178. connectonion/cli/commands/__init__.py +11 -1
  179. connectonion/cli/commands/ai_commands.py +34 -0
  180. connectonion/cli/commands/copy_commands.py +55 -6
  181. connectonion/cli/commands/create.py +20 -17
  182. connectonion/cli/commands/init.py +19 -22
  183. connectonion/cli/commands/project_cmd_lib.py +15 -0
  184. connectonion/cli/main.py +11 -0
  185. connectonion/console.py +15 -1
  186. connectonion/core/__init__.py +10 -1
  187. connectonion/core/agent.py +37 -16
  188. connectonion/core/exceptions.py +74 -0
  189. connectonion/core/llm.py +54 -6
  190. connectonion/core/tool_executor.py +32 -31
  191. connectonion/core/tool_factory.py +47 -10
  192. connectonion/debug/__init__.py +10 -1
  193. connectonion/debug/debug_explainer/__init__.py +10 -1
  194. connectonion/debug/execution_analyzer/__init__.py +10 -1
  195. connectonion/debug/execution_analyzer/execution_analysis.py +5 -2
  196. connectonion/debug/runtime_inspector/__init__.py +10 -1
  197. connectonion/docs/.package-ignore +6 -0
  198. connectonion/docs/README.md +2036 -0
  199. connectonion/docs/api.md +457 -0
  200. connectonion/docs/archive/001-ai-agent-is-just-prompt-plus-function.md +249 -0
  201. connectonion/docs/archive/README.md +53 -0
  202. connectonion/docs/archive/archive/consolidation-plan.md +72 -0
  203. connectonion/docs/archive/archive/core-principles-extracted.md +239 -0
  204. connectonion/docs/archive/archive/master-principles.md +222 -0
  205. connectonion/docs/archive/archive/principles.md +293 -0
  206. connectonion/docs/archive/archive/simplicity-principles.md +221 -0
  207. connectonion/docs/archive/attack-defense-insights.md +410 -0
  208. connectonion/docs/archive/business-model.md +305 -0
  209. connectonion/docs/archive/core-principles-unified.md +190 -0
  210. connectonion/docs/archive/discussion-journey.md +178 -0
  211. connectonion/docs/archive/economic-analysis.md +323 -0
  212. connectonion/docs/archive/features/01-share-and-find.md +256 -0
  213. connectonion/docs/archive/features/02-agent-authentication.md +93 -0
  214. connectonion/docs/archive/features/03-test-before-trust.md +71 -0
  215. connectonion/docs/archive/features/06-reliability-and-offline.md +197 -0
  216. connectonion/docs/archive/features/README.md +46 -0
  217. connectonion/docs/archive/features-roadmap.md +247 -0
  218. connectonion/docs/archive/mcp-comparison-insights.md +215 -0
  219. connectonion/docs/archive/migration-strategy.md +571 -0
  220. connectonion/docs/archive/mini-whitepaper.md +293 -0
  221. connectonion/docs/archive/network-protocol.md +394 -0
  222. connectonion/docs/archive/semantic-revolution.md +367 -0
  223. connectonion/docs/archive/technical-architecture.md +453 -0
  224. connectonion/docs/archive/the-semantic-insight.md +207 -0
  225. connectonion/docs/archive/threat-model.md +164 -0
  226. connectonion/docs/cli/README.md +805 -0
  227. connectonion/docs/cli/auth.md +46 -0
  228. connectonion/docs/cli/browser.md +235 -0
  229. connectonion/docs/cli/copy.md +232 -0
  230. connectonion/docs/cli/create.md +335 -0
  231. connectonion/docs/cli/init.md +431 -0
  232. connectonion/docs/co-directory-structure.md +214 -0
  233. connectonion/docs/concepts/agent.md +1078 -0
  234. connectonion/docs/concepts/events.md +699 -0
  235. connectonion/docs/concepts/llm_do.md +256 -0
  236. connectonion/docs/concepts/max_iterations.md +362 -0
  237. connectonion/docs/concepts/models.md +641 -0
  238. connectonion/docs/concepts/plugins.md +100 -0
  239. connectonion/docs/concepts/prompts.md +122 -0
  240. connectonion/docs/concepts/session.md +428 -0
  241. connectonion/docs/concepts/tools.md +512 -0
  242. connectonion/docs/concepts/transcribe.md +156 -0
  243. connectonion/docs/concepts/trust.md +291 -0
  244. connectonion/docs/connectonion.md +1256 -0
  245. connectonion/docs/debug/README.md +18 -0
  246. connectonion/docs/debug/auto_debug.md +1026 -0
  247. connectonion/docs/debug/console.md +129 -0
  248. connectonion/docs/debug/eval-format.md +178 -0
  249. connectonion/docs/debug/eval.md +230 -0
  250. connectonion/docs/debug/exceptions.md +307 -0
  251. connectonion/docs/debug/log.md +117 -0
  252. connectonion/docs/debug/xray.md +215 -0
  253. connectonion/docs/design-decisions/001-choosing-input-method.md +202 -0
  254. connectonion/docs/design-decisions/002-choosing-llm-function-name.md +202 -0
  255. connectonion/docs/design-decisions/003-choosing-trust-keyword.md +141 -0
  256. connectonion/docs/design-decisions/004-cli-create-flow.md +117 -0
  257. connectonion/docs/design-decisions/005-designing-agent-network-protocol.md +503 -0
  258. connectonion/docs/design-decisions/006-agent-address-format.md +305 -0
  259. connectonion/docs/design-decisions/007-authentication-backend-design.md +240 -0
  260. connectonion/docs/design-decisions/008-naming-is-hard.md +228 -0
  261. connectonion/docs/design-decisions/009-why-connect-function.md +167 -0
  262. connectonion/docs/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
  263. connectonion/docs/design-decisions/011-global-config-identity-management.md +357 -0
  264. connectonion/docs/design-decisions/012-tool-execution-separation.md +259 -0
  265. connectonion/docs/design-decisions/013-debug-and-logging-design.md +253 -0
  266. connectonion/docs/design-decisions/014-hook-system-design.md +510 -0
  267. connectonion/docs/design-decisions/015-interactive-auto-debug-design.md +837 -0
  268. connectonion/docs/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
  269. connectonion/docs/design-decisions/017-session-logging-and-eval-format.md +120 -0
  270. connectonion/docs/design-decisions/018-event-api-naming.md +274 -0
  271. connectonion/docs/design-decisions/019-agent-lifecycle-design.md +655 -0
  272. connectonion/docs/design-decisions/020-trust-system-and-network-architecture.md +503 -0
  273. connectonion/docs/design-decisions/021-task-storage-jsonl-design.md +496 -0
  274. connectonion/docs/design-decisions/022-raw-asgi-implementation.md +273 -0
  275. connectonion/docs/examples.md +0 -0
  276. connectonion/docs/hook-system-options.md +364 -0
  277. connectonion/docs/integrations/README.md +12 -0
  278. connectonion/docs/integrations/auth.md +450 -0
  279. connectonion/docs/integrations/google.md +431 -0
  280. connectonion/docs/integrations/microsoft.md +370 -0
  281. connectonion/docs/network/README.md +14 -0
  282. connectonion/docs/network/connect.md +629 -0
  283. connectonion/docs/network/deploy.md +124 -0
  284. connectonion/docs/network/host.md +1087 -0
  285. connectonion/docs/network/io.md +538 -0
  286. connectonion/docs/network/protocol/agent-relay-protocol.md +495 -0
  287. connectonion/docs/network/protocol/announce-message.md +115 -0
  288. connectonion/docs/principles.md +124 -0
  289. connectonion/docs/quickstart.md +261 -0
  290. connectonion/docs/roadmap.md +81 -0
  291. connectonion/docs/templates/README.md +77 -0
  292. connectonion/docs/templates/meta-agent.md +152 -0
  293. connectonion/docs/templates/minimal.md +105 -0
  294. connectonion/docs/templates/playwright.md +130 -0
  295. connectonion/docs/templates/web-research.md +144 -0
  296. connectonion/docs/tui/README.md +95 -0
  297. connectonion/docs/tui/chat.md +181 -0
  298. connectonion/docs/tui/divider.md +63 -0
  299. connectonion/docs/tui/dropdown.md +83 -0
  300. connectonion/docs/tui/footer.md +44 -0
  301. connectonion/docs/tui/fuzzy.md +68 -0
  302. connectonion/docs/tui/input.md +84 -0
  303. connectonion/docs/tui/keys.md +77 -0
  304. connectonion/docs/tui/pick.md +71 -0
  305. connectonion/docs/tui/providers.md +89 -0
  306. connectonion/docs/tui/status_bar.md +67 -0
  307. connectonion/docs/useful_plugins/README.md +160 -0
  308. connectonion/docs/useful_plugins/calendar_plugin.md +68 -0
  309. connectonion/docs/useful_plugins/eval.md +89 -0
  310. connectonion/docs/useful_plugins/gmail_plugin.md +68 -0
  311. connectonion/docs/useful_plugins/image_result_formatter.md +74 -0
  312. connectonion/docs/useful_plugins/re_act.md +86 -0
  313. connectonion/docs/useful_plugins/shell_approval.md +69 -0
  314. connectonion/docs/useful_plugins/system_reminder.md +210 -0
  315. connectonion/docs/useful_prompts/README.md +127 -0
  316. connectonion/docs/useful_prompts/coding_agent.md +214 -0
  317. connectonion/docs/useful_tools/README.md +81 -0
  318. connectonion/docs/useful_tools/ask_user.md +103 -0
  319. connectonion/docs/useful_tools/diff_writer.md +158 -0
  320. connectonion/docs/useful_tools/get_emails.md +519 -0
  321. connectonion/docs/useful_tools/gmail.md +155 -0
  322. connectonion/docs/useful_tools/google_calendar.md +126 -0
  323. connectonion/docs/useful_tools/memory.md +506 -0
  324. connectonion/docs/useful_tools/microsoft_calendar.md +126 -0
  325. connectonion/docs/useful_tools/outlook.md +140 -0
  326. connectonion/docs/useful_tools/send_email.md +423 -0
  327. connectonion/docs/useful_tools/shell.md +115 -0
  328. connectonion/docs/useful_tools/slash_command.md +116 -0
  329. connectonion/docs/useful_tools/terminal.md +115 -0
  330. connectonion/docs/useful_tools/todo_list.md +272 -0
  331. connectonion/docs/useful_tools/web_fetch.md +150 -0
  332. connectonion/docs/vibe-coding-guide.md +97 -0
  333. connectonion/docs/windows-support.md +258 -0
  334. connectonion/logger.py +3 -3
  335. connectonion/network/__init__.py +19 -6
  336. connectonion/network/asgi/__init__.py +81 -0
  337. connectonion/network/asgi/http.py +205 -0
  338. connectonion/network/asgi/websocket.py +217 -0
  339. connectonion/network/connect.py +232 -185
  340. connectonion/network/host/__init__.py +59 -0
  341. connectonion/network/host/auth.py +191 -0
  342. connectonion/network/host/routes.py +135 -0
  343. connectonion/network/host/server.py +289 -0
  344. connectonion/network/host/session.py +78 -0
  345. connectonion/network/io/__init__.py +21 -0
  346. connectonion/network/{connection.py → io/base.py} +17 -42
  347. connectonion/network/io/websocket.py +55 -0
  348. connectonion/network/relay.py +37 -16
  349. connectonion/network/trust/__init__.py +30 -0
  350. connectonion/network/trust/factory.py +138 -0
  351. connectonion/network/{trust_agents.py → trust/prompts.py} +3 -3
  352. connectonion/network/{trust_functions.py → trust/tools.py} +2 -2
  353. connectonion/prompt_files/__init__.py +11 -1
  354. connectonion/prompt_files/react_acknowledge.md +26 -0
  355. connectonion/prompts.py +10 -1
  356. connectonion/tui/chat.py +10 -1
  357. connectonion/tui/divider.py +10 -1
  358. connectonion/tui/dropdown.py +10 -1
  359. connectonion/tui/footer.py +8 -0
  360. connectonion/tui/fuzzy.py +11 -1
  361. connectonion/tui/input.py +118 -70
  362. connectonion/tui/keys.py +133 -6
  363. connectonion/tui/providers.py +11 -1
  364. connectonion/tui/status_bar.py +10 -1
  365. connectonion/useful_events_handlers/__init__.py +8 -0
  366. connectonion/useful_events_handlers/reflect.py +19 -4
  367. connectonion/useful_plugins/__init__.py +2 -1
  368. connectonion/useful_plugins/eval.py +2 -2
  369. connectonion/useful_plugins/gmail_plugin.py +3 -3
  370. connectonion/useful_plugins/image_result_formatter.py +3 -3
  371. connectonion/useful_plugins/re_act.py +114 -28
  372. connectonion/useful_plugins/shell_approval.py +2 -2
  373. connectonion/useful_plugins/system_reminder.py +103 -0
  374. connectonion/useful_plugins/ui_stream.py +18 -133
  375. connectonion/useful_prompts/README.md +61 -0
  376. connectonion/useful_prompts/__init__.py +45 -0
  377. connectonion/useful_prompts/coding_agent/README.md +106 -0
  378. connectonion/useful_prompts/coding_agent/assembler.py +123 -0
  379. connectonion/useful_prompts/coding_agent/prompts/main.md +227 -0
  380. connectonion/useful_prompts/coding_agent/prompts/tools/ask_user.md +61 -0
  381. connectonion/useful_prompts/coding_agent/prompts/tools/background.md +57 -0
  382. connectonion/useful_prompts/coding_agent/prompts/tools/edit.md +90 -0
  383. connectonion/useful_prompts/coding_agent/prompts/tools/glob.md +52 -0
  384. connectonion/useful_prompts/coding_agent/prompts/tools/grep.md +55 -0
  385. connectonion/useful_prompts/coding_agent/prompts/tools/plan_mode.md +80 -0
  386. connectonion/useful_prompts/coding_agent/prompts/tools/read.md +40 -0
  387. connectonion/useful_prompts/coding_agent/prompts/tools/shell.md +67 -0
  388. connectonion/useful_prompts/coding_agent/prompts/tools/task.md +51 -0
  389. connectonion/useful_prompts/coding_agent/prompts/tools/todo.md +139 -0
  390. connectonion/useful_prompts/coding_agent/prompts/tools/write.md +48 -0
  391. connectonion/useful_prompts/system-reminders/security-warning.md +14 -0
  392. connectonion/useful_prompts/system-reminders/test-reminder.md +11 -0
  393. connectonion/useful_tools/__init__.py +31 -4
  394. connectonion/useful_tools/ask_user.py +35 -0
  395. connectonion/useful_tools/bash.py +69 -0
  396. connectonion/useful_tools/diff_writer.py +186 -94
  397. connectonion/useful_tools/edit.py +102 -0
  398. connectonion/useful_tools/glob_files.py +97 -0
  399. connectonion/useful_tools/grep_files.py +171 -0
  400. connectonion/useful_tools/multi_edit.py +116 -0
  401. connectonion/useful_tools/read_file.py +73 -0
  402. connectonion/useful_tools/shell.py +50 -45
  403. connectonion/useful_tools/write_file.py +129 -0
  404. {connectonion-0.6.1.dist-info → connectonion-0.6.3.dist-info}/METADATA +10 -3
  405. connectonion-0.6.3.dist-info/RECORD +469 -0
  406. connectonion/cli/browser_agent/scroll_strategies.py +0 -276
  407. connectonion/network/asgi.py +0 -407
  408. connectonion/network/host.py +0 -616
  409. connectonion/network/trust.py +0 -166
  410. connectonion-0.6.1.dist-info/RECORD +0 -123
  411. /connectonion/cli/{docs → co_ai/prompts/connectonion}/connectonion.md +0 -0
  412. {connectonion-0.6.1.dist-info → connectonion-0.6.3.dist-info}/WHEEL +0 -0
  413. {connectonion-0.6.1.dist-info → connectonion-0.6.3.dist-info}/entry_points.txt +0 -0
@@ -1,20 +1,24 @@
1
1
  """
2
- Purpose: ReAct (Reasoning + Acting) plugin that adds planning and reflection to agent execution
2
+ Purpose: ReAct (Reasoning + Acting) plugin that adds intent recognition and reflection to agent execution
3
3
  LLM-Note:
4
- Dependencies: imports from [pathlib, typing, events.after_user_input, llm_do, useful_events_handlers.reflect] | imported by [useful_plugins/__init__.py] | uses prompt file [prompt_files/react_plan.md] | tested by [tests/unit/test_re_act_plugin.py]
5
- Data flow: after_user_input → plan_task() generates a plan using llm_do() stores in agent.current_session['plan'] → after_tools → reflect() from useful_events_handlers evaluates results → generates reflection for next step
6
- State/Effects: modifies agent.current_session['plan'] and ['expected'] | makes LLM calls for planning and reflection | no file I/O | no network besides LLM
7
- Integration: exposes re_act plugin list with [plan_task, reflect] event handlers | used via Agent(plugins=[re_act]) | works with eval plugin for debugging
8
- Performance: 1-2 LLM calls per turn (plan + reflect) | adds latency but improves agent reasoning
4
+ Dependencies: imports from [pathlib, typing, events.after_user_input, llm_do, useful_events_handlers.reflect] | imported by [useful_plugins/__init__.py] | uses prompt file [prompt_files/react_acknowledge.md] | tested by [tests/unit/test_re_act_plugin.py]
5
+ Data flow: after_user_input → acknowledge_request() → after_tools → reflect()
6
+ State/Effects: modifies agent.current_session['intent'] | makes LLM calls for intent, reflection | no file I/O
7
+ Integration: exposes re_act plugin list with [acknowledge_request, reflect] event handlers | used via Agent(plugins=[re_act])
8
+ Performance: 2 LLM calls per turn (intent + reflect) | adds latency but improves agent reasoning
9
9
  Errors: no explicit error handling | LLM failures propagate | silent skip if no user_prompt
10
10
 
11
11
  ReAct plugin - Reasoning and Acting pattern for AI agents.
12
12
 
13
- Implements the ReAct (Reason + Act) pattern:
14
- 1. After user input: Plan what to do
15
- 2. After tool execution: Reflect on results and plan next step
13
+ Implements a simplified ReAct pattern:
14
+ 1. After user input: Acknowledge request (show we understood)
15
+ 2. After tool execution: Reflect on results
16
16
 
17
- For evaluation/debugging, use the separate `eval` plugin.
17
+ Planning is left to the main agent - this plugin just adds intent recognition and reflection.
18
+
19
+ Trace kinds for frontend rendering:
20
+ - kind='intent' → Show as "Understanding..." card
21
+ - kind='reflect' → Show as "Reflecting..." card
18
22
 
19
23
  Usage:
20
24
  from connectonion import Agent
@@ -37,42 +41,124 @@ if TYPE_CHECKING:
37
41
  from ..core.agent import Agent
38
42
 
39
43
  # Prompts
40
- PLAN_PROMPT = Path(__file__).parent.parent / "prompt_files" / "react_plan.md"
44
+ ACKNOWLEDGE_PROMPT = Path(__file__).parent.parent / "prompt_files" / "react_acknowledge.md"
45
+
46
+
47
+ def _format_conversation(
48
+ messages: list,
49
+ max_tokens: int = 4000,
50
+ max_messages: int = 50,
51
+ ) -> str:
52
+ """Format conversation history with smart truncation.
53
+
54
+ Only truncates when context exceeds budget. Priorities:
55
+ 1. User messages: always kept full (important context)
56
+ 2. Recent assistant messages: kept longer
57
+ 3. Older assistant messages: truncated first
58
+
59
+ Args:
60
+ messages: List of message dicts with 'role' and 'content'
61
+ max_tokens: Approximate token budget (~4 chars per token)
62
+ max_messages: Max number of messages to consider
63
+ """
64
+ max_chars = max_tokens * 4 # ~4 chars per token approximation
65
+
66
+ recent = messages[-max_messages:] if len(messages) > max_messages else messages
67
+ if not recent:
68
+ return ""
69
+
70
+ # First pass: calculate total size with full messages
71
+ total_chars = sum(len(m.get('content', '')) for m in recent)
72
+
73
+ # If under budget, return everything full
74
+ if total_chars <= max_chars:
75
+ lines = []
76
+ for msg in recent:
77
+ role = msg.get('role', 'unknown')
78
+ content = msg.get('content', '')
79
+ if content:
80
+ lines.append(f"{role}: {content}")
81
+ return "\n".join(lines)
82
+
83
+ # Over budget: smart truncation
84
+ # User messages kept full, truncate assistant messages
85
+ user_chars = sum(len(m.get('content', '')) for m in recent if m.get('role') == 'user')
86
+ available_for_assistant = max_chars - user_chars
87
+
88
+ assistant_msgs = [m for m in recent if m.get('role') == 'assistant' and m.get('content')]
89
+ if not assistant_msgs:
90
+ return "\n".join(f"user: {m.get('content', '')}" for m in recent if m.get('role') == 'user')
91
+
92
+ # Distribute chars to assistant messages (more to recent ones)
93
+ n = len(assistant_msgs)
94
+ weights = [1 + (i / n) for i in range(n)] # older=1.0, recent=~2.0
95
+ total_weight = sum(weights)
96
+ char_budgets = [int(available_for_assistant * w / total_weight) for w in weights]
97
+
98
+ # Build output
99
+ lines = []
100
+ assistant_idx = 0
101
+ for msg in recent:
102
+ role = msg.get('role', 'unknown')
103
+ content = msg.get('content', '')
104
+ if not content:
105
+ continue
106
+
107
+ if role == 'user':
108
+ lines.append(f"user: {content}")
109
+ elif role == 'assistant':
110
+ budget = char_budgets[assistant_idx] if assistant_idx < len(char_budgets) else 200
111
+ assistant_idx += 1
112
+ if len(content) > budget:
113
+ content = content[:budget] + "..."
114
+ lines.append(f"assistant: {content}")
115
+
116
+ return "\n".join(lines)
41
117
 
42
118
 
43
119
  @after_user_input
44
- def plan_task(agent: 'Agent') -> None:
45
- """Plan the task after receiving user input."""
120
+ def acknowledge_request(agent: 'Agent') -> None:
121
+ """Immediately acknowledge the user's request to show we understood."""
46
122
  user_prompt = agent.current_session.get('user_prompt', '')
47
123
  if not user_prompt:
48
124
  return
49
125
 
50
- tool_names = agent.tools.names() if agent.tools else []
51
- tools_str = ", ".join(tool_names) if tool_names else "no tools"
126
+ # Include conversation history for context
127
+ messages = agent.current_session.get('messages', [])
128
+ conversation = _format_conversation(messages)
52
129
 
53
- prompt = f"""User request: {user_prompt}
130
+ prompt = f"""Conversation so far:
131
+ {conversation}
54
132
 
55
- Available tools: {tools_str}
133
+ Current user input: {user_prompt}
56
134
 
57
- Brief plan (1-2 sentences): what to do first?"""
135
+ Acknowledge this request (1-2 sentences):"""
58
136
 
59
- agent.logger.print("[dim]/planning...[/dim]")
137
+ model = "co/gemini-2.5-flash"
138
+ agent.logger.print(f"[dim]/understanding ({model})...[/dim]")
60
139
 
61
- plan = llm_do(
140
+ ack = llm_do(
62
141
  prompt,
63
- model="co/gemini-2.5-flash",
64
- temperature=0.2,
65
- system_prompt=PLAN_PROMPT
142
+ model=model,
143
+ temperature=0.3,
144
+ system_prompt=ACKNOWLEDGE_PROMPT
66
145
  )
67
146
 
68
- # Store plan as expected outcome (used by eval plugin if present)
69
- agent.current_session['expected'] = plan
147
+ agent.current_session['intent'] = ack
148
+
149
+ agent._record_trace({
150
+ 'type': 'thinking',
151
+ 'kind': 'intent',
152
+ 'content': ack,
153
+ })
70
154
 
155
+ # Add to messages so LLM sees the understanding
71
156
  agent.current_session['messages'].append({
72
157
  'role': 'assistant',
73
- 'content': f"💭 {plan}"
158
+ 'content': ack
74
159
  })
75
160
 
76
161
 
77
- # Bundle as plugin: plan (after_user_input) + reflect (after_tools)
78
- re_act = [plan_task, reflect]
162
+ # Bundle as plugin: acknowledge (after_user_input) + reflect (after_tools)
163
+ # Planning is handled by the main agent
164
+ re_act = [acknowledge_request, reflect]
@@ -105,9 +105,9 @@ def _check_approval(agent: 'Agent') -> None:
105
105
  if not pending:
106
106
  return
107
107
 
108
- # Only check bash/shell tools
108
+ # Only check bash/shell tools (including run_in_dir)
109
109
  tool_name = pending['name']
110
- if tool_name not in ('bash', 'shell', 'run'):
110
+ if tool_name not in ('bash', 'shell', 'run', 'run_in_dir'):
111
111
  return
112
112
 
113
113
  # Get command from arguments
@@ -0,0 +1,103 @@
1
+ """
2
+ System Reminder Plugin - Injects contextual guidance into tool results.
3
+
4
+ Usage:
5
+ from connectonion.useful_plugins import system_reminder
6
+ agent = Agent("assistant", plugins=[system_reminder])
7
+
8
+ To customize, use `co copy system_reminder` which copies both the plugin
9
+ and the prompt files to your project.
10
+ """
11
+
12
+ from pathlib import Path
13
+ import fnmatch
14
+ from typing import TYPE_CHECKING
15
+
16
+ from ..core.events import after_each_tool
17
+
18
+ if TYPE_CHECKING:
19
+ from ..core.agent import Agent
20
+
21
+ # Default reminders directory
22
+ REMINDERS_DIR = Path(__file__).parent.parent / "useful_prompts" / "system-reminders"
23
+
24
+
25
+ def _parse_frontmatter(text):
26
+ """Parse YAML frontmatter from markdown."""
27
+ if not text.startswith('---'):
28
+ return {}, text
29
+ parts = text.split('---', 2)
30
+ if len(parts) < 3:
31
+ return {}, text
32
+ import yaml
33
+ return yaml.safe_load(parts[1]) or {}, parts[2].strip()
34
+
35
+
36
+ def _load_reminders(reminders_dir):
37
+ """Load all .md reminder files from directory."""
38
+ reminders_dir = Path(reminders_dir)
39
+ if not reminders_dir.exists():
40
+ return {}
41
+ reminders = {}
42
+ for f in reminders_dir.glob("*.md"):
43
+ meta, body = _parse_frontmatter(f.read_text())
44
+ if meta.get('name'):
45
+ reminders[meta['name']] = {'content': body, 'triggers': meta.get('triggers', [])}
46
+ return reminders
47
+
48
+
49
+ def _matches_pattern(pattern, value):
50
+ """Check if value matches glob pattern(s)."""
51
+ if not pattern or not value:
52
+ return False
53
+ patterns = [pattern] if isinstance(pattern, str) else pattern
54
+ return any(fnmatch.fnmatch(value, p) for p in patterns)
55
+
56
+
57
+ def _find_reminder(reminders, tool_name, args):
58
+ """Find matching reminder content."""
59
+ for reminder in reminders.values():
60
+ for trigger in reminder['triggers']:
61
+ if trigger.get('tool') and trigger['tool'] != tool_name:
62
+ continue
63
+ if trigger.get('path_pattern'):
64
+ path = args.get('path') or args.get('file_path', '')
65
+ if not _matches_pattern(trigger['path_pattern'], path):
66
+ continue
67
+ if trigger.get('command_pattern'):
68
+ cmd = args.get('command') or args.get('cmd', '')
69
+ if not _matches_pattern(trigger['command_pattern'], cmd):
70
+ continue
71
+ # All conditions matched
72
+ content = reminder['content']
73
+ path = args.get('path') or args.get('file_path', '')
74
+ return content.replace('${file_path}', path).replace('${tool_name}', tool_name)
75
+ return None
76
+
77
+
78
+ # Load reminders once at import
79
+ _REMINDERS = _load_reminders(REMINDERS_DIR)
80
+
81
+
82
+ @after_each_tool
83
+ def inject_reminder(agent: 'Agent') -> None:
84
+ """Inject matching system reminder into tool result."""
85
+ trace = agent.current_session.get('trace', [])
86
+ messages = agent.current_session.get('messages', [])
87
+ if not trace or not messages:
88
+ return
89
+
90
+ last = trace[-1]
91
+ if last.get('type') != 'tool_result':
92
+ return
93
+
94
+ content = _find_reminder(_REMINDERS, last.get('name', ''), last.get('args', {}))
95
+ if content:
96
+ for msg in reversed(messages):
97
+ if msg.get('role') == 'tool':
98
+ msg['content'] = msg.get('content', '') + '\n\n' + content
99
+ break
100
+
101
+
102
+ # Export plugin
103
+ system_reminder = [inject_reminder]
@@ -1,20 +1,17 @@
1
1
  """
2
- Purpose: Stream agent activity to UI via Connection API
2
+ Purpose: Plugin for streaming agent completion summaries to WebSocket UI clients
3
3
  LLM-Note:
4
- Dependencies: imports from [typing, core.events] | imported by [useful_plugins/__init__.py] | tested by [tests/unit/test_ui_stream.py]
5
- Data flow: Event handlers check agent.connectionif present, call connection.log() to stream events
6
- State/Effects: Streams events to WebSocket client | no file I/O | no blocking
7
- Integration: exposes ui_stream list of event handlers | used via Agent(plugins=[ui_stream]) | works with host() WebSocket
8
- Performance: O(1) event dispatch | no blocking | no LLM calls
9
- Errors: Silently skips if connection is None (local execution)
10
-
11
- UI Stream Plugin - Stream agent activity to connected UI clients.
12
-
13
- When agent.connection is set (by host() for WebSocket connections), this plugin
14
- streams real-time events for:
15
- - LLM responses (thinking, tool_calls)
16
- - Tool execution (before/after each tool)
17
- - Errors and completion
4
+ Dependencies: imports from [core/events.py on_complete, typing] | imported by [useful_plugins/__init__.py, user code] | tested by [tests/plugins/test_ui_stream.py]
5
+ Data flow: fires on_complete event extracts trace from current_session counts tools_used and llm_calls → sends via agent.io.log('complete', tools_used, llm_calls, iterations) WebSocket client receives completion event
6
+ State/Effects: sends message via agent.io (if connected) | no persistent state | read-only access to session trace
7
+ Integration: exposes ui_stream plugin (use via plugins=[ui_stream]) | only fires if agent.io exists (hosted mode) | complements direct events from agent.py/tool_executor.py | stream_complete handler decorated with @on_complete
8
+ Performance: minimal overhead (just counting trace entries) | single io.log call
9
+ Errors: returns early if no io connection | no exceptions raised
10
+ UI Stream Plugin - Stream agent completion summary to connected UI clients.
11
+
12
+ Events (user_input, thinking, tool_result, assistant) are now emitted directly
13
+ from their source (agent.py, tool_executor.py, plugins). This plugin only
14
+ handles the completion summary.
18
15
 
19
16
  Usage:
20
17
  from connectonion import Agent
@@ -25,128 +22,23 @@ Usage:
25
22
  """
26
23
 
27
24
  from typing import TYPE_CHECKING
28
- from ..core.events import (
29
- after_llm,
30
- before_each_tool,
31
- after_each_tool,
32
- on_error,
33
- on_complete,
34
- )
25
+ from ..core.events import on_complete
35
26
 
36
27
  if TYPE_CHECKING:
37
28
  from ..core.agent import Agent
38
29
 
39
30
 
40
- @after_llm
41
- def stream_llm_response(agent: 'Agent') -> None:
42
- """Stream LLM response to connected UI."""
43
- if not agent.connection:
44
- return
45
-
46
- trace = agent.current_session.get('trace', [])
47
- if not trace:
48
- return
49
-
50
- last = trace[-1]
51
- if last.get('type') != 'llm_call':
52
- return
53
-
54
- # Stream content if present
55
- content = last.get('content', '')
56
- if content:
57
- agent.connection.log('message', content=content)
58
-
59
- # Stream tool calls if present
60
- tool_calls = last.get('tool_calls', [])
61
- for tc in tool_calls:
62
- agent.connection.log(
63
- 'tool_pending',
64
- name=tc.get('function', {}).get('name', ''),
65
- arguments=tc.get('function', {}).get('arguments', {}),
66
- id=tc.get('id', ''),
67
- )
68
-
69
-
70
- @before_each_tool
71
- def stream_tool_start(agent: 'Agent') -> None:
72
- """Stream tool execution start to connected UI."""
73
- if not agent.connection:
74
- return
75
-
76
- pending = agent.current_session.get('pending_tool')
77
- if not pending:
78
- return
79
-
80
- agent.connection.log(
81
- 'tool_start',
82
- name=pending['name'],
83
- arguments=pending['arguments'],
84
- id=pending.get('id', ''),
85
- )
86
-
87
-
88
- @after_each_tool
89
- def stream_tool_result(agent: 'Agent') -> None:
90
- """Stream tool execution result to connected UI."""
91
- if not agent.connection:
92
- return
93
-
94
- trace = agent.current_session.get('trace', [])
95
- if not trace:
96
- return
97
-
98
- last = trace[-1]
99
- if last.get('type') != 'tool_execution':
100
- return
101
-
102
- status = last.get('status', 'unknown')
103
- result = last.get('result', '')
104
-
105
- # Truncate large results for UI
106
- if isinstance(result, str) and len(result) > 1000:
107
- result = result[:1000] + '...'
108
-
109
- agent.connection.log(
110
- 'tool_result',
111
- name=last.get('tool_name', ''),
112
- status=status,
113
- result=result,
114
- timing_ms=last.get('timing', 0),
115
- )
116
-
117
-
118
- @on_error
119
- def stream_error(agent: 'Agent') -> None:
120
- """Stream error to connected UI."""
121
- if not agent.connection:
122
- return
123
-
124
- trace = agent.current_session.get('trace', [])
125
- if not trace:
126
- return
127
-
128
- last = trace[-1]
129
- if last.get('status') != 'error':
130
- return
131
-
132
- agent.connection.log(
133
- 'error',
134
- tool_name=last.get('tool_name', ''),
135
- error=str(last.get('error', '')),
136
- )
137
-
138
-
139
31
  @on_complete
140
32
  def stream_complete(agent: 'Agent') -> None:
141
- """Stream completion to connected UI."""
142
- if not agent.connection:
33
+ """Stream completion summary to connected UI."""
34
+ if not agent.io:
143
35
  return
144
36
 
145
37
  trace = agent.current_session.get('trace', [])
146
- tools_used = [t.get('tool_name', '') for t in trace if t.get('type') == 'tool_execution']
38
+ tools_used = [t.get('name', '') for t in trace if t.get('type') == 'tool_result']
147
39
  llm_calls = len([t for t in trace if t.get('type') == 'llm_call'])
148
40
 
149
- agent.connection.log(
41
+ agent.io.log(
150
42
  'complete',
151
43
  tools_used=tools_used,
152
44
  llm_calls=llm_calls,
@@ -154,11 +46,4 @@ def stream_complete(agent: 'Agent') -> None:
154
46
  )
155
47
 
156
48
 
157
- # Bundle as plugin
158
- ui_stream = [
159
- stream_llm_response,
160
- stream_tool_start,
161
- stream_tool_result,
162
- stream_error,
163
- stream_complete,
164
- ]
49
+ ui_stream = [stream_complete]
@@ -0,0 +1,61 @@
1
+ # useful_prompts
2
+
3
+ Prompt examples and patterns for ConnectOnion agents. Copy what you need to your project.
4
+
5
+ ## Philosophy
6
+
7
+ These are **examples**, not framework code. You:
8
+ 1. Browse the examples
9
+ 2. Copy what fits your needs
10
+ 3. Modify freely - you own the code now
11
+
12
+ No lock-in. No rigid structure. Just good patterns.
13
+
14
+ ## Available Examples
15
+
16
+ ### coding_agent/
17
+ A modular prompt structure for coding assistants.
18
+
19
+ ```
20
+ coding_agent/
21
+ ├── prompts/
22
+ │ ├── main.md # Core agent behavior
23
+ │ └── tools/ # Per-tool guidance
24
+ │ ├── shell.md
25
+ │ ├── read.md
26
+ │ ├── write.md
27
+ │ └── todo.md
28
+ ├── assembler.py # Simple prompt assembly
29
+ └── README.md
30
+ ```
31
+
32
+ **Good for:** CLI coding assistants, code review bots, development helpers
33
+
34
+ ## How to Use
35
+
36
+ ```bash
37
+ # Copy the example to your project
38
+ cp -r useful_prompts/coding_agent/ my-project/
39
+
40
+ # Customize the prompts
41
+ cd my-project/coding_agent
42
+ vim prompts/main.md # Edit core behavior
43
+ vim prompts/tools/shell.md # Edit shell guidance
44
+ ```
45
+
46
+ ## Creating Your Own
47
+
48
+ 1. Start with an existing example
49
+ 2. Modify `main.md` for your agent's personality
50
+ 3. Add/remove tool files as needed
51
+ 4. Customize `assembler.py` for your assembly logic
52
+
53
+ ## Principles
54
+
55
+ From Claude Code's architecture, we learned:
56
+
57
+ 1. **Modular prompts** - Split by concern (main, per-tool)
58
+ 2. **"When NOT to use"** - As important as "when to use"
59
+ 3. **Examples with reasoning** - Show good AND bad patterns
60
+ 4. **Assembly at runtime** - Combine pieces based on available tools
61
+ 5. **User owns the code** - No framework lock-in
@@ -0,0 +1,45 @@
1
+ """
2
+ Purpose: Prompt templates directory with utility for copying example prompts to user projects
3
+ LLM-Note:
4
+ Dependencies: imports from [pathlib] | imported by [cli/commands/copy_commands.py, user code] | tested by [tests/prompts/test_useful_prompts.py]
5
+ Data flow: get_example_path(name) → returns Path to template directory for copying | PROMPTS_DIR constant points to useful_prompts/ directory
6
+ State/Effects: reads filesystem (Path operations) | no modifications
7
+ Integration: exposes PROMPTS_DIR constant, get_example_path(name) → Path | used by `co copy coding_agent` command to copy templates | contains coding_agent/ subdirectory with main.md, tools/*.md, assembler.py
8
+ Performance: trivial (Path operations only)
9
+ Errors: none (Path returned whether directory exists or not, caller handles)
10
+ useful_prompts - Prompt templates for ConnectOnion agents.
11
+
12
+ These are PROMPT TEMPLATES to copy to your project, not framework code to import.
13
+
14
+ Usage:
15
+ 1. Run: co copy coding_agent
16
+ 2. Customize the markdown files in prompts/coding_agent/
17
+ 3. Use assembler.py to build your system prompt
18
+
19
+ Available prompts:
20
+ - coding_agent/ : Coding Agent Prompt - modular template for coding assistants
21
+
22
+ See README.md for details.
23
+ """
24
+
25
+ from pathlib import Path
26
+
27
+ # Path to useful_prompts directory (for copying examples)
28
+ PROMPTS_DIR = Path(__file__).parent
29
+
30
+
31
+ def get_example_path(name: str) -> Path:
32
+ """Get path to an example directory for copying.
33
+
34
+ Args:
35
+ name: Example name (e.g., "coding_agent")
36
+
37
+ Returns:
38
+ Path to the example directory
39
+
40
+ Example:
41
+ >>> from connectonion.useful_prompts import get_example_path
42
+ >>> import shutil
43
+ >>> shutil.copytree(get_example_path("coding_agent"), "my_prompts")
44
+ """
45
+ return PROMPTS_DIR / name