@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.
Files changed (550) hide show
  1. package/package.json +2 -2
  2. package/ai-dlc-skill/SKILL.md +0 -77
  3. package/ai-dlc-skill/agents/deliver-agent.md +0 -24
  4. package/ai-dlc-skill/agents/master.md +0 -50
  5. package/ai-dlc-skill/agents/plan-agent.md +0 -23
  6. package/ai-dlc-skill/agents/understand-agent.md +0 -23
  7. package/ai-dlc-skill/agents/verify-agent.md +0 -27
  8. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  9. package/ai-dlc-skill/brownfield/README.md +0 -30
  10. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  11. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  12. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  13. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  14. package/ai-dlc-skill/components/backend.md +0 -34
  15. package/ai-dlc-skill/components/desktop.md +0 -30
  16. package/ai-dlc-skill/components/mya.md +0 -29
  17. package/ai-dlc-skill/components/native.md +0 -30
  18. package/ai-dlc-skill/components/tta.md +0 -29
  19. package/ai-dlc-skill/components/web.md +0 -31
  20. package/ai-dlc-skill/components/wxa.md +0 -29
  21. package/ai-dlc-skill/contracts/README.md +0 -25
  22. package/ai-dlc-skill/core/adaptive-flow.md +0 -36
  23. package/ai-dlc-skill/core/security.md +0 -29
  24. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
  25. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
  26. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
  27. package/ai-dlc-skill/cross-tool/export.sh +0 -22
  28. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
  29. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
  30. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
  31. package/ai-dlc-skill/phases/deliver/entry.md +0 -26
  32. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  33. package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
  34. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  35. package/ai-dlc-skill/phases/plan/entry.md +0 -25
  36. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
  37. package/ai-dlc-skill/phases/plan/prompt.md +0 -38
  38. package/ai-dlc-skill/phases/plan/rules.md +0 -25
  39. package/ai-dlc-skill/phases/understand/entry.md +0 -26
  40. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  41. package/ai-dlc-skill/phases/understand/prompt.md +0 -41
  42. package/ai-dlc-skill/phases/understand/rules.md +0 -37
  43. package/ai-dlc-skill/phases/verify/entry.md +0 -26
  44. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
  45. package/ai-dlc-skill/phases/verify/prompt.md +0 -43
  46. package/ai-dlc-skill/phases/verify/rules.md +0 -73
  47. package/ai-dlc-skill/practices/bdd.md +0 -91
  48. package/ai-dlc-skill/practices/sdd.md +0 -84
  49. package/ai-dlc-skill/practices/tdd.md +0 -95
  50. package/ai-dlc-skill/providers/README.md +0 -114
  51. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  52. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  53. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  54. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
  55. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  56. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  57. package/ai-dlc-skill/requirements.md +0 -140
  58. package/ai-dlc-skill/skill.yaml +0 -147
  59. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  60. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  61. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  62. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  63. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  64. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  65. package/ai-dlc-skill/templates/plan/design.md +0 -49
  66. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  67. package/ai-dlc-skill/templates/project/README.md +0 -126
  68. package/ai-dlc-skill/templates/project/template.md +0 -119
  69. package/ai-dlc-skill/templates/understand/feature.feature +0 -23
  70. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  71. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  72. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  73. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  74. package/ai-dlc-skill/walkthrough/template.md +0 -54
  75. package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
  76. package/ai-dlc-skill/workflows/deployment.yaml +0 -199
  77. package/cdh/__init__.py +0 -0
  78. package/cdh/__main__.py +0 -4
  79. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
  82. package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
  83. package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
  84. package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
  85. package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
  86. package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
  87. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  88. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  89. package/cdh/cdh_mcp_injector.py +0 -115
  90. package/cdh/cdh_mcp_loader.py +0 -67
  91. package/cdh/cdh_mcp_manager.py +0 -73
  92. package/cdh/cdh_session_aggregator.py +0 -258
  93. package/cdh/cdh_skill_manager.py +0 -105
  94. package/cdh/cli.py +0 -807
  95. package/cdh/scaffold.py +0 -728
  96. package/onecode/__init__.py +0 -1
  97. package/onecode/__main__.py +0 -4
  98. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  99. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  100. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  101. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  102. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  103. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  104. package/onecode/agent/__init__.py +0 -0
  105. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  106. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  107. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  108. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  109. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  110. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  111. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  112. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  113. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  114. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  115. package/onecode/agent/agents/__init__.py +0 -29
  116. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  117. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  118. package/onecode/agent/agents/types.py +0 -589
  119. package/onecode/agent/attachments.py +0 -112
  120. package/onecode/agent/cdh_loader.py +0 -267
  121. package/onecode/agent/context.py +0 -343
  122. package/onecode/agent/engine.py +0 -2700
  123. package/onecode/agent/hooks.py +0 -86
  124. package/onecode/agent/onecode_agent_acp.py +0 -2743
  125. package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
  126. package/onecode/agent/permissions.py +0 -150
  127. package/onecode/agent/permissions_store.py +0 -62
  128. package/onecode/agent/project_doc.py +0 -19
  129. package/onecode/agent/session.py +0 -195
  130. package/onecode/agent/snapshot.py +0 -144
  131. package/onecode/agent/tools/__init__.py +0 -17
  132. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  133. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  145. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  146. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  147. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  148. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  149. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  150. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  151. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  152. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  153. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  154. package/onecode/agent/tools/agent_tools.py +0 -132
  155. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  156. package/onecode/agent/tools/bash_tool.py +0 -111
  157. package/onecode/agent/tools/communication_tools.py +0 -148
  158. package/onecode/agent/tools/config_tool.py +0 -130
  159. package/onecode/agent/tools/cron_tools.py +0 -178
  160. package/onecode/agent/tools/errors.py +0 -17
  161. package/onecode/agent/tools/file_ops.py +0 -221
  162. package/onecode/agent/tools/file_tools.py +0 -225
  163. package/onecode/agent/tools/git_tools.py +0 -88
  164. package/onecode/agent/tools/lsp_tools.py +0 -404
  165. package/onecode/agent/tools/mcp_tools.py +0 -127
  166. package/onecode/agent/tools/permission_handler.py +0 -46
  167. package/onecode/agent/tools/permissions.py +0 -77
  168. package/onecode/agent/tools/protocol.py +0 -20
  169. package/onecode/agent/tools/registry.py +0 -201
  170. package/onecode/agent/tools/sandbox.py +0 -358
  171. package/onecode/agent/tools/schema_validation.py +0 -100
  172. package/onecode/agent/tools/skill_tools.py +0 -52
  173. package/onecode/agent/tools/todo_tools.py +0 -207
  174. package/onecode/agent/tools/web_tools.py +0 -169
  175. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  176. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  177. package/onecode/builtin_skills/git/SKILL.md +0 -64
  178. package/onecode/builtin_skills/git/skill.yaml +0 -7
  179. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  180. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  181. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  182. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  183. package/onecode/cli.py +0 -935
  184. package/onecode/cloud/__init__.py +0 -0
  185. package/onecode/cloud/base.py +0 -20
  186. package/onecode/codebase/__init__.py +0 -69
  187. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  188. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  189. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  190. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  191. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  192. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  193. package/onecode/codebase/chunker.py +0 -125
  194. package/onecode/codebase/indexer.py +0 -149
  195. package/onecode/codebase/retriever.py +0 -203
  196. package/onecode/codebase/storage.py +0 -131
  197. package/onecode/codebase/tools.py +0 -59
  198. package/onecode/commands.py +0 -596
  199. package/onecode/config.py +0 -314
  200. package/onecode/config_screen.py +0 -600
  201. package/onecode/cron/__init__.py +0 -3
  202. package/onecode/lsp/__init__.py +0 -3
  203. package/onecode/mcp/__init__.py +0 -4
  204. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  205. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  206. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  207. package/onecode/mcp/client.py +0 -193
  208. package/onecode/mcp/manager.py +0 -190
  209. package/onecode/memory/__init__.py +0 -49
  210. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  212. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  213. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  214. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  215. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  216. package/onecode/memory/backend.py +0 -159
  217. package/onecode/memory/pyramid.py +0 -133
  218. package/onecode/memory/recall.py +0 -203
  219. package/onecode/migrate.py +0 -122
  220. package/onecode/models/__init__.py +0 -4
  221. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  222. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  223. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  224. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  225. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  226. package/onecode/models/errors.py +0 -104
  227. package/onecode/models/messages.py +0 -739
  228. package/onecode/models/provider.py +0 -699
  229. package/onecode/models/providers/__init__.py +0 -17
  230. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  231. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  232. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  233. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  234. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  235. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  236. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  237. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  238. package/onecode/models/providers/anthropic_provider.py +0 -273
  239. package/onecode/models/providers/deepseek_provider.py +0 -212
  240. package/onecode/models/providers/glm_provider.py +0 -195
  241. package/onecode/models/providers/minimax_provider.py +0 -158
  242. package/onecode/models/providers/minimaxi_provider.py +0 -417
  243. package/onecode/models/providers/ollama_provider.py +0 -100
  244. package/onecode/models/providers/openai_provider.py +0 -237
  245. package/onecode/models/registry.py +0 -212
  246. package/onecode/server/__init__.py +0 -3
  247. package/onecode/server/app.py +0 -224
  248. package/onecode/skills/__init__.py +0 -11
  249. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  251. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  252. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  253. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  254. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  255. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  256. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  257. package/onecode/skills/argument_substitution.py +0 -38
  258. package/onecode/skills/bootstrap.py +0 -124
  259. package/onecode/skills/create.py +0 -56
  260. package/onecode/skills/frontmatter.py +0 -33
  261. package/onecode/skills/loader.py +0 -139
  262. package/onecode/skills/manager.py +0 -75
  263. package/onecode/skills/model.py +0 -43
  264. package/onecode/storage/__init__.py +0 -0
  265. package/onecode/storage/activity.py +0 -63
  266. package/onecode/storage/project.py +0 -54
  267. package/onecode/storage/session.py +0 -112
  268. package/onecode/tasks/__init__.py +0 -26
  269. package/onecode/tasks/manager.py +0 -232
  270. package/onecode/tasks/models.py +0 -240
  271. package/onecode/trace/__init__.py +0 -0
  272. package/onecode/trace/tracer.py +0 -173
  273. package/onecode/utils/__init__.py +0 -0
  274. package/onecode/utils/helpers.py +0 -20
  275. package/pyproject.toml +0 -74
  276. package/tui/__init__.py +0 -46
  277. package/tui/__main__.py +0 -4
  278. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/about.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/app.cpython-313.pyc +0 -0
  288. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  289. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  308. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  309. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  310. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  311. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  312. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  313. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  314. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  315. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  316. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  317. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  318. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  319. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  320. package/tui/_loop.py +0 -86
  321. package/tui/_path_fuzzy_search.py +0 -48
  322. package/tui/_path_match.py +0 -141
  323. package/tui/about.py +0 -95
  324. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  325. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  326. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  327. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  328. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  329. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  330. package/tui/acp/agent.py +0 -1002
  331. package/tui/acp/api.py +0 -73
  332. package/tui/acp/encode_tool_call_id.py +0 -12
  333. package/tui/acp/messages.py +0 -203
  334. package/tui/acp/prompt.py +0 -53
  335. package/tui/acp/protocol.py +0 -499
  336. package/tui/agent.py +0 -70
  337. package/tui/agent_schema.py +0 -76
  338. package/tui/agents.py +0 -46
  339. package/tui/ansi/__init__.py +0 -1
  340. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  341. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  342. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  343. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  344. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  345. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  346. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  347. package/tui/ansi/_ansi.py +0 -1689
  348. package/tui/ansi/_ansi_colors.py +0 -264
  349. package/tui/ansi/_control_codes.py +0 -37
  350. package/tui/ansi/_keys.py +0 -251
  351. package/tui/ansi/_sgr_styles.py +0 -64
  352. package/tui/ansi/_stream_parser.py +0 -418
  353. package/tui/answer.py +0 -12
  354. package/tui/app.py +0 -1266
  355. package/tui/atomic.py +0 -37
  356. package/tui/cli.py +0 -313
  357. package/tui/code_analyze.py +0 -27
  358. package/tui/complete.py +0 -38
  359. package/tui/constants.py +0 -61
  360. package/tui/conversation_markdown.py +0 -30
  361. package/tui/danger.py +0 -372
  362. package/tui/data/agents/ampcode.com.toml +0 -52
  363. package/tui/data/agents/augmentcode.com.toml +0 -41
  364. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  365. package/tui/data/agents/claude.com.toml +0 -41
  366. package/tui/data/agents/copilot.github.com.toml +0 -29
  367. package/tui/data/agents/crowai.dev.toml +0 -36
  368. package/tui/data/agents/cursor.com.toml +0 -38
  369. package/tui/data/agents/deepagents.langchain.com +0 -34
  370. package/tui/data/agents/docker.com.toml +0 -60
  371. package/tui/data/agents/geminicli.com.toml +0 -28
  372. package/tui/data/agents/goose.ai.toml +0 -52
  373. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  374. package/tui/data/agents/kimi.com.toml +0 -35
  375. package/tui/data/agents/kiro.dev.toml +0 -43
  376. package/tui/data/agents/onecode.dev.toml +0 -22
  377. package/tui/data/agents/openai.com.toml +0 -53
  378. package/tui/data/agents/openclaw.ai.toml +0 -37
  379. package/tui/data/agents/opencode.ai.toml +0 -39
  380. package/tui/data/agents/openhands.dev.toml +0 -46
  381. package/tui/data/agents/stakpak.dev.toml +0 -62
  382. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  383. package/tui/data/agents/vtcode.dev.toml +0 -63
  384. package/tui/data/images/frog.png +0 -0
  385. package/tui/data/sounds/question.wav +0 -0
  386. package/tui/data/sounds/turn-over.wav +0 -0
  387. package/tui/db.py +0 -213
  388. package/tui/dec.py +0 -332
  389. package/tui/directory.py +0 -234
  390. package/tui/directory_suggester.py +0 -93
  391. package/tui/directory_watcher.py +0 -231
  392. package/tui/format_path.py +0 -25
  393. package/tui/fuzzy.py +0 -140
  394. package/tui/fuzzy_index.py +0 -275
  395. package/tui/gist.py +0 -33
  396. package/tui/history.py +0 -138
  397. package/tui/jsonrpc.py +0 -578
  398. package/tui/menus.py +0 -14
  399. package/tui/message_log.py +0 -69
  400. package/tui/messages.py +0 -144
  401. package/tui/option_content.py +0 -51
  402. package/tui/os.py +0 -0
  403. package/tui/path_complete.py +0 -217
  404. package/tui/path_filter.py +0 -124
  405. package/tui/paths.py +0 -87
  406. package/tui/pill.py +0 -23
  407. package/tui/platform_commands.py +0 -52
  408. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  409. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  410. package/tui/prompt/extract.py +0 -19
  411. package/tui/prompt/resource.py +0 -68
  412. package/tui/protocol.py +0 -28
  413. package/tui/screens/__init__.py +0 -0
  414. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  415. package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
  416. package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
  417. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  418. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  419. package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
  420. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  421. package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
  422. package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
  423. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  424. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  425. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  426. package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
  427. package/tui/screens/action_modal.py +0 -94
  428. package/tui/screens/agent_modal.py +0 -175
  429. package/tui/screens/command_edit_modal.py +0 -74
  430. package/tui/screens/component_picker.py +0 -168
  431. package/tui/screens/diff_screen.py +0 -84
  432. package/tui/screens/log.py +0 -553
  433. package/tui/screens/main.py +0 -385
  434. package/tui/screens/main.tcss +0 -655
  435. package/tui/screens/permissions.py +0 -404
  436. package/tui/screens/permissions.tcss +0 -72
  437. package/tui/screens/projects.tcss +0 -80
  438. package/tui/screens/projects_app.py +0 -347
  439. package/tui/screens/projects_screen.py +0 -284
  440. package/tui/screens/session_resume_modal.py +0 -172
  441. package/tui/screens/session_resume_modal.tcss +0 -35
  442. package/tui/screens/sessions.py +0 -164
  443. package/tui/screens/sessions.tcss +0 -119
  444. package/tui/screens/settings.py +0 -254
  445. package/tui/screens/settings.tcss +0 -101
  446. package/tui/screens/store.py +0 -500
  447. package/tui/screens/store.tcss +0 -274
  448. package/tui/screens/tool_content_screen.py +0 -59
  449. package/tui/session_tracker.py +0 -123
  450. package/tui/settings.py +0 -353
  451. package/tui/settings_schema.py +0 -431
  452. package/tui/shell.py +0 -304
  453. package/tui/shell_read.py +0 -42
  454. package/tui/slash_command.py +0 -34
  455. package/tui/tui.tcss +0 -246
  456. package/tui/twitter.py +0 -38
  457. package/tui/version.py +0 -80
  458. package/tui/visuals/__init__.py +0 -0
  459. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  460. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  461. package/tui/visuals/columns.py +0 -272
  462. package/tui/widgets/__init__.py +0 -0
  463. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  464. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  480. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  483. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  485. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  486. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  487. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  488. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  489. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  490. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  491. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  492. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  493. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  494. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  495. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  496. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  497. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  498. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  499. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  500. package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
  501. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  502. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  503. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  504. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  505. package/tui/widgets/acp_content.py +0 -70
  506. package/tui/widgets/agent_response.py +0 -76
  507. package/tui/widgets/agent_thought.py +0 -167
  508. package/tui/widgets/ask_user.py +0 -264
  509. package/tui/widgets/command_pane.py +0 -223
  510. package/tui/widgets/condensed_path.py +0 -115
  511. package/tui/widgets/context_stats.py +0 -66
  512. package/tui/widgets/conversation.py +0 -2641
  513. package/tui/widgets/danger_warning.py +0 -65
  514. package/tui/widgets/diff_view.py +0 -69
  515. package/tui/widgets/directory_input.py +0 -8
  516. package/tui/widgets/flash.py +0 -81
  517. package/tui/widgets/future_text.py +0 -126
  518. package/tui/widgets/grid_select.py +0 -234
  519. package/tui/widgets/highlighted_textarea.py +0 -180
  520. package/tui/widgets/load_more.py +0 -24
  521. package/tui/widgets/mandelbrot.py +0 -294
  522. package/tui/widgets/markdown_note.py +0 -13
  523. package/tui/widgets/menu.py +0 -147
  524. package/tui/widgets/modified_files.py +0 -306
  525. package/tui/widgets/non_selectable_label.py +0 -5
  526. package/tui/widgets/note.py +0 -18
  527. package/tui/widgets/path_search.py +0 -492
  528. package/tui/widgets/plan.py +0 -285
  529. package/tui/widgets/project_directory_tree.py +0 -102
  530. package/tui/widgets/project_grid_select.py +0 -64
  531. package/tui/widgets/project_summary.py +0 -33
  532. package/tui/widgets/prompt.py +0 -795
  533. package/tui/widgets/question.py +0 -360
  534. package/tui/widgets/session_grid_select.py +0 -230
  535. package/tui/widgets/session_summary.py +0 -115
  536. package/tui/widgets/session_tabs.py +0 -188
  537. package/tui/widgets/shell_result.py +0 -35
  538. package/tui/widgets/shell_terminal.py +0 -40
  539. package/tui/widgets/side_bar.py +0 -124
  540. package/tui/widgets/slash_complete.py +0 -235
  541. package/tui/widgets/strike_text.py +0 -70
  542. package/tui/widgets/subagent.py +0 -287
  543. package/tui/widgets/subagent_screen.py +0 -709
  544. package/tui/widgets/terminal.py +0 -576
  545. package/tui/widgets/terminal_tool.py +0 -360
  546. package/tui/widgets/throbber.py +0 -100
  547. package/tui/widgets/tool_call.py +0 -398
  548. package/tui/widgets/user_input.py +0 -23
  549. package/tui/widgets/version.py +0 -5
  550. 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]
@@ -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()
@@ -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
@@ -1,4 +0,0 @@
1
- from onecode.models.registry import ModelRegistry, ModelInfo
2
- from onecode.models.provider import Provider, ProviderRegistry
3
-
4
- __all__ = ["ModelRegistry", "ModelInfo", "Provider", "ProviderRegistry"]
@@ -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."""