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.
- connectonion/__init__.py +46 -9
- connectonion/cli/__init__.py +11 -1
- connectonion/cli/browser_agent/__init__.py +11 -1
- connectonion/cli/browser_agent/browser.py +95 -142
- connectonion/cli/browser_agent/element_finder.py +147 -0
- connectonion/cli/browser_agent/highlight_screenshot.py +182 -0
- connectonion/cli/browser_agent/prompt.md +188 -105
- connectonion/cli/browser_agent/prompts/element_matcher.md +59 -0
- connectonion/cli/browser_agent/prompts/form_filler.md +19 -0
- connectonion/cli/browser_agent/prompts/scroll_strategy.md +36 -0
- connectonion/cli/browser_agent/scripts/extract_elements.js +126 -0
- connectonion/cli/browser_agent/scroll.py +145 -0
- connectonion/cli/co_ai/__init__.py +6 -0
- connectonion/cli/co_ai/agent.py +87 -0
- connectonion/cli/co_ai/agents/__init__.py +5 -0
- connectonion/cli/co_ai/agents/registry.py +57 -0
- connectonion/cli/co_ai/commands/__init__.py +45 -0
- connectonion/cli/co_ai/commands/compact.py +173 -0
- connectonion/cli/co_ai/commands/cost.py +77 -0
- connectonion/cli/co_ai/commands/export.py +60 -0
- connectonion/cli/co_ai/commands/help.py +80 -0
- connectonion/cli/co_ai/commands/init.py +101 -0
- connectonion/cli/co_ai/commands/sessions.py +55 -0
- connectonion/cli/co_ai/commands/tasks.py +63 -0
- connectonion/cli/co_ai/commands/undo.py +103 -0
- connectonion/cli/co_ai/context.py +127 -0
- connectonion/cli/co_ai/main.py +52 -0
- connectonion/cli/co_ai/plugins/__init__.py +6 -0
- connectonion/cli/co_ai/plugins/reminder.py +76 -0
- connectonion/cli/co_ai/plugins/shell_approval.py +105 -0
- connectonion/cli/co_ai/prompts/agents/explore.md +79 -0
- connectonion/cli/co_ai/prompts/agents/plan.md +60 -0
- connectonion/cli/co_ai/prompts/assembler.py +303 -0
- connectonion/cli/{docs/co-vibecoding-principles-docs-contexts-all-in-one.md → co_ai/prompts/connectonion/README.md} +26 -0
- connectonion/cli/co_ai/prompts/connectonion/api.md +457 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/README.md +805 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/auth.md +46 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/browser.md +235 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/copy.md +184 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/create.md +335 -0
- connectonion/cli/co_ai/prompts/connectonion/cli/init.md +431 -0
- connectonion/cli/co_ai/prompts/connectonion/co-directory-structure.md +214 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/agent.md +1078 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/events.md +816 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/llm_do.md +256 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/max_iterations.md +362 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/models.md +641 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/plugins.md +100 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/prompts.md +122 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/tools.md +512 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/transcribe.md +156 -0
- connectonion/cli/co_ai/prompts/connectonion/concepts/trust.md +291 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/README.md +18 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/auto_debug.md +1026 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/console.md +129 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/eval-format.md +178 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/eval.md +230 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/exceptions.md +307 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/log.md +117 -0
- connectonion/cli/co_ai/prompts/connectonion/debug/xray.md +215 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/001-choosing-input-method.md +202 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/002-choosing-llm-function-name.md +202 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/003-choosing-trust-keyword.md +141 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/004-cli-create-flow.md +117 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/005-designing-agent-network-protocol.md +503 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/006-agent-address-format.md +305 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/007-authentication-backend-design.md +240 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/008-naming-is-hard.md +228 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/009-why-connect-function.md +167 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/011-global-config-identity-management.md +357 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/012-tool-execution-separation.md +259 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/013-debug-and-logging-design.md +253 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/014-hook-system-design.md +510 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/015-interactive-auto-debug-design.md +837 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/017-session-logging-and-eval-format.md +120 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/018-event-api-naming.md +274 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/019-agent-lifecycle-design.md +655 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/020-trust-system-and-network-architecture.md +503 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/021-task-storage-jsonl-design.md +496 -0
- connectonion/cli/co_ai/prompts/connectonion/design-decisions/022-raw-asgi-implementation.md +273 -0
- connectonion/cli/co_ai/prompts/connectonion/examples/agent_reasoning.md +62 -0
- connectonion/cli/co_ai/prompts/connectonion/examples/atomic_tools.md +24 -0
- connectonion/cli/co_ai/prompts/connectonion/examples/load_guide.md +18 -0
- connectonion/cli/co_ai/prompts/connectonion/examples.md +0 -0
- connectonion/cli/co_ai/prompts/connectonion/hook-system-options.md +364 -0
- connectonion/cli/co_ai/prompts/connectonion/index.md +162 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/README.md +12 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/auth.md +450 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/google.md +431 -0
- connectonion/cli/co_ai/prompts/connectonion/integrations/microsoft.md +370 -0
- connectonion/cli/co_ai/prompts/connectonion/network/README.md +14 -0
- connectonion/cli/co_ai/prompts/connectonion/network/connect.md +543 -0
- connectonion/cli/co_ai/prompts/connectonion/network/connection.md +538 -0
- connectonion/cli/co_ai/prompts/connectonion/network/deploy.md +123 -0
- connectonion/cli/co_ai/prompts/connectonion/network/host.md +1049 -0
- connectonion/cli/co_ai/prompts/connectonion/network/protocol/agent-relay-protocol.md +495 -0
- connectonion/cli/co_ai/prompts/connectonion/network/protocol/announce-message.md +115 -0
- connectonion/cli/co_ai/prompts/connectonion/principles.md +124 -0
- connectonion/cli/co_ai/prompts/connectonion/quickstart.md +261 -0
- connectonion/cli/co_ai/prompts/connectonion/roadmap.md +81 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/README.md +77 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/meta-agent.md +152 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/minimal.md +105 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/playwright.md +130 -0
- connectonion/cli/co_ai/prompts/connectonion/templates/web-research.md +144 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/README.md +95 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/chat.md +181 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/divider.md +63 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/dropdown.md +83 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/footer.md +44 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/fuzzy.md +68 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/input.md +84 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/keys.md +77 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/pick.md +71 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/providers.md +89 -0
- connectonion/cli/co_ai/prompts/connectonion/tui/status_bar.md +67 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/README.md +156 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/calendar_plugin.md +68 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/eval.md +89 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/gmail_plugin.md +68 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/image_result_formatter.md +74 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/re_act.md +86 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_plugins/shell_approval.md +69 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/README.md +81 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/diff_writer.md +138 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/get_emails.md +499 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/gmail.md +135 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/google_calendar.md +106 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/memory.md +486 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/microsoft_calendar.md +106 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/outlook.md +120 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/send_email.md +403 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/shell.md +95 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/slash_command.md +96 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/terminal.md +97 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/todo_list.md +252 -0
- connectonion/cli/co_ai/prompts/connectonion/useful_tools/web_fetch.md +130 -0
- connectonion/cli/co_ai/prompts/connectonion/vibe-coding-guide.md +97 -0
- connectonion/cli/co_ai/prompts/connectonion/windows-support.md +258 -0
- connectonion/cli/co_ai/prompts/main.md +247 -0
- connectonion/cli/co_ai/prompts/reminders/plan_mode.md +34 -0
- connectonion/cli/co_ai/prompts/summarization.md +55 -0
- connectonion/cli/co_ai/prompts/tools/ask_user.md +61 -0
- connectonion/cli/co_ai/prompts/tools/background.md +57 -0
- connectonion/cli/co_ai/prompts/tools/edit.md +90 -0
- connectonion/cli/co_ai/prompts/tools/glob.md +52 -0
- connectonion/cli/co_ai/prompts/tools/grep.md +55 -0
- connectonion/cli/co_ai/prompts/tools/plan_mode.md +80 -0
- connectonion/cli/co_ai/prompts/tools/read.md +40 -0
- connectonion/cli/co_ai/prompts/tools/shell.md +67 -0
- connectonion/cli/co_ai/prompts/tools/task.md +51 -0
- connectonion/cli/co_ai/prompts/tools/todo.md +139 -0
- connectonion/cli/co_ai/prompts/tools/write.md +47 -0
- connectonion/cli/co_ai/prompts/workflow.md +89 -0
- connectonion/cli/co_ai/reminders.py +159 -0
- connectonion/cli/co_ai/sessions.py +110 -0
- connectonion/cli/co_ai/skills/__init__.py +37 -0
- connectonion/cli/co_ai/skills/builtin/commit/SKILL.md +63 -0
- connectonion/cli/co_ai/skills/builtin/review-pr/SKILL.md +76 -0
- connectonion/cli/co_ai/skills/loader.py +166 -0
- connectonion/cli/co_ai/skills/tool.py +46 -0
- connectonion/cli/co_ai/tools/__init__.py +92 -0
- connectonion/cli/co_ai/tools/ask_user.py +35 -0
- connectonion/cli/co_ai/tools/background.py +201 -0
- connectonion/cli/co_ai/tools/diff_writer.py +291 -0
- connectonion/cli/co_ai/tools/edit.py +89 -0
- connectonion/cli/co_ai/tools/glob.py +84 -0
- connectonion/cli/co_ai/tools/grep.py +158 -0
- connectonion/cli/co_ai/tools/load_guide.py +23 -0
- connectonion/cli/co_ai/tools/multi_edit.py +116 -0
- connectonion/cli/co_ai/tools/plan_mode.py +172 -0
- connectonion/cli/co_ai/tools/read.py +67 -0
- connectonion/cli/co_ai/tools/task.py +59 -0
- connectonion/cli/co_ai/tools/todo_list.py +159 -0
- connectonion/cli/co_ai/tools/write.py +126 -0
- connectonion/cli/commands/__init__.py +11 -1
- connectonion/cli/commands/ai_commands.py +34 -0
- connectonion/cli/commands/copy_commands.py +55 -6
- connectonion/cli/commands/create.py +20 -17
- connectonion/cli/commands/init.py +19 -22
- connectonion/cli/commands/project_cmd_lib.py +15 -0
- connectonion/cli/main.py +11 -0
- connectonion/console.py +15 -1
- connectonion/core/__init__.py +10 -1
- connectonion/core/agent.py +37 -16
- connectonion/core/exceptions.py +74 -0
- connectonion/core/llm.py +54 -6
- connectonion/core/tool_executor.py +32 -31
- connectonion/core/tool_factory.py +47 -10
- connectonion/debug/__init__.py +10 -1
- connectonion/debug/debug_explainer/__init__.py +10 -1
- connectonion/debug/execution_analyzer/__init__.py +10 -1
- connectonion/debug/execution_analyzer/execution_analysis.py +5 -2
- connectonion/debug/runtime_inspector/__init__.py +10 -1
- connectonion/docs/.package-ignore +6 -0
- connectonion/docs/README.md +2036 -0
- connectonion/docs/api.md +457 -0
- connectonion/docs/archive/001-ai-agent-is-just-prompt-plus-function.md +249 -0
- connectonion/docs/archive/README.md +53 -0
- connectonion/docs/archive/archive/consolidation-plan.md +72 -0
- connectonion/docs/archive/archive/core-principles-extracted.md +239 -0
- connectonion/docs/archive/archive/master-principles.md +222 -0
- connectonion/docs/archive/archive/principles.md +293 -0
- connectonion/docs/archive/archive/simplicity-principles.md +221 -0
- connectonion/docs/archive/attack-defense-insights.md +410 -0
- connectonion/docs/archive/business-model.md +305 -0
- connectonion/docs/archive/core-principles-unified.md +190 -0
- connectonion/docs/archive/discussion-journey.md +178 -0
- connectonion/docs/archive/economic-analysis.md +323 -0
- connectonion/docs/archive/features/01-share-and-find.md +256 -0
- connectonion/docs/archive/features/02-agent-authentication.md +93 -0
- connectonion/docs/archive/features/03-test-before-trust.md +71 -0
- connectonion/docs/archive/features/06-reliability-and-offline.md +197 -0
- connectonion/docs/archive/features/README.md +46 -0
- connectonion/docs/archive/features-roadmap.md +247 -0
- connectonion/docs/archive/mcp-comparison-insights.md +215 -0
- connectonion/docs/archive/migration-strategy.md +571 -0
- connectonion/docs/archive/mini-whitepaper.md +293 -0
- connectonion/docs/archive/network-protocol.md +394 -0
- connectonion/docs/archive/semantic-revolution.md +367 -0
- connectonion/docs/archive/technical-architecture.md +453 -0
- connectonion/docs/archive/the-semantic-insight.md +207 -0
- connectonion/docs/archive/threat-model.md +164 -0
- connectonion/docs/cli/README.md +805 -0
- connectonion/docs/cli/auth.md +46 -0
- connectonion/docs/cli/browser.md +235 -0
- connectonion/docs/cli/copy.md +232 -0
- connectonion/docs/cli/create.md +335 -0
- connectonion/docs/cli/init.md +431 -0
- connectonion/docs/co-directory-structure.md +214 -0
- connectonion/docs/concepts/agent.md +1078 -0
- connectonion/docs/concepts/events.md +699 -0
- connectonion/docs/concepts/llm_do.md +256 -0
- connectonion/docs/concepts/max_iterations.md +362 -0
- connectonion/docs/concepts/models.md +641 -0
- connectonion/docs/concepts/plugins.md +100 -0
- connectonion/docs/concepts/prompts.md +122 -0
- connectonion/docs/concepts/session.md +428 -0
- connectonion/docs/concepts/tools.md +512 -0
- connectonion/docs/concepts/transcribe.md +156 -0
- connectonion/docs/concepts/trust.md +291 -0
- connectonion/docs/connectonion.md +1256 -0
- connectonion/docs/debug/README.md +18 -0
- connectonion/docs/debug/auto_debug.md +1026 -0
- connectonion/docs/debug/console.md +129 -0
- connectonion/docs/debug/eval-format.md +178 -0
- connectonion/docs/debug/eval.md +230 -0
- connectonion/docs/debug/exceptions.md +307 -0
- connectonion/docs/debug/log.md +117 -0
- connectonion/docs/debug/xray.md +215 -0
- connectonion/docs/design-decisions/001-choosing-input-method.md +202 -0
- connectonion/docs/design-decisions/002-choosing-llm-function-name.md +202 -0
- connectonion/docs/design-decisions/003-choosing-trust-keyword.md +141 -0
- connectonion/docs/design-decisions/004-cli-create-flow.md +117 -0
- connectonion/docs/design-decisions/005-designing-agent-network-protocol.md +503 -0
- connectonion/docs/design-decisions/006-agent-address-format.md +305 -0
- connectonion/docs/design-decisions/007-authentication-backend-design.md +240 -0
- connectonion/docs/design-decisions/008-naming-is-hard.md +228 -0
- connectonion/docs/design-decisions/009-why-connect-function.md +167 -0
- connectonion/docs/design-decisions/010-cli-ux-progressive-disclosure.md +176 -0
- connectonion/docs/design-decisions/011-global-config-identity-management.md +357 -0
- connectonion/docs/design-decisions/012-tool-execution-separation.md +259 -0
- connectonion/docs/design-decisions/013-debug-and-logging-design.md +253 -0
- connectonion/docs/design-decisions/014-hook-system-design.md +510 -0
- connectonion/docs/design-decisions/015-interactive-auto-debug-design.md +837 -0
- connectonion/docs/design-decisions/016-why-no-zero-knowledge-proofs.md +358 -0
- connectonion/docs/design-decisions/017-session-logging-and-eval-format.md +120 -0
- connectonion/docs/design-decisions/018-event-api-naming.md +274 -0
- connectonion/docs/design-decisions/019-agent-lifecycle-design.md +655 -0
- connectonion/docs/design-decisions/020-trust-system-and-network-architecture.md +503 -0
- connectonion/docs/design-decisions/021-task-storage-jsonl-design.md +496 -0
- connectonion/docs/design-decisions/022-raw-asgi-implementation.md +273 -0
- connectonion/docs/examples.md +0 -0
- connectonion/docs/hook-system-options.md +364 -0
- connectonion/docs/integrations/README.md +12 -0
- connectonion/docs/integrations/auth.md +450 -0
- connectonion/docs/integrations/google.md +431 -0
- connectonion/docs/integrations/microsoft.md +370 -0
- connectonion/docs/network/README.md +14 -0
- connectonion/docs/network/connect.md +629 -0
- connectonion/docs/network/deploy.md +124 -0
- connectonion/docs/network/host.md +1087 -0
- connectonion/docs/network/io.md +538 -0
- connectonion/docs/network/protocol/agent-relay-protocol.md +495 -0
- connectonion/docs/network/protocol/announce-message.md +115 -0
- connectonion/docs/principles.md +124 -0
- connectonion/docs/quickstart.md +261 -0
- connectonion/docs/roadmap.md +81 -0
- connectonion/docs/templates/README.md +77 -0
- connectonion/docs/templates/meta-agent.md +152 -0
- connectonion/docs/templates/minimal.md +105 -0
- connectonion/docs/templates/playwright.md +130 -0
- connectonion/docs/templates/web-research.md +144 -0
- connectonion/docs/tui/README.md +95 -0
- connectonion/docs/tui/chat.md +181 -0
- connectonion/docs/tui/divider.md +63 -0
- connectonion/docs/tui/dropdown.md +83 -0
- connectonion/docs/tui/footer.md +44 -0
- connectonion/docs/tui/fuzzy.md +68 -0
- connectonion/docs/tui/input.md +84 -0
- connectonion/docs/tui/keys.md +77 -0
- connectonion/docs/tui/pick.md +71 -0
- connectonion/docs/tui/providers.md +89 -0
- connectonion/docs/tui/status_bar.md +67 -0
- connectonion/docs/useful_plugins/README.md +160 -0
- connectonion/docs/useful_plugins/calendar_plugin.md +68 -0
- connectonion/docs/useful_plugins/eval.md +89 -0
- connectonion/docs/useful_plugins/gmail_plugin.md +68 -0
- connectonion/docs/useful_plugins/image_result_formatter.md +74 -0
- connectonion/docs/useful_plugins/re_act.md +86 -0
- connectonion/docs/useful_plugins/shell_approval.md +69 -0
- connectonion/docs/useful_plugins/system_reminder.md +210 -0
- connectonion/docs/useful_prompts/README.md +127 -0
- connectonion/docs/useful_prompts/coding_agent.md +214 -0
- connectonion/docs/useful_tools/README.md +81 -0
- connectonion/docs/useful_tools/ask_user.md +103 -0
- connectonion/docs/useful_tools/diff_writer.md +158 -0
- connectonion/docs/useful_tools/get_emails.md +519 -0
- connectonion/docs/useful_tools/gmail.md +155 -0
- connectonion/docs/useful_tools/google_calendar.md +126 -0
- connectonion/docs/useful_tools/memory.md +506 -0
- connectonion/docs/useful_tools/microsoft_calendar.md +126 -0
- connectonion/docs/useful_tools/outlook.md +140 -0
- connectonion/docs/useful_tools/send_email.md +423 -0
- connectonion/docs/useful_tools/shell.md +115 -0
- connectonion/docs/useful_tools/slash_command.md +116 -0
- connectonion/docs/useful_tools/terminal.md +115 -0
- connectonion/docs/useful_tools/todo_list.md +272 -0
- connectonion/docs/useful_tools/web_fetch.md +150 -0
- connectonion/docs/vibe-coding-guide.md +97 -0
- connectonion/docs/windows-support.md +258 -0
- connectonion/logger.py +3 -3
- connectonion/network/__init__.py +19 -6
- connectonion/network/asgi/__init__.py +81 -0
- connectonion/network/asgi/http.py +205 -0
- connectonion/network/asgi/websocket.py +217 -0
- connectonion/network/connect.py +232 -185
- connectonion/network/host/__init__.py +59 -0
- connectonion/network/host/auth.py +191 -0
- connectonion/network/host/routes.py +135 -0
- connectonion/network/host/server.py +289 -0
- connectonion/network/host/session.py +78 -0
- connectonion/network/io/__init__.py +21 -0
- connectonion/network/{connection.py → io/base.py} +17 -42
- connectonion/network/io/websocket.py +55 -0
- connectonion/network/relay.py +37 -16
- connectonion/network/trust/__init__.py +30 -0
- connectonion/network/trust/factory.py +138 -0
- connectonion/network/{trust_agents.py → trust/prompts.py} +3 -3
- connectonion/network/{trust_functions.py → trust/tools.py} +2 -2
- connectonion/prompt_files/__init__.py +11 -1
- connectonion/prompt_files/react_acknowledge.md +26 -0
- connectonion/prompts.py +10 -1
- connectonion/tui/chat.py +10 -1
- connectonion/tui/divider.py +10 -1
- connectonion/tui/dropdown.py +10 -1
- connectonion/tui/footer.py +8 -0
- connectonion/tui/fuzzy.py +11 -1
- connectonion/tui/input.py +118 -70
- connectonion/tui/keys.py +133 -6
- connectonion/tui/providers.py +11 -1
- connectonion/tui/status_bar.py +10 -1
- connectonion/useful_events_handlers/__init__.py +8 -0
- connectonion/useful_events_handlers/reflect.py +19 -4
- connectonion/useful_plugins/__init__.py +2 -1
- connectonion/useful_plugins/eval.py +2 -2
- connectonion/useful_plugins/gmail_plugin.py +3 -3
- connectonion/useful_plugins/image_result_formatter.py +3 -3
- connectonion/useful_plugins/re_act.py +114 -28
- connectonion/useful_plugins/shell_approval.py +2 -2
- connectonion/useful_plugins/system_reminder.py +103 -0
- connectonion/useful_plugins/ui_stream.py +18 -133
- connectonion/useful_prompts/README.md +61 -0
- connectonion/useful_prompts/__init__.py +45 -0
- connectonion/useful_prompts/coding_agent/README.md +106 -0
- connectonion/useful_prompts/coding_agent/assembler.py +123 -0
- connectonion/useful_prompts/coding_agent/prompts/main.md +227 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/ask_user.md +61 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/background.md +57 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/edit.md +90 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/glob.md +52 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/grep.md +55 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/plan_mode.md +80 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/read.md +40 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/shell.md +67 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/task.md +51 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/todo.md +139 -0
- connectonion/useful_prompts/coding_agent/prompts/tools/write.md +48 -0
- connectonion/useful_prompts/system-reminders/security-warning.md +14 -0
- connectonion/useful_prompts/system-reminders/test-reminder.md +11 -0
- connectonion/useful_tools/__init__.py +31 -4
- connectonion/useful_tools/ask_user.py +35 -0
- connectonion/useful_tools/bash.py +69 -0
- connectonion/useful_tools/diff_writer.py +186 -94
- connectonion/useful_tools/edit.py +102 -0
- connectonion/useful_tools/glob_files.py +97 -0
- connectonion/useful_tools/grep_files.py +171 -0
- connectonion/useful_tools/multi_edit.py +116 -0
- connectonion/useful_tools/read_file.py +73 -0
- connectonion/useful_tools/shell.py +50 -45
- connectonion/useful_tools/write_file.py +129 -0
- {connectonion-0.6.1.dist-info → connectonion-0.6.3.dist-info}/METADATA +10 -3
- connectonion-0.6.3.dist-info/RECORD +469 -0
- connectonion/cli/browser_agent/scroll_strategies.py +0 -276
- connectonion/network/asgi.py +0 -407
- connectonion/network/host.py +0 -616
- connectonion/network/trust.py +0 -166
- connectonion-0.6.1.dist-info/RECORD +0 -123
- /connectonion/cli/{docs → co_ai/prompts/connectonion}/connectonion.md +0 -0
- {connectonion-0.6.1.dist-info → connectonion-0.6.3.dist-info}/WHEEL +0 -0
- {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
|
|
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/
|
|
5
|
-
Data flow: after_user_input →
|
|
6
|
-
State/Effects: modifies agent.current_session['
|
|
7
|
-
Integration: exposes re_act plugin list with [
|
|
8
|
-
Performance:
|
|
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
|
|
14
|
-
1. After user input:
|
|
15
|
-
2. After tool execution: Reflect on results
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
45
|
-
"""
|
|
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
|
-
|
|
51
|
-
|
|
126
|
+
# Include conversation history for context
|
|
127
|
+
messages = agent.current_session.get('messages', [])
|
|
128
|
+
conversation = _format_conversation(messages)
|
|
52
129
|
|
|
53
|
-
prompt = f"""
|
|
130
|
+
prompt = f"""Conversation so far:
|
|
131
|
+
{conversation}
|
|
54
132
|
|
|
55
|
-
|
|
133
|
+
Current user input: {user_prompt}
|
|
56
134
|
|
|
57
|
-
|
|
135
|
+
Acknowledge this request (1-2 sentences):"""
|
|
58
136
|
|
|
59
|
-
|
|
137
|
+
model = "co/gemini-2.5-flash"
|
|
138
|
+
agent.logger.print(f"[dim]/understanding ({model})...[/dim]")
|
|
60
139
|
|
|
61
|
-
|
|
140
|
+
ack = llm_do(
|
|
62
141
|
prompt,
|
|
63
|
-
model=
|
|
64
|
-
temperature=0.
|
|
65
|
-
system_prompt=
|
|
142
|
+
model=model,
|
|
143
|
+
temperature=0.3,
|
|
144
|
+
system_prompt=ACKNOWLEDGE_PROMPT
|
|
66
145
|
)
|
|
67
146
|
|
|
68
|
-
|
|
69
|
-
|
|
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':
|
|
158
|
+
'content': ack
|
|
74
159
|
})
|
|
75
160
|
|
|
76
161
|
|
|
77
|
-
# Bundle as plugin:
|
|
78
|
-
|
|
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:
|
|
2
|
+
Purpose: Plugin for streaming agent completion summaries to WebSocket UI clients
|
|
3
3
|
LLM-Note:
|
|
4
|
-
Dependencies: imports from [
|
|
5
|
-
Data flow:
|
|
6
|
-
State/Effects:
|
|
7
|
-
Integration: exposes ui_stream
|
|
8
|
-
Performance:
|
|
9
|
-
Errors:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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.
|
|
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('
|
|
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.
|
|
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
|
-
|
|
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
|