@scemoon/cdh 1.0.6 → 1.0.8

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