@scemoon/cdh 1.0.6 → 1.0.7
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.
- package/package.json +2 -2
- package/ai-dlc-skill/SKILL.md +0 -77
- package/ai-dlc-skill/agents/deliver-agent.md +0 -24
- package/ai-dlc-skill/agents/master.md +0 -50
- package/ai-dlc-skill/agents/plan-agent.md +0 -23
- package/ai-dlc-skill/agents/understand-agent.md +0 -23
- package/ai-dlc-skill/agents/verify-agent.md +0 -27
- package/ai-dlc-skill/architecture/project-structure.md +0 -78
- package/ai-dlc-skill/brownfield/README.md +0 -30
- package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
- package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
- package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
- package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
- package/ai-dlc-skill/components/backend.md +0 -34
- package/ai-dlc-skill/components/desktop.md +0 -30
- package/ai-dlc-skill/components/mya.md +0 -29
- package/ai-dlc-skill/components/native.md +0 -30
- package/ai-dlc-skill/components/tta.md +0 -29
- package/ai-dlc-skill/components/web.md +0 -31
- package/ai-dlc-skill/components/wxa.md +0 -29
- package/ai-dlc-skill/contracts/README.md +0 -25
- package/ai-dlc-skill/core/adaptive-flow.md +0 -36
- package/ai-dlc-skill/core/security.md +0 -29
- package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
- package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
- package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
- package/ai-dlc-skill/cross-tool/export.sh +0 -22
- package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
- package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
- package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
- package/ai-dlc-skill/phases/deliver/entry.md +0 -26
- package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
- package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
- package/ai-dlc-skill/phases/deliver/rules.md +0 -61
- package/ai-dlc-skill/phases/plan/entry.md +0 -25
- package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
- package/ai-dlc-skill/phases/plan/prompt.md +0 -38
- package/ai-dlc-skill/phases/plan/rules.md +0 -25
- package/ai-dlc-skill/phases/understand/entry.md +0 -26
- package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
- package/ai-dlc-skill/phases/understand/prompt.md +0 -41
- package/ai-dlc-skill/phases/understand/rules.md +0 -37
- package/ai-dlc-skill/phases/verify/entry.md +0 -26
- package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
- package/ai-dlc-skill/phases/verify/prompt.md +0 -43
- package/ai-dlc-skill/phases/verify/rules.md +0 -73
- package/ai-dlc-skill/practices/bdd.md +0 -91
- package/ai-dlc-skill/practices/sdd.md +0 -84
- package/ai-dlc-skill/practices/tdd.md +0 -95
- package/ai-dlc-skill/providers/README.md +0 -114
- package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
- package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
- package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
- package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
- package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
- package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
- package/ai-dlc-skill/requirements.md +0 -140
- package/ai-dlc-skill/skill.yaml +0 -147
- package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
- package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
- package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
- package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
- package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
- package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
- package/ai-dlc-skill/templates/plan/design.md +0 -49
- package/ai-dlc-skill/templates/plan/task-list.md +0 -32
- package/ai-dlc-skill/templates/project/README.md +0 -126
- package/ai-dlc-skill/templates/project/template.md +0 -119
- package/ai-dlc-skill/templates/understand/feature.feature +0 -23
- package/ai-dlc-skill/templates/understand/intent.md +0 -29
- package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
- package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
- package/ai-dlc-skill/walkthrough/collect.sh +0 -50
- package/ai-dlc-skill/walkthrough/template.md +0 -54
- package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
- package/ai-dlc-skill/workflows/deployment.yaml +0 -199
- package/cdh/__init__.py +0 -0
- package/cdh/__main__.py +0 -4
- package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
- package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
- package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
- package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
- package/cdh/cdh_mcp_injector.py +0 -115
- package/cdh/cdh_mcp_loader.py +0 -67
- package/cdh/cdh_mcp_manager.py +0 -73
- package/cdh/cdh_session_aggregator.py +0 -258
- package/cdh/cdh_skill_manager.py +0 -105
- package/cdh/cli.py +0 -807
- package/cdh/scaffold.py +0 -728
- package/onecode/__init__.py +0 -1
- package/onecode/__main__.py +0 -4
- package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
- package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
- package/onecode/__pycache__/config.cpython-314.pyc +0 -0
- package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
- package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
- package/onecode/agent/__init__.py +0 -0
- package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
- package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__init__.py +0 -29
- package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
- package/onecode/agent/agents/types.py +0 -589
- package/onecode/agent/attachments.py +0 -112
- package/onecode/agent/cdh_loader.py +0 -267
- package/onecode/agent/context.py +0 -343
- package/onecode/agent/engine.py +0 -2700
- package/onecode/agent/hooks.py +0 -86
- package/onecode/agent/onecode_agent_acp.py +0 -2743
- package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
- package/onecode/agent/permissions.py +0 -150
- package/onecode/agent/permissions_store.py +0 -62
- package/onecode/agent/project_doc.py +0 -19
- package/onecode/agent/session.py +0 -195
- package/onecode/agent/snapshot.py +0 -144
- package/onecode/agent/tools/__init__.py +0 -17
- package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
- package/onecode/agent/tools/agent_tools.py +0 -132
- package/onecode/agent/tools/apply_patch_tool.py +0 -138
- package/onecode/agent/tools/bash_tool.py +0 -111
- package/onecode/agent/tools/communication_tools.py +0 -148
- package/onecode/agent/tools/config_tool.py +0 -130
- package/onecode/agent/tools/cron_tools.py +0 -178
- package/onecode/agent/tools/errors.py +0 -17
- package/onecode/agent/tools/file_ops.py +0 -221
- package/onecode/agent/tools/file_tools.py +0 -225
- package/onecode/agent/tools/git_tools.py +0 -88
- package/onecode/agent/tools/lsp_tools.py +0 -404
- package/onecode/agent/tools/mcp_tools.py +0 -127
- package/onecode/agent/tools/permission_handler.py +0 -46
- package/onecode/agent/tools/permissions.py +0 -77
- package/onecode/agent/tools/protocol.py +0 -20
- package/onecode/agent/tools/registry.py +0 -201
- package/onecode/agent/tools/sandbox.py +0 -358
- package/onecode/agent/tools/schema_validation.py +0 -100
- package/onecode/agent/tools/skill_tools.py +0 -52
- package/onecode/agent/tools/todo_tools.py +0 -207
- package/onecode/agent/tools/web_tools.py +0 -169
- package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
- package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
- package/onecode/builtin_skills/git/SKILL.md +0 -64
- package/onecode/builtin_skills/git/skill.yaml +0 -7
- package/onecode/builtin_skills/shell/SKILL.md +0 -58
- package/onecode/builtin_skills/shell/skill.yaml +0 -8
- package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
- package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
- package/onecode/cli.py +0 -935
- package/onecode/cloud/__init__.py +0 -0
- package/onecode/cloud/base.py +0 -20
- package/onecode/codebase/__init__.py +0 -69
- package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
- package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
- package/onecode/codebase/chunker.py +0 -125
- package/onecode/codebase/indexer.py +0 -149
- package/onecode/codebase/retriever.py +0 -203
- package/onecode/codebase/storage.py +0 -131
- package/onecode/codebase/tools.py +0 -59
- package/onecode/commands.py +0 -596
- package/onecode/config.py +0 -314
- package/onecode/config_screen.py +0 -600
- package/onecode/cron/__init__.py +0 -3
- package/onecode/lsp/__init__.py +0 -3
- package/onecode/mcp/__init__.py +0 -4
- package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
- package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
- package/onecode/mcp/client.py +0 -193
- package/onecode/mcp/manager.py +0 -190
- package/onecode/memory/__init__.py +0 -49
- package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
- package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
- package/onecode/memory/backend.py +0 -159
- package/onecode/memory/pyramid.py +0 -133
- package/onecode/memory/recall.py +0 -203
- package/onecode/migrate.py +0 -122
- package/onecode/models/__init__.py +0 -4
- package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
- package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
- package/onecode/models/errors.py +0 -104
- package/onecode/models/messages.py +0 -739
- package/onecode/models/provider.py +0 -699
- package/onecode/models/providers/__init__.py +0 -17
- package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
- package/onecode/models/providers/anthropic_provider.py +0 -273
- package/onecode/models/providers/deepseek_provider.py +0 -212
- package/onecode/models/providers/glm_provider.py +0 -195
- package/onecode/models/providers/minimax_provider.py +0 -158
- package/onecode/models/providers/minimaxi_provider.py +0 -417
- package/onecode/models/providers/ollama_provider.py +0 -100
- package/onecode/models/providers/openai_provider.py +0 -237
- package/onecode/models/registry.py +0 -212
- package/onecode/server/__init__.py +0 -3
- package/onecode/server/app.py +0 -224
- package/onecode/skills/__init__.py +0 -11
- package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
- package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
- package/onecode/skills/argument_substitution.py +0 -38
- package/onecode/skills/bootstrap.py +0 -124
- package/onecode/skills/create.py +0 -56
- package/onecode/skills/frontmatter.py +0 -33
- package/onecode/skills/loader.py +0 -139
- package/onecode/skills/manager.py +0 -75
- package/onecode/skills/model.py +0 -43
- package/onecode/storage/__init__.py +0 -0
- package/onecode/storage/activity.py +0 -63
- package/onecode/storage/project.py +0 -54
- package/onecode/storage/session.py +0 -112
- package/onecode/tasks/__init__.py +0 -26
- package/onecode/tasks/manager.py +0 -232
- package/onecode/tasks/models.py +0 -240
- package/onecode/trace/__init__.py +0 -0
- package/onecode/trace/tracer.py +0 -173
- package/onecode/utils/__init__.py +0 -0
- package/onecode/utils/helpers.py +0 -20
- package/pyproject.toml +0 -74
- package/tui/__init__.py +0 -46
- package/tui/__main__.py +0 -4
- package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
- package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
- package/tui/__pycache__/about.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/agents.cpython-314.pyc +0 -0
- package/tui/__pycache__/answer.cpython-314.pyc +0 -0
- package/tui/__pycache__/app.cpython-313.pyc +0 -0
- package/tui/__pycache__/app.cpython-314.pyc +0 -0
- package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
- package/tui/__pycache__/complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/constants.cpython-314.pyc +0 -0
- package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
- package/tui/__pycache__/danger.cpython-314.pyc +0 -0
- package/tui/__pycache__/db.cpython-314.pyc +0 -0
- package/tui/__pycache__/dec.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
- package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
- package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
- package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
- package/tui/__pycache__/history.cpython-314.pyc +0 -0
- package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
- package/tui/__pycache__/menus.cpython-314.pyc +0 -0
- package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
- package/tui/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
- package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
- package/tui/__pycache__/paths.cpython-314.pyc +0 -0
- package/tui/__pycache__/pill.cpython-314.pyc +0 -0
- package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
- package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings.cpython-314.pyc +0 -0
- package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell.cpython-314.pyc +0 -0
- package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
- package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
- package/tui/__pycache__/version.cpython-314.pyc +0 -0
- package/tui/_loop.py +0 -86
- package/tui/_path_fuzzy_search.py +0 -48
- package/tui/_path_match.py +0 -141
- package/tui/about.py +0 -95
- package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
- package/tui/acp/agent.py +0 -1002
- package/tui/acp/api.py +0 -73
- package/tui/acp/encode_tool_call_id.py +0 -12
- package/tui/acp/messages.py +0 -203
- package/tui/acp/prompt.py +0 -53
- package/tui/acp/protocol.py +0 -499
- package/tui/agent.py +0 -70
- package/tui/agent_schema.py +0 -76
- package/tui/agents.py +0 -46
- package/tui/ansi/__init__.py +0 -1
- package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
- package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
- package/tui/ansi/_ansi.py +0 -1689
- package/tui/ansi/_ansi_colors.py +0 -264
- package/tui/ansi/_control_codes.py +0 -37
- package/tui/ansi/_keys.py +0 -251
- package/tui/ansi/_sgr_styles.py +0 -64
- package/tui/ansi/_stream_parser.py +0 -418
- package/tui/answer.py +0 -12
- package/tui/app.py +0 -1266
- package/tui/atomic.py +0 -37
- package/tui/cli.py +0 -313
- package/tui/code_analyze.py +0 -27
- package/tui/complete.py +0 -38
- package/tui/constants.py +0 -61
- package/tui/conversation_markdown.py +0 -30
- package/tui/danger.py +0 -372
- package/tui/data/agents/ampcode.com.toml +0 -52
- package/tui/data/agents/augmentcode.com.toml +0 -41
- package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
- package/tui/data/agents/claude.com.toml +0 -41
- package/tui/data/agents/copilot.github.com.toml +0 -29
- package/tui/data/agents/crowai.dev.toml +0 -36
- package/tui/data/agents/cursor.com.toml +0 -38
- package/tui/data/agents/deepagents.langchain.com +0 -34
- package/tui/data/agents/docker.com.toml +0 -60
- package/tui/data/agents/geminicli.com.toml +0 -28
- package/tui/data/agents/goose.ai.toml +0 -52
- package/tui/data/agents/inference.huggingface.co.toml +0 -41
- package/tui/data/agents/kimi.com.toml +0 -35
- package/tui/data/agents/kiro.dev.toml +0 -43
- package/tui/data/agents/onecode.dev.toml +0 -22
- package/tui/data/agents/openai.com.toml +0 -53
- package/tui/data/agents/openclaw.ai.toml +0 -37
- package/tui/data/agents/opencode.ai.toml +0 -39
- package/tui/data/agents/openhands.dev.toml +0 -46
- package/tui/data/agents/stakpak.dev.toml +0 -62
- package/tui/data/agents/vibe.mistral.ai.toml +0 -31
- package/tui/data/agents/vtcode.dev.toml +0 -63
- package/tui/data/images/frog.png +0 -0
- package/tui/data/sounds/question.wav +0 -0
- package/tui/data/sounds/turn-over.wav +0 -0
- package/tui/db.py +0 -213
- package/tui/dec.py +0 -332
- package/tui/directory.py +0 -234
- package/tui/directory_suggester.py +0 -93
- package/tui/directory_watcher.py +0 -231
- package/tui/format_path.py +0 -25
- package/tui/fuzzy.py +0 -140
- package/tui/fuzzy_index.py +0 -275
- package/tui/gist.py +0 -33
- package/tui/history.py +0 -138
- package/tui/jsonrpc.py +0 -578
- package/tui/menus.py +0 -14
- package/tui/message_log.py +0 -69
- package/tui/messages.py +0 -144
- package/tui/option_content.py +0 -51
- package/tui/os.py +0 -0
- package/tui/path_complete.py +0 -217
- package/tui/path_filter.py +0 -124
- package/tui/paths.py +0 -87
- package/tui/pill.py +0 -23
- package/tui/platform_commands.py +0 -52
- package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
- package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
- package/tui/prompt/extract.py +0 -19
- package/tui/prompt/resource.py +0 -68
- package/tui/protocol.py +0 -28
- package/tui/screens/__init__.py +0 -0
- package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
- package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
- package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
- package/tui/screens/action_modal.py +0 -94
- package/tui/screens/agent_modal.py +0 -175
- package/tui/screens/command_edit_modal.py +0 -74
- package/tui/screens/component_picker.py +0 -168
- package/tui/screens/diff_screen.py +0 -84
- package/tui/screens/log.py +0 -553
- package/tui/screens/main.py +0 -385
- package/tui/screens/main.tcss +0 -655
- package/tui/screens/permissions.py +0 -404
- package/tui/screens/permissions.tcss +0 -72
- package/tui/screens/projects.tcss +0 -80
- package/tui/screens/projects_app.py +0 -347
- package/tui/screens/projects_screen.py +0 -284
- package/tui/screens/session_resume_modal.py +0 -172
- package/tui/screens/session_resume_modal.tcss +0 -35
- package/tui/screens/sessions.py +0 -164
- package/tui/screens/sessions.tcss +0 -119
- package/tui/screens/settings.py +0 -254
- package/tui/screens/settings.tcss +0 -101
- package/tui/screens/store.py +0 -500
- package/tui/screens/store.tcss +0 -274
- package/tui/screens/tool_content_screen.py +0 -59
- package/tui/session_tracker.py +0 -123
- package/tui/settings.py +0 -353
- package/tui/settings_schema.py +0 -431
- package/tui/shell.py +0 -304
- package/tui/shell_read.py +0 -42
- package/tui/slash_command.py +0 -34
- package/tui/tui.tcss +0 -246
- package/tui/twitter.py +0 -38
- package/tui/version.py +0 -80
- package/tui/visuals/__init__.py +0 -0
- package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
- package/tui/visuals/columns.py +0 -272
- package/tui/widgets/__init__.py +0 -0
- package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
- package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
- package/tui/widgets/acp_content.py +0 -70
- package/tui/widgets/agent_response.py +0 -76
- package/tui/widgets/agent_thought.py +0 -167
- package/tui/widgets/ask_user.py +0 -264
- package/tui/widgets/command_pane.py +0 -223
- package/tui/widgets/condensed_path.py +0 -115
- package/tui/widgets/context_stats.py +0 -66
- package/tui/widgets/conversation.py +0 -2641
- package/tui/widgets/danger_warning.py +0 -65
- package/tui/widgets/diff_view.py +0 -69
- package/tui/widgets/directory_input.py +0 -8
- package/tui/widgets/flash.py +0 -81
- package/tui/widgets/future_text.py +0 -126
- package/tui/widgets/grid_select.py +0 -234
- package/tui/widgets/highlighted_textarea.py +0 -180
- package/tui/widgets/load_more.py +0 -24
- package/tui/widgets/mandelbrot.py +0 -294
- package/tui/widgets/markdown_note.py +0 -13
- package/tui/widgets/menu.py +0 -147
- package/tui/widgets/modified_files.py +0 -306
- package/tui/widgets/non_selectable_label.py +0 -5
- package/tui/widgets/note.py +0 -18
- package/tui/widgets/path_search.py +0 -492
- package/tui/widgets/plan.py +0 -285
- package/tui/widgets/project_directory_tree.py +0 -102
- package/tui/widgets/project_grid_select.py +0 -64
- package/tui/widgets/project_summary.py +0 -33
- package/tui/widgets/prompt.py +0 -795
- package/tui/widgets/question.py +0 -360
- package/tui/widgets/session_grid_select.py +0 -230
- package/tui/widgets/session_summary.py +0 -115
- package/tui/widgets/session_tabs.py +0 -188
- package/tui/widgets/shell_result.py +0 -35
- package/tui/widgets/shell_terminal.py +0 -40
- package/tui/widgets/side_bar.py +0 -124
- package/tui/widgets/slash_complete.py +0 -235
- package/tui/widgets/strike_text.py +0 -70
- package/tui/widgets/subagent.py +0 -287
- package/tui/widgets/subagent_screen.py +0 -709
- package/tui/widgets/terminal.py +0 -576
- package/tui/widgets/terminal_tool.py +0 -360
- package/tui/widgets/throbber.py +0 -100
- package/tui/widgets/tool_call.py +0 -398
- package/tui/widgets/user_input.py +0 -23
- package/tui/widgets/version.py +0 -5
- package/tui/widgets/welcome.py +0 -31
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import uuid
|
|
5
|
-
from dataclasses import dataclass, field
|
|
6
|
-
from datetime import datetime, timezone
|
|
7
|
-
from enum import Enum
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from typing import Optional
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class MemoryLayer(Enum):
|
|
13
|
-
L0_CONVERSATION = "l0_conversation"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class MemoryEntry:
|
|
18
|
-
id: str
|
|
19
|
-
layer: MemoryLayer
|
|
20
|
-
content: str
|
|
21
|
-
timestamp: str
|
|
22
|
-
metadata: dict = field(default_factory=dict)
|
|
23
|
-
parent_id: Optional[str] = None
|
|
24
|
-
result_ref: Optional[str] = None
|
|
25
|
-
|
|
26
|
-
@classmethod
|
|
27
|
-
def create(
|
|
28
|
-
cls,
|
|
29
|
-
layer: MemoryLayer,
|
|
30
|
-
content: str,
|
|
31
|
-
metadata: Optional[dict] = None,
|
|
32
|
-
parent_id: Optional[str] = None,
|
|
33
|
-
) -> "MemoryEntry":
|
|
34
|
-
return cls(
|
|
35
|
-
id=str(uuid.uuid4())[:16],
|
|
36
|
-
layer=layer,
|
|
37
|
-
content=content,
|
|
38
|
-
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
39
|
-
metadata=metadata or {},
|
|
40
|
-
parent_id=parent_id,
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
def to_dict(self) -> dict:
|
|
44
|
-
return {
|
|
45
|
-
"id": self.id,
|
|
46
|
-
"layer": self.layer.value,
|
|
47
|
-
"content": self.content,
|
|
48
|
-
"timestamp": self.timestamp,
|
|
49
|
-
"metadata": self.metadata,
|
|
50
|
-
"parent_id": self.parent_id,
|
|
51
|
-
"result_ref": self.result_ref,
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
@classmethod
|
|
55
|
-
def from_dict(cls, data: dict) -> "MemoryEntry":
|
|
56
|
-
return cls(
|
|
57
|
-
id=data["id"],
|
|
58
|
-
layer=MemoryLayer(data["layer"]),
|
|
59
|
-
content=data["content"],
|
|
60
|
-
timestamp=data["timestamp"],
|
|
61
|
-
metadata=data.get("metadata", {}),
|
|
62
|
-
parent_id=data.get("parent_id"),
|
|
63
|
-
result_ref=data.get("result_ref"),
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class MemoryPyramid:
|
|
68
|
-
def __init__(self, storage_path: Optional[Path] = None):
|
|
69
|
-
from onecode.config import ONECODE_DIR
|
|
70
|
-
self.storage_path = storage_path or (ONECODE_DIR / "memory")
|
|
71
|
-
self.storage_path.mkdir(parents=True, exist_ok=True)
|
|
72
|
-
self._layers = {layer: [] for layer in MemoryLayer}
|
|
73
|
-
self._load_index()
|
|
74
|
-
|
|
75
|
-
def _layer_dir(self, layer: MemoryLayer) -> Path:
|
|
76
|
-
return self.storage_path / layer.value
|
|
77
|
-
|
|
78
|
-
def _load_index(self) -> None:
|
|
79
|
-
index_file = self.storage_path / "index.json"
|
|
80
|
-
if index_file.exists():
|
|
81
|
-
try:
|
|
82
|
-
data = json.loads(index_file.read_text(encoding="utf-8"))
|
|
83
|
-
for layer_str, entries in data.items():
|
|
84
|
-
layer = MemoryLayer(layer_str)
|
|
85
|
-
self._layers[layer] = [MemoryEntry.from_dict(e) for e in entries]
|
|
86
|
-
except Exception:
|
|
87
|
-
pass
|
|
88
|
-
|
|
89
|
-
def _save_index(self) -> None:
|
|
90
|
-
index_file = self.storage_path / "index.json"
|
|
91
|
-
data = {layer.value: [e.to_dict() for e in entries] for layer, entries in self._layers.items()}
|
|
92
|
-
index_file.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
93
|
-
|
|
94
|
-
def add(
|
|
95
|
-
self,
|
|
96
|
-
layer: MemoryLayer,
|
|
97
|
-
content: str,
|
|
98
|
-
metadata: Optional[dict] = None,
|
|
99
|
-
parent_id: Optional[str] = None,
|
|
100
|
-
result_ref: Optional[str] = None,
|
|
101
|
-
) -> MemoryEntry:
|
|
102
|
-
entry = MemoryEntry.create(layer, content, metadata, parent_id)
|
|
103
|
-
entry.result_ref = result_ref
|
|
104
|
-
self._layers[layer].append(entry)
|
|
105
|
-
self._save_index()
|
|
106
|
-
self._write_content(layer, entry)
|
|
107
|
-
return entry
|
|
108
|
-
|
|
109
|
-
def _write_content(self, layer: MemoryLayer, entry: MemoryEntry) -> None:
|
|
110
|
-
layer_dir = self._layer_dir(layer)
|
|
111
|
-
layer_dir.mkdir(parents=True, exist_ok=True)
|
|
112
|
-
content_file = layer_dir / f"{entry.id}.md"
|
|
113
|
-
content_file.write_text(entry.content, encoding="utf-8")
|
|
114
|
-
|
|
115
|
-
def get(self, layer: MemoryLayer, entry_id: str) -> Optional[MemoryEntry]:
|
|
116
|
-
for entry in self._layers[layer]:
|
|
117
|
-
if entry.id == entry_id:
|
|
118
|
-
return entry
|
|
119
|
-
return None
|
|
120
|
-
|
|
121
|
-
def get_content(self, entry: MemoryEntry) -> str:
|
|
122
|
-
layer_dir = self._layer_dir(entry.layer)
|
|
123
|
-
content_file = layer_dir / f"{entry.id}.md"
|
|
124
|
-
if content_file.exists():
|
|
125
|
-
return content_file.read_text(encoding="utf-8")
|
|
126
|
-
return entry.content
|
|
127
|
-
|
|
128
|
-
def list_by_layer(self, layer: MemoryLayer) -> list[MemoryEntry]:
|
|
129
|
-
return list(self._layers.get(layer, []))
|
|
130
|
-
|
|
131
|
-
def list_recent(self, layer: MemoryLayer, limit: int = 10) -> list[MemoryEntry]:
|
|
132
|
-
entries = self._layers.get(layer, [])
|
|
133
|
-
return sorted(entries, key=lambda e: e.timestamp, reverse=True)[:limit]
|
package/onecode/memory/recall.py
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import math
|
|
4
|
-
import re
|
|
5
|
-
from dataclasses import dataclass
|
|
6
|
-
from typing import Optional
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@dataclass
|
|
10
|
-
class RecallResult:
|
|
11
|
-
entry_id: str
|
|
12
|
-
content: str
|
|
13
|
-
score: float
|
|
14
|
-
source: str
|
|
15
|
-
metadata: dict
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class BM25:
|
|
19
|
-
# Hard cap above which ``index()`` refuses to build the inverted index.
|
|
20
|
-
# The original O(V × N) construction of ``doc_freqs`` (set membership
|
|
21
|
-
# over Python lists) becomes effectively uncallable above a few
|
|
22
|
-
# thousand docs — a 79k-chunk corpus (observed in production where
|
|
23
|
-
# sessions kept re-indexing without cleaning the SQLite store) took
|
|
24
|
-
# ~1 hour, blocking the event loop and freezing streaming + cancel.
|
|
25
|
-
# Above this cap we degrade to a no-op index so callers fall back to
|
|
26
|
-
# other retrievers / explicit search instead of hanging the process.
|
|
27
|
-
_MAX_DOCS = 5000
|
|
28
|
-
|
|
29
|
-
def __init__(self, k1: float = 1.5, b: float = 0.75):
|
|
30
|
-
self.k1 = k1
|
|
31
|
-
self.b = b
|
|
32
|
-
self.doc_lengths: list[int] = []
|
|
33
|
-
self.avgdl: float = 0
|
|
34
|
-
self.doc_freqs: dict[str, int] = {}
|
|
35
|
-
self.num_docs: int = 0
|
|
36
|
-
self.doc_tokens: list[list[str]] = []
|
|
37
|
-
# Tokenize once per doc as ``set`` (not list) so the
|
|
38
|
-
# ``token in doc`` membership check inside the doc_freqs
|
|
39
|
-
# comprehension is O(1) instead of O(doc_len). This alone takes
|
|
40
|
-
# the 79k-doc construction from ~hours to ~seconds; the hard cap
|
|
41
|
-
# above is a safety net for pathological corpora.
|
|
42
|
-
self._doc_token_sets: list[set[str]] = []
|
|
43
|
-
|
|
44
|
-
def index(self, documents: list[str]) -> None:
|
|
45
|
-
if len(documents) > self._MAX_DOCS:
|
|
46
|
-
import logging
|
|
47
|
-
logging.getLogger(__name__).warning(
|
|
48
|
-
"BM25.index refused: %d docs exceeds cap=%d (would block "
|
|
49
|
-
"the event loop for minutes); BM25 search will return no "
|
|
50
|
-
"results. Clean the codebase index or use a smaller "
|
|
51
|
-
"project scope.", len(documents), self._MAX_DOCS,
|
|
52
|
-
)
|
|
53
|
-
self.doc_tokens = []
|
|
54
|
-
self._doc_token_sets = []
|
|
55
|
-
self.doc_lengths = []
|
|
56
|
-
self.avgdl = 0
|
|
57
|
-
self.num_docs = 0
|
|
58
|
-
self.doc_freqs = {}
|
|
59
|
-
return
|
|
60
|
-
|
|
61
|
-
self.doc_tokens = [self._tokenize(doc) for doc in documents]
|
|
62
|
-
self._doc_token_sets = [set(t) for t in self.doc_tokens]
|
|
63
|
-
self.doc_lengths = [len(tokens) for tokens in self.doc_tokens]
|
|
64
|
-
self.avgdl = sum(self.doc_lengths) / len(self.doc_lengths) if self.doc_lengths else 0
|
|
65
|
-
self.num_docs = len(documents)
|
|
66
|
-
|
|
67
|
-
all_tokens = set()
|
|
68
|
-
for tokens in self._doc_token_sets:
|
|
69
|
-
all_tokens.update(tokens)
|
|
70
|
-
self.doc_freqs = {
|
|
71
|
-
token: sum(1 for ts in self._doc_token_sets if token in ts)
|
|
72
|
-
for token in all_tokens
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
def _tokenize(self, text: str) -> list[str]:
|
|
76
|
-
text = text.lower()
|
|
77
|
-
tokens = re.findall(r"\b\w+\b", text)
|
|
78
|
-
return tokens
|
|
79
|
-
|
|
80
|
-
def score(self, query: str, doc_index: int) -> float:
|
|
81
|
-
query_tokens = self._tokenize(query)
|
|
82
|
-
doc_tokens = self.doc_tokens[doc_index]
|
|
83
|
-
doc_len = self.doc_lengths[doc_index]
|
|
84
|
-
score = 0.0
|
|
85
|
-
|
|
86
|
-
for qt in query_tokens:
|
|
87
|
-
if qt not in self.doc_freqs:
|
|
88
|
-
continue
|
|
89
|
-
df = self.doc_freqs[qt]
|
|
90
|
-
idf = math.log((self.num_docs - df + 0.5) / (df + 0.5) + 1)
|
|
91
|
-
tf = doc_tokens.count(qt)
|
|
92
|
-
tf_score = (tf * (self.k1 + 1)) / (tf + self.k1 * (1 - self.b + self.b * doc_len / self.avgdl))
|
|
93
|
-
score += idf * tf_score
|
|
94
|
-
return score
|
|
95
|
-
|
|
96
|
-
def search(self, query: str, top_k: int = 5) -> list[tuple[int, float]]:
|
|
97
|
-
scores = [(i, self.score(query, i)) for i in range(self.num_docs)]
|
|
98
|
-
scores.sort(key=lambda x: x[1], reverse=True)
|
|
99
|
-
return scores[:top_k]
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
class HybridRecall:
|
|
103
|
-
def __init__(
|
|
104
|
-
self,
|
|
105
|
-
bm25: Optional[BM25] = None,
|
|
106
|
-
embedding_fn: Optional[callable] = None,
|
|
107
|
-
):
|
|
108
|
-
self.bm25 = bm25 or BM25()
|
|
109
|
-
self.embedding_fn = embedding_fn
|
|
110
|
-
self._documents: list[str] = []
|
|
111
|
-
self._embeddings: list[list[float]] = []
|
|
112
|
-
self._entry_ids: list[str] = []
|
|
113
|
-
self._metadata: dict[str, dict] = {}
|
|
114
|
-
|
|
115
|
-
def add_documents(self, documents: list[str], entry_ids: Optional[list[str]] = None, metadata: Optional[dict] = None) -> None:
|
|
116
|
-
start_idx = len(self._documents)
|
|
117
|
-
self._documents.extend(documents)
|
|
118
|
-
for i, doc in enumerate(documents):
|
|
119
|
-
eid = entry_ids[i] if entry_ids and i < len(entry_ids) else f"doc_{start_idx + i}"
|
|
120
|
-
self._entry_ids.append(eid)
|
|
121
|
-
if metadata and eid in metadata:
|
|
122
|
-
self._metadata[eid] = metadata[eid]
|
|
123
|
-
|
|
124
|
-
self.bm25.index(self._documents)
|
|
125
|
-
|
|
126
|
-
if self.embedding_fn:
|
|
127
|
-
for doc in documents:
|
|
128
|
-
emb = self.embedding_fn(doc)
|
|
129
|
-
self._embeddings.append(emb)
|
|
130
|
-
|
|
131
|
-
def keyword_recall(self, query: str, top_k: int = 5) -> list[RecallResult]:
|
|
132
|
-
bm25_results = self.bm25.search(query, top_k * 2)
|
|
133
|
-
results = []
|
|
134
|
-
for doc_idx, bm25_score in bm25_results:
|
|
135
|
-
if doc_idx < len(self._entry_ids):
|
|
136
|
-
eid = self._entry_ids[doc_idx]
|
|
137
|
-
results.append(RecallResult(
|
|
138
|
-
entry_id=eid,
|
|
139
|
-
content=self._documents[doc_idx],
|
|
140
|
-
score=bm25_score,
|
|
141
|
-
source="bm25",
|
|
142
|
-
metadata=self._metadata.get(eid, {}),
|
|
143
|
-
))
|
|
144
|
-
return results[:top_k]
|
|
145
|
-
|
|
146
|
-
def semantic_recall(self, query: str, top_k: int = 5) -> list[RecallResult]:
|
|
147
|
-
if not self.embedding_fn:
|
|
148
|
-
return []
|
|
149
|
-
|
|
150
|
-
query_emb = self.embedding_fn(query)
|
|
151
|
-
similarities = []
|
|
152
|
-
|
|
153
|
-
for i, emb in enumerate(self._embeddings):
|
|
154
|
-
sim = self._cosine_similarity(query_emb, emb)
|
|
155
|
-
similarities.append((i, sim))
|
|
156
|
-
|
|
157
|
-
similarities.sort(key=lambda x: x[1], reverse=True)
|
|
158
|
-
results = []
|
|
159
|
-
for doc_idx, sim_score in similarities[:top_k]:
|
|
160
|
-
eid = self._entry_ids[doc_idx]
|
|
161
|
-
results.append(RecallResult(
|
|
162
|
-
entry_id=eid,
|
|
163
|
-
content=self._documents[doc_idx],
|
|
164
|
-
score=sim_score,
|
|
165
|
-
source="embedding",
|
|
166
|
-
metadata=self._metadata.get(eid, {}),
|
|
167
|
-
))
|
|
168
|
-
return results
|
|
169
|
-
|
|
170
|
-
def _cosine_similarity(self, a: list[float], b: list[float]) -> float:
|
|
171
|
-
dot = sum(x * y for x, y in zip(a, b))
|
|
172
|
-
norm_a = math.sqrt(sum(x * x for x in a))
|
|
173
|
-
norm_b = math.sqrt(sum(x * x for x in b))
|
|
174
|
-
if norm_a == 0 or norm_b == 0:
|
|
175
|
-
return 0
|
|
176
|
-
return dot / (norm_a * norm_b)
|
|
177
|
-
|
|
178
|
-
def hybrid_recall(self, query: str, top_k: int = 5, rrf_k: int = 60) -> list[RecallResult]:
|
|
179
|
-
bm25_results = self.keyword_recall(query, top_k * 2)
|
|
180
|
-
semantic_results = self.semantic_recall(query, top_k * 2)
|
|
181
|
-
|
|
182
|
-
rrf_scores: dict[str, float] = {}
|
|
183
|
-
rrf_results: dict[str, RecallResult] = {}
|
|
184
|
-
|
|
185
|
-
for rank, result in enumerate(bm25_results):
|
|
186
|
-
score = 1.0 / (rrf_k + rank + 1)
|
|
187
|
-
rrf_scores[result.entry_id] = rrf_scores.get(result.entry_id, 0) + score
|
|
188
|
-
rrf_results[result.entry_id] = result
|
|
189
|
-
|
|
190
|
-
for rank, result in enumerate(semantic_results):
|
|
191
|
-
score = 1.0 / (rrf_k + rank + 1)
|
|
192
|
-
rrf_scores[result.entry_id] = rrf_scores.get(result.entry_id, 0) + score
|
|
193
|
-
rrf_results[result.entry_id] = result
|
|
194
|
-
|
|
195
|
-
sorted_ids = sorted(rrf_scores.items(), key=lambda x: x[1], reverse=True)
|
|
196
|
-
return [rrf_results[eid] for eid, _ in sorted_ids[:top_k]]
|
|
197
|
-
|
|
198
|
-
def clear(self) -> None:
|
|
199
|
-
self._documents = []
|
|
200
|
-
self._embeddings = []
|
|
201
|
-
self._entry_ids = []
|
|
202
|
-
self._metadata = {}
|
|
203
|
-
self.bm25 = BM25()
|
package/onecode/migrate.py
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
"""onecode legacy migration — move onecode's private state from ~/.cdh/ to ~/.onecode/.
|
|
2
|
-
|
|
3
|
-
This is a ONE-TIME migration triggered at first startup after upgrade.
|
|
4
|
-
It only moves directories owned by onecode (logs, traces, memory,
|
|
5
|
-
snapshots, mcps, models, onecode.config.yaml). cdh platform directories
|
|
6
|
-
(skills, projects, state, sessions) are left untouched. Session JSON is owned
|
|
7
|
-
by the cdh platform layer (B mapping mode), not by individual engines.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import json
|
|
13
|
-
import logging
|
|
14
|
-
import shutil
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger("onecode.migrate")
|
|
18
|
-
|
|
19
|
-
# Directories/state that belong to onecode and should be migrated
|
|
20
|
-
# NOTE: sessions is deliberately excluded — it belongs to the cdh
|
|
21
|
-
# platform layer (B mapping mode), not to any individual engine.
|
|
22
|
-
_ONECODE_PRIVATE_DIRS = {
|
|
23
|
-
"logs",
|
|
24
|
-
"traces",
|
|
25
|
-
"memory",
|
|
26
|
-
"snapshots",
|
|
27
|
-
"mcps",
|
|
28
|
-
"models",
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
# cdh platform directories — NEVER touch
|
|
32
|
-
_CDH_PLATFORM_DIRS = {"skills", "projects", "state"}
|
|
33
|
-
|
|
34
|
-
# Dotfiles that belong to onecode (at the ~/.cdh/ root level)
|
|
35
|
-
_ONECODE_DOTFILES = {"onecode.config.yaml"}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def migrate_legacy_cdh_to_onecode(
|
|
39
|
-
legacy_dir: Path | None = None,
|
|
40
|
-
target_dir: Path | None = None,
|
|
41
|
-
) -> str | None:
|
|
42
|
-
"""Migrate onecode's private state from ~/.cdh/ to ~/.onecode/.
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
legacy_dir: Source directory (default ~/.cdh/).
|
|
46
|
-
target_dir: Target directory (default ~/.onecode/).
|
|
47
|
-
|
|
48
|
-
Returns:
|
|
49
|
-
Info/warning message string, or None if no migration needed.
|
|
50
|
-
"""
|
|
51
|
-
legacy = (legacy_dir or Path.home() / ".cdh").resolve()
|
|
52
|
-
target = (target_dir or Path.home() / ".onecode").resolve()
|
|
53
|
-
|
|
54
|
-
# Nothing to migrate
|
|
55
|
-
if not legacy.exists():
|
|
56
|
-
return None
|
|
57
|
-
|
|
58
|
-
# Already migrated (marker exists)
|
|
59
|
-
migrated_marker = target / ".migrated_from"
|
|
60
|
-
if migrated_marker.exists():
|
|
61
|
-
return None
|
|
62
|
-
|
|
63
|
-
# Both exist but no marker → user may have manually set up ~/.onecode/
|
|
64
|
-
if target.exists():
|
|
65
|
-
# Check if target has any onecode dirs already
|
|
66
|
-
has_content = any(
|
|
67
|
-
(target / d).exists() for d in _ONECODE_PRIVATE_DIRS
|
|
68
|
-
) or target / "onecode.config.yaml" in target.iterdir()
|
|
69
|
-
if has_content:
|
|
70
|
-
return None # 各自独立运行,无需迁移
|
|
71
|
-
# Target exists but empty — safe to proceed
|
|
72
|
-
|
|
73
|
-
# Perform migration
|
|
74
|
-
target.mkdir(parents=True, exist_ok=True)
|
|
75
|
-
migrated_items = []
|
|
76
|
-
|
|
77
|
-
# Migrate private subdirectories
|
|
78
|
-
for dir_name in _ONECODE_PRIVATE_DIRS:
|
|
79
|
-
src = legacy / dir_name
|
|
80
|
-
if src.exists() and src.is_dir():
|
|
81
|
-
dst = target / dir_name
|
|
82
|
-
if dst.exists():
|
|
83
|
-
# Merge contents (don't overwrite existing)
|
|
84
|
-
for item in src.iterdir():
|
|
85
|
-
dst_item = dst / item.name
|
|
86
|
-
if not dst_item.exists():
|
|
87
|
-
shutil.move(str(item), str(dst_item))
|
|
88
|
-
else:
|
|
89
|
-
shutil.move(str(src), str(dst))
|
|
90
|
-
migrated_items.append(dir_name)
|
|
91
|
-
|
|
92
|
-
# Migrate onecode dotfiles
|
|
93
|
-
for fname in _ONECODE_DOTFILES:
|
|
94
|
-
src = legacy / fname
|
|
95
|
-
if src.exists() and src.is_file():
|
|
96
|
-
dst = target / fname
|
|
97
|
-
if not dst.exists():
|
|
98
|
-
shutil.move(str(src), str(dst))
|
|
99
|
-
migrated_items.append(fname)
|
|
100
|
-
|
|
101
|
-
# Write migration marker
|
|
102
|
-
marker_data = {
|
|
103
|
-
"migrated_from": str(legacy),
|
|
104
|
-
"migrated_to": str(target),
|
|
105
|
-
"items": sorted(migrated_items),
|
|
106
|
-
"preserved_on_legacy": sorted(_CDH_PLATFORM_DIRS),
|
|
107
|
-
}
|
|
108
|
-
migrated_marker.write_text(
|
|
109
|
-
json.dumps(marker_data, ensure_ascii=False, indent=2),
|
|
110
|
-
encoding="utf-8",
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
if migrated_items:
|
|
114
|
-
msg = (
|
|
115
|
-
f"⚠ Migrated onecode state from {legacy} → {target}: "
|
|
116
|
-
f"{', '.join(migrated_items)}. "
|
|
117
|
-
f"cdh platform dirs ({', '.join(_CDH_PLATFORM_DIRS)}) preserved at {legacy}."
|
|
118
|
-
)
|
|
119
|
-
logger.warning(msg)
|
|
120
|
-
return msg
|
|
121
|
-
|
|
122
|
-
return None
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/onecode/models/errors.py
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"""Provider exception hierarchy.
|
|
2
|
-
|
|
3
|
-
These are raised by the ``onecode.models.providers.*`` modules when an upstream
|
|
4
|
-
LLM call fails in a way the agent engine should surface to the user as an
|
|
5
|
-
error event (rather than rendering the raw response body as agent text).
|
|
6
|
-
|
|
7
|
-
The engine's ``chat_stream`` loop already has::
|
|
8
|
-
|
|
9
|
-
except Exception as e:
|
|
10
|
-
yield StreamEvent.error(str(e))
|
|
11
|
-
break
|
|
12
|
-
|
|
13
|
-
so simply raising any subclass of :class:`ProviderError` is enough to route
|
|
14
|
-
the failure through the TUI as a proper ``agent_message_chunk`` with
|
|
15
|
-
``sessionUpdate: "error"``.
|
|
16
|
-
"""
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
|
|
19
|
-
import time
|
|
20
|
-
from typing import TYPE_CHECKING, Optional
|
|
21
|
-
|
|
22
|
-
if TYPE_CHECKING:
|
|
23
|
-
import httpx
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def safe_error_msg(e: BaseException) -> str:
|
|
27
|
-
"""Return a non-empty error message from an exception.
|
|
28
|
-
|
|
29
|
-
Python's ``str(Exception())`` returns ``""``, which leads to
|
|
30
|
-
confusing ``"Error: "`` messages in the UI. This helper falls
|
|
31
|
-
back to the exception type name when the message is empty.
|
|
32
|
-
"""
|
|
33
|
-
return str(e) or type(e).__name__
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def retry_after_seconds(resp: "httpx.Response") -> Optional[float]:
|
|
37
|
-
"""Parse the ``Retry-After`` header from an HTTP response.
|
|
38
|
-
|
|
39
|
-
Accepts both the delta-seconds form and the HTTP-date form (returning
|
|
40
|
-
the delta from ``time.time()`` in either case). Returns ``None`` if
|
|
41
|
-
the header is missing or unparseable.
|
|
42
|
-
"""
|
|
43
|
-
raw = resp.headers.get("Retry-After") or resp.headers.get("retry-after")
|
|
44
|
-
if not raw:
|
|
45
|
-
return None
|
|
46
|
-
try:
|
|
47
|
-
return max(0.0, float(raw))
|
|
48
|
-
except ValueError:
|
|
49
|
-
try:
|
|
50
|
-
from email.utils import parsedate_to_datetime
|
|
51
|
-
target = parsedate_to_datetime(raw).timestamp()
|
|
52
|
-
return max(0.0, target - time.time())
|
|
53
|
-
except Exception:
|
|
54
|
-
return None
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
class ProviderError(Exception):
|
|
58
|
-
"""Base class for all provider errors.
|
|
59
|
-
|
|
60
|
-
Attributes:
|
|
61
|
-
status_code: HTTP status code returned by the upstream, when
|
|
62
|
-
applicable (``None`` for transport-level failures).
|
|
63
|
-
retry_after: ``Retry-After`` header value, when the upstream
|
|
64
|
-
provided one (``None`` otherwise).
|
|
65
|
-
body: Raw response body, truncated to 4 KiB.
|
|
66
|
-
"""
|
|
67
|
-
|
|
68
|
-
def __init__(
|
|
69
|
-
self,
|
|
70
|
-
message: str,
|
|
71
|
-
*,
|
|
72
|
-
status_code: Optional[int] = None,
|
|
73
|
-
retry_after: Optional[float] = None,
|
|
74
|
-
body: Optional[str] = None,
|
|
75
|
-
) -> None:
|
|
76
|
-
super().__init__(message)
|
|
77
|
-
self.status_code = status_code
|
|
78
|
-
self.retry_after = retry_after
|
|
79
|
-
self.body = (body or "")[:4096]
|
|
80
|
-
|
|
81
|
-
def to_user_message(self) -> str:
|
|
82
|
-
"""Build a short, user-friendly message for the TUI."""
|
|
83
|
-
head = f"Error: {safe_error_msg(self)}" if self.args else "Error: provider failure"
|
|
84
|
-
if self.status_code is not None:
|
|
85
|
-
head += f" (HTTP {self.status_code})"
|
|
86
|
-
if self.retry_after is not None:
|
|
87
|
-
head += f" — retry after {self.retry_after:.0f}s"
|
|
88
|
-
return head
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
class RateLimitError(ProviderError):
|
|
92
|
-
"""HTTP 429 / upstream rate-limit signal."""
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class AuthError(ProviderError):
|
|
96
|
-
"""HTTP 401 / 403 — invalid or missing credentials."""
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
class ContextLengthError(ProviderError):
|
|
100
|
-
"""HTTP 400 with a context-length-exceeded error from the upstream."""
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
class TransientProviderError(ProviderError):
|
|
104
|
-
"""5xx or network error — safe to retry."""
|