connectonion 0.6.2__py3-none-any.whl → 0.6.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +13 -3
- connectonion/cli/browser_agent/element_finder.py +8 -0
- connectonion/cli/browser_agent/highlight_screenshot.py +9 -1
- connectonion/cli/browser_agent/scroll.py +8 -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.2.dist-info → connectonion-0.6.3.dist-info}/METADATA +10 -3
- connectonion-0.6.3.dist-info/RECORD +469 -0
- connectonion/network/asgi.py +0 -407
- connectonion/network/host.py +0 -616
- connectonion/network/trust.py +0 -166
- connectonion-0.6.2.dist-info/RECORD +0 -129
- /connectonion/cli/{docs → co_ai/prompts/connectonion}/connectonion.md +0 -0
- {connectonion-0.6.2.dist-info → connectonion-0.6.3.dist-info}/WHEEL +0 -0
- {connectonion-0.6.2.dist-info → connectonion-0.6.3.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
# Task Storage: Why JSON Lines with TTL Expiry
|
|
2
|
+
|
|
3
|
+
*December 2025*
|
|
4
|
+
|
|
5
|
+
When designing `host()`, we needed to store task results so clients can fetch them later if connections drop. This document explores all the options we considered and explains why we chose JSON Lines with TTL expiry.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The Problem
|
|
10
|
+
|
|
11
|
+
When an agent is hosted, tasks need to be persisted:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Client Agent
|
|
15
|
+
│ │
|
|
16
|
+
│── POST /input ────────────────────────▶│
|
|
17
|
+
│◀─ {task_id: "abc"} ───────────────────│
|
|
18
|
+
│ │
|
|
19
|
+
│ (connection drops during long task) │
|
|
20
|
+
│ │
|
|
21
|
+
│── GET /tasks/abc ─────────────────────▶│
|
|
22
|
+
│◀─ {result: "..."} ────────────────────│ ← Need stored result
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Requirements:
|
|
26
|
+
1. **Human readable** - Developers should be able to inspect tasks directly
|
|
27
|
+
2. **Concurrent safe** - Multiple workers may write simultaneously
|
|
28
|
+
3. **Simple** - No external dependencies, easy to understand
|
|
29
|
+
4. **Cleanable** - Old tasks should be removed automatically
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Part I: Where to Store?
|
|
34
|
+
|
|
35
|
+
### Option A: Central Server (Our Relay)
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
Client Our Relay Agent
|
|
39
|
+
│ │ │
|
|
40
|
+
│── INPUT ─────────────────▶│── INPUT ────────────────▶│
|
|
41
|
+
│◀─ {task_id} ──────────────│ │
|
|
42
|
+
│ │◀─ OUTPUT ────────────────│
|
|
43
|
+
│ (client disconnects) │ (relay stores result) │
|
|
44
|
+
│ │ │
|
|
45
|
+
│── GET /tasks/abc ────────▶│ │
|
|
46
|
+
│◀─ {result} ───────────────│ │
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Pros:**
|
|
50
|
+
- Simple for developers
|
|
51
|
+
- Client can disconnect/reconnect
|
|
52
|
+
- Works across devices
|
|
53
|
+
|
|
54
|
+
**Cons:**
|
|
55
|
+
- Privacy concern (we see all data)
|
|
56
|
+
- Single point of failure
|
|
57
|
+
- Costs us money (storage, bandwidth)
|
|
58
|
+
- Vendor lock-in
|
|
59
|
+
|
|
60
|
+
**Why not chosen:** Privacy and centralization concerns.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### Option B: IPFS (Decentralized)
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
Agent: encrypt(result) → IPFS → CID
|
|
68
|
+
Client: IPFS.get(CID) → decrypt → result
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Pros:**
|
|
72
|
+
- Decentralized, no central server
|
|
73
|
+
- Content-addressed (verifiable)
|
|
74
|
+
- Privacy via encryption
|
|
75
|
+
|
|
76
|
+
**Cons:**
|
|
77
|
+
- Someone must pay for pinning
|
|
78
|
+
- IPFS without pinning = data disappears
|
|
79
|
+
- Pinning services cost $0.01-0.15/GB/month
|
|
80
|
+
- Adds complexity (IPFS dependency)
|
|
81
|
+
- Overkill for most use cases
|
|
82
|
+
|
|
83
|
+
**Who pays for IPFS?**
|
|
84
|
+
|
|
85
|
+
| Option | Cost | Persistence |
|
|
86
|
+
|--------|------|-------------|
|
|
87
|
+
| Free tier | $0 | Garbage collected |
|
|
88
|
+
| Pin yourself | Electricity + disk | While node runs |
|
|
89
|
+
| Pinning service | $0.01-0.15/GB/month | While you pay |
|
|
90
|
+
| Filecoin | ~$0.0001/GB/month | Contract duration |
|
|
91
|
+
|
|
92
|
+
**Why not chosen:** Doesn't solve payment problem, adds complexity. "IPFS sounds good but doesn't change economics."
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### Option C: Webhook/Callback
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
Client Agent
|
|
100
|
+
│ │
|
|
101
|
+
│── INPUT + callback_url ───────────────▶│
|
|
102
|
+
│◀─ "accepted" ─────────────────────────│
|
|
103
|
+
│ │
|
|
104
|
+
│ (client goes offline) │
|
|
105
|
+
│ │
|
|
106
|
+
│◀── POST result to callback_url ────────│
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Pros:**
|
|
110
|
+
- No storage needed
|
|
111
|
+
- Fire and forget
|
|
112
|
+
- Scales well
|
|
113
|
+
|
|
114
|
+
**Cons:**
|
|
115
|
+
- Client needs public endpoint
|
|
116
|
+
- Firewall/NAT issues
|
|
117
|
+
- More complex client setup
|
|
118
|
+
|
|
119
|
+
**Why not chosen:** Requires client to have public endpoint. Most developers don't.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
### Option D: Email Model
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
Client: "Do this task"
|
|
127
|
+
Agent: "I'll email you when done"
|
|
128
|
+
... works ...
|
|
129
|
+
Agent: → sends notification/email with result
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Pros:**
|
|
133
|
+
- Familiar mental model
|
|
134
|
+
- No connection needed
|
|
135
|
+
- Different channel
|
|
136
|
+
|
|
137
|
+
**Cons:**
|
|
138
|
+
- Requires email/notification setup
|
|
139
|
+
- Different from API pattern
|
|
140
|
+
- Complex integration
|
|
141
|
+
|
|
142
|
+
**Why not chosen:** Too different from standard API patterns. Adds notification complexity.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
### Option E: Agent Calls Back (Role Reversal)
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
Client: "Do this, reply to 0xMyAddress when done"
|
|
150
|
+
Agent: ... works ...
|
|
151
|
+
Agent: → initiates connection TO client with result
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Pros:**
|
|
155
|
+
- Like how phones/humans work
|
|
156
|
+
- No storage needed
|
|
157
|
+
|
|
158
|
+
**Cons:**
|
|
159
|
+
- Client must be online to receive
|
|
160
|
+
- NAT/firewall issues
|
|
161
|
+
- Role reversal adds complexity
|
|
162
|
+
|
|
163
|
+
**Why not chosen:** Client might not be online. NAT traversal is hard.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### Option F: Encrypted Central Storage
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
Agent: encrypt(result, client_pubkey) → store on relay
|
|
171
|
+
Client: fetch → decrypt with private_key → result
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Pros:**
|
|
175
|
+
- Privacy preserved (relay can't read)
|
|
176
|
+
- Simple for developers
|
|
177
|
+
- Uses existing keypair
|
|
178
|
+
|
|
179
|
+
**Cons:**
|
|
180
|
+
- Still centralized (relay as encrypted mailbox)
|
|
181
|
+
- Durov/Dorsey would say: "What if relay goes down?"
|
|
182
|
+
- Vendor lock-in
|
|
183
|
+
|
|
184
|
+
**What would industry leaders say?**
|
|
185
|
+
|
|
186
|
+
| Person | Concern |
|
|
187
|
+
|--------|---------|
|
|
188
|
+
| Pavel Durov (Telegram) | "Encryption good, but why central relay?" |
|
|
189
|
+
| Jack Dorsey (Twitter) | "Protocol, not platform. Multiple relays." |
|
|
190
|
+
| Vitalik Buterin (Ethereum) | "Where's the trustlessness? Who verifies?" |
|
|
191
|
+
| Juan Benet (IPFS) | "Content addressing solves this." |
|
|
192
|
+
|
|
193
|
+
**Why not chosen:** For MVP, we decided to keep it simple with local storage. Encrypted central storage could be added later as optional feature.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
### Option G: Don't Store At All
|
|
198
|
+
|
|
199
|
+
Most tasks complete in seconds. Is storage really needed?
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
95% of tasks: < 30 seconds, WebSocket stays open → no storage needed
|
|
203
|
+
5% of tasks: Maybe longer
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Consideration:** Build for the 95%. Document the limitation.
|
|
207
|
+
|
|
208
|
+
**Why not fully chosen:** Connection drops do happen. Simple local storage is low-cost insurance.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
### Option H: Local Storage on Agent (Chosen)
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
Agent stores results locally in ~/.connectonion/tasks.jsonl
|
|
216
|
+
Client fetches via GET /tasks/{task_id}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Pros:**
|
|
220
|
+
- Privacy (data stays with agent)
|
|
221
|
+
- No central dependency
|
|
222
|
+
- Agent controls retention
|
|
223
|
+
- Simple, no external services
|
|
224
|
+
|
|
225
|
+
**Cons:**
|
|
226
|
+
- Agent must be online to retrieve
|
|
227
|
+
- No cross-device without relay
|
|
228
|
+
|
|
229
|
+
**Why chosen:** Simplest solution that works. Privacy by default. No external dependencies.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Part II: How to Store Locally?
|
|
234
|
+
|
|
235
|
+
### Option 1: CSV
|
|
236
|
+
|
|
237
|
+
```csv
|
|
238
|
+
task_id,prompt,status,result,created
|
|
239
|
+
550e8400,Translate hello,done,Hola,1702234567
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Problems:**
|
|
243
|
+
- **Not human readable** - Hard to read with long content
|
|
244
|
+
- **Race conditions** - Concurrent writes corrupt data (read-modify-write pattern)
|
|
245
|
+
- **Parsing issues** - Commas and newlines in results break CSV
|
|
246
|
+
|
|
247
|
+
**Why not chosen:** Not readable, not concurrent-safe.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### Option 2: One JSON File Per Task
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
~/.connectonion/tasks/
|
|
255
|
+
├── 550e8400.json
|
|
256
|
+
├── 7c4dff69.json
|
|
257
|
+
└── 3d4017c3.json
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Problems:**
|
|
261
|
+
- Thousands of files = slow to list (`GET /tasks`)
|
|
262
|
+
- Can't query without reading all files
|
|
263
|
+
- File system overhead
|
|
264
|
+
|
|
265
|
+
**Why not chosen:** Doesn't scale for listing/querying.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### Option 3: SQLite
|
|
270
|
+
|
|
271
|
+
```sql
|
|
272
|
+
SELECT * FROM tasks WHERE task_id = '550e8400';
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Pros:**
|
|
276
|
+
- Handles concurrency
|
|
277
|
+
- Good for queries
|
|
278
|
+
|
|
279
|
+
**Cons:**
|
|
280
|
+
- **Binary file** - Users can't `cat` or `grep` it
|
|
281
|
+
- Requires SQLite CLI knowledge
|
|
282
|
+
- Overkill for simple storage
|
|
283
|
+
|
|
284
|
+
**Why not chosen:** Not human readable. "Users can't directly read the SQLite file."
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
### Option 4: JSON Lines (Chosen)
|
|
289
|
+
|
|
290
|
+
```jsonl
|
|
291
|
+
{"task_id":"550e8400","status":"running","created":1702234567,"expires":1702320967}
|
|
292
|
+
{"task_id":"550e8400","status":"done","result":"Hola","created":1702234567,"expires":1702320967}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Benefits:**
|
|
296
|
+
- Human readable: `cat tasks.jsonl`
|
|
297
|
+
- Queryable: `grep "550e8400" tasks.jsonl`
|
|
298
|
+
- Single file: easy to manage
|
|
299
|
+
- Append-only: concurrent safe
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Part III: Why Append-Only is Concurrent Safe
|
|
304
|
+
|
|
305
|
+
### CSV/SQLite: Read-Modify-Write (Unsafe)
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
Worker 1: Read file → [abc:running, def:running]
|
|
309
|
+
Worker 2: Read file → [abc:running, def:running]
|
|
310
|
+
Worker 1: Update abc=done → [abc:done, def:running]
|
|
311
|
+
Worker 2: Update def=done → [abc:running, def:done]
|
|
312
|
+
Worker 1: Write file
|
|
313
|
+
Worker 2: Write file ← Overwrites Worker 1! Data lost!
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### JSON Lines: Append-Only (Safe)
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
Worker 1: Append line → {"task_id":"abc","status":"done"}
|
|
320
|
+
Worker 2: Append line → {"task_id":"def","status":"done"}
|
|
321
|
+
|
|
322
|
+
Both succeed. No data loss.
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Why?** On POSIX systems, append operations are atomic for small writes.
|
|
326
|
+
|
|
327
|
+
To get current state: find the **last** line for that task_id.
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
grep "550e8400" tasks.jsonl | tail -1
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
This is the same pattern used by:
|
|
334
|
+
- Kafka (append-only log)
|
|
335
|
+
- Git (append-only objects)
|
|
336
|
+
- Database WAL (Write-Ahead Log)
|
|
337
|
+
- Blockchain (append-only chain)
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Part IV: How to Cleanup?
|
|
342
|
+
|
|
343
|
+
### Option A: File Locking
|
|
344
|
+
|
|
345
|
+
```python
|
|
346
|
+
def cleanup():
|
|
347
|
+
with file_lock:
|
|
348
|
+
# Read all, filter, write back
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**Problems:**
|
|
352
|
+
- Workers wait during cleanup (slow)
|
|
353
|
+
- Deadlock risk if process crashes
|
|
354
|
+
- Complex error handling
|
|
355
|
+
|
|
356
|
+
**Why not chosen:** Too complex, risk of deadlocks.
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
### Option B: Log Rotation
|
|
361
|
+
|
|
362
|
+
```
|
|
363
|
+
tasks.jsonl ← Current
|
|
364
|
+
tasks.20241210.jsonl ← Yesterday
|
|
365
|
+
tasks.20241209.jsonl ← 2 days ago
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Problems:**
|
|
369
|
+
- Need to read multiple files for recent tasks
|
|
370
|
+
- Date-based, not task-based control
|
|
371
|
+
- More complex file management
|
|
372
|
+
|
|
373
|
+
**Why not chosen:** More complex, less flexible.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
### Option C: TTL Expiry (Chosen)
|
|
378
|
+
|
|
379
|
+
Each task has an `expires` timestamp:
|
|
380
|
+
|
|
381
|
+
```json
|
|
382
|
+
{"task_id":"abc","status":"done","result":"...","expires":1702320967}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
Cleanup logic:
|
|
386
|
+
- If `expires < now` AND `status != "running"` → safe to delete
|
|
387
|
+
- Running tasks never deleted (even if expired)
|
|
388
|
+
|
|
389
|
+
```python
|
|
390
|
+
def cleanup():
|
|
391
|
+
now = time.time()
|
|
392
|
+
active = []
|
|
393
|
+
for line in open("tasks.jsonl"):
|
|
394
|
+
task = json.loads(line)
|
|
395
|
+
if task["expires"] > now or task["status"] == "running":
|
|
396
|
+
active.append(line)
|
|
397
|
+
|
|
398
|
+
# Atomic write
|
|
399
|
+
with open("tasks.jsonl.tmp", "w") as f:
|
|
400
|
+
f.writelines(active)
|
|
401
|
+
os.rename("tasks.jsonl.tmp", "tasks.jsonl")
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
**Why chosen:**
|
|
405
|
+
- Per-task control (different TTLs possible)
|
|
406
|
+
- Running tasks protected
|
|
407
|
+
- Simple logic: expired = safe to delete
|
|
408
|
+
- Client had N hours to fetch result
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## The Final Design
|
|
413
|
+
|
|
414
|
+
### Storage
|
|
415
|
+
|
|
416
|
+
```
|
|
417
|
+
.co/tasks.jsonl
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
Stored in project's `.co/` folder (same as `.co/logs/`).
|
|
421
|
+
|
|
422
|
+
```jsonl
|
|
423
|
+
{"task_id":"550e8400","prompt":"Translate hello","status":"running","created":1702234567,"expires":1702320967}
|
|
424
|
+
{"task_id":"550e8400","prompt":"Translate hello","status":"done","result":"Hola","created":1702234567,"expires":1702320967}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**Why `.co/` folder?**
|
|
428
|
+
- Consistent with `.co/logs/` (existing pattern)
|
|
429
|
+
- Project-specific (each project has its own tasks)
|
|
430
|
+
- Already in `.gitignore`
|
|
431
|
+
- Easy to find (in project directory)
|
|
432
|
+
|
|
433
|
+
### API
|
|
434
|
+
|
|
435
|
+
```python
|
|
436
|
+
host(agent) # Default: 24h TTL
|
|
437
|
+
host(agent, task_ttl=3600) # 1 hour
|
|
438
|
+
host(agent, task_ttl=604800) # 7 days
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### User Experience
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
# See all tasks
|
|
445
|
+
cat .co/tasks.jsonl
|
|
446
|
+
|
|
447
|
+
# Find specific task
|
|
448
|
+
grep "550e8400" .co/tasks.jsonl | tail -1
|
|
449
|
+
|
|
450
|
+
# Pretty print
|
|
451
|
+
cat .co/tasks.jsonl | jq .
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## Comparison Summary
|
|
457
|
+
|
|
458
|
+
### Where to Store
|
|
459
|
+
|
|
460
|
+
| Option | Privacy | Simplicity | Offline | Chosen? |
|
|
461
|
+
|--------|---------|------------|---------|---------|
|
|
462
|
+
| Central relay | ❌ | ✅ | ✅ | ❌ |
|
|
463
|
+
| IPFS | ✅ | ❌ | ✅ | ❌ |
|
|
464
|
+
| Webhook | ✅ | ❌ | ❌ | ❌ |
|
|
465
|
+
| Encrypted relay | ✅ | ⚠️ | ✅ | Future |
|
|
466
|
+
| **Local storage** | ✅ | ✅ | ⚠️ | ✅ |
|
|
467
|
+
|
|
468
|
+
### How to Store Locally
|
|
469
|
+
|
|
470
|
+
| Format | Readable | Concurrent | Single File | Chosen? |
|
|
471
|
+
|--------|----------|------------|-------------|---------|
|
|
472
|
+
| CSV | ❌ | ❌ | ✅ | ❌ |
|
|
473
|
+
| JSON files | ✅ | ✅ | ❌ | ❌ |
|
|
474
|
+
| SQLite | ❌ | ✅ | ✅ | ❌ |
|
|
475
|
+
| **JSON Lines** | ✅ | ✅ | ✅ | ✅ |
|
|
476
|
+
|
|
477
|
+
---
|
|
478
|
+
|
|
479
|
+
## Principles Applied
|
|
480
|
+
|
|
481
|
+
1. **Human Readable First** - `cat tasks.jsonl` should just work
|
|
482
|
+
2. **Append-Only for Concurrency** - Don't fight concurrency, design it away
|
|
483
|
+
3. **TTL Over Complex Cleanup** - Per-task expiry is simpler than rotation
|
|
484
|
+
4. **Local by Default** - Privacy and simplicity over convenience
|
|
485
|
+
5. **Simple Over Clever** - JSON Lines is boring. Boring is good.
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## Future Considerations
|
|
490
|
+
|
|
491
|
+
If users need more:
|
|
492
|
+
- **Encrypted relay storage** - Optional for cross-device access
|
|
493
|
+
- **IPFS integration** - For truly decentralized storage
|
|
494
|
+
- **SQLite mode** - For heavy query needs
|
|
495
|
+
|
|
496
|
+
But for MVP: JSON Lines with TTL. Simple, readable, works.
|