@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
File without changes
@@ -1,20 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from abc import ABC, abstractmethod
4
- from typing import Optional
5
-
6
-
7
- class CloudProvider(ABC):
8
- name: str = ""
9
-
10
- @abstractmethod
11
- async def deploy(self, project_path: str, version: Optional[str] = None) -> str:
12
- ...
13
-
14
- @abstractmethod
15
- async def status(self) -> str:
16
- ...
17
-
18
- @abstractmethod
19
- async def rollback(self, version: str) -> str:
20
- ...
@@ -1,69 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
- from pathlib import Path
5
- from typing import Optional
6
-
7
- from onecode.codebase.chunker import CodeChunk
8
- from onecode.config import CodebaseConfig
9
- from onecode.codebase.indexer import CodebaseIndexer
10
- from onecode.codebase.retriever import CodebaseRetriever
11
- from onecode.codebase.storage import CodebaseStorage
12
- from onecode.codebase.tools import CodebaseSearchTool
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
- _MAX_INJECT_TOKENS = 2000
17
-
18
-
19
- class CodebaseEngine:
20
- def __init__(self, project_dir: Path, config: Optional[CodebaseConfig] = None):
21
- self.project_dir = project_dir.resolve()
22
- self.config = config or CodebaseConfig()
23
- self.storage = CodebaseStorage(project_dir)
24
- self.indexer = CodebaseIndexer(project_dir, self.config)
25
- self.retriever = CodebaseRetriever(project_dir, self.config)
26
- self._indexed = False
27
-
28
- async def ensure_indexed(self, force: bool = False) -> None:
29
- if self._indexed and not force:
30
- return
31
- result = await self.indexer.index(force=force)
32
- self._indexed = True
33
- self.retriever.mark_dirty()
34
- return result
35
-
36
- async def retrieve(self, query: str, top_k: Optional[int] = None) -> list[CodeChunk]:
37
- await self.ensure_indexed()
38
- return await self.retriever.retrieve(query, top_k=top_k)
39
-
40
- def format_context(self, chunks: list[CodeChunk], max_tokens: int = _MAX_INJECT_TOKENS) -> str:
41
- if not chunks:
42
- return ""
43
- parts: list[str] = []
44
- token_budget = max_tokens
45
- for c in chunks:
46
- header = f"<chunk file=\"{c.file_path}\" lines=\"{c.start_line}-{c.end_line}\">"
47
- footer = "</chunk>"
48
- chunk_text = f"{header}\n{c.content}\n{footer}"
49
- estimated_tokens = len(chunk_text) // 4 + 1
50
- if estimated_tokens > token_budget:
51
- if not parts:
52
- trimmed = c.content[:token_budget * 4]
53
- chunk_text = f"{header}\n{trimmed}\n{footer}"
54
- parts.append(chunk_text)
55
- break
56
- parts.append(chunk_text)
57
- token_budget -= estimated_tokens
58
- return "<codebase_context>\n" + "\n".join(parts) + "\n</codebase_context>"
59
-
60
-
61
- __all__ = [
62
- "CodebaseEngine",
63
- "CodebaseConfig",
64
- "CodeChunk",
65
- "CodebaseIndexer",
66
- "CodebaseRetriever",
67
- "CodebaseStorage",
68
- "CodebaseSearchTool",
69
- ]
@@ -1,125 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import os
4
- from dataclasses import dataclass
5
- from pathlib import Path
6
-
7
-
8
- _LANG_MAP: dict[str, str] = {
9
- ".py": "python",
10
- ".js": "javascript",
11
- ".ts": "typescript",
12
- ".tsx": "typescriptreact",
13
- ".jsx": "javascriptreact",
14
- ".go": "go",
15
- ".rs": "rust",
16
- ".java": "java",
17
- ".rb": "ruby",
18
- ".php": "php",
19
- ".c": "c",
20
- ".cpp": "cpp",
21
- ".h": "c",
22
- ".hpp": "cpp",
23
- ".swift": "swift",
24
- ".kt": "kotlin",
25
- ".scala": "scala",
26
- ".sql": "sql",
27
- ".yaml": "yaml",
28
- ".yml": "yaml",
29
- ".json": "json",
30
- ".toml": "toml",
31
- ".md": "markdown",
32
- ".css": "css",
33
- ".scss": "scss",
34
- ".html": "html",
35
- ".svelte": "svelte",
36
- ".vue": "vue",
37
- ".sh": "shell",
38
- ".bash": "shell",
39
- ".zsh": "shell",
40
- ".fish": "shell",
41
- ".tf": "terraform",
42
- ".tfvars": "terraform",
43
- }
44
-
45
-
46
- @dataclass
47
- class CodeChunk:
48
- file_path: str
49
- start_line: int
50
- end_line: int
51
- content: str
52
- language: str = ""
53
-
54
- @property
55
- def identifier(self) -> str:
56
- return f"{self.file_path}:{self.start_line}-{self.end_line}"
57
-
58
-
59
- def detect_language(file_path: str) -> str:
60
- ext = os.path.splitext(file_path)[1].lower()
61
- return _LANG_MAP.get(ext, "")
62
-
63
-
64
- def chunk_file(file_path: Path, strategy: str = "line",
65
- chunk_lines: int = 50, overlap: int = 10) -> list[CodeChunk]:
66
- return _chunk_by_lines(file_path, chunk_lines, overlap)
67
-
68
-
69
- def _chunk_by_lines(file_path: Path, chunk_lines: int, overlap: int) -> list[CodeChunk]:
70
- try:
71
- text = file_path.read_text(encoding="utf-8")
72
- except Exception:
73
- return []
74
-
75
- lines = text.splitlines(keepends=True)
76
- if not lines:
77
- return []
78
-
79
- language = detect_language(str(file_path))
80
- step = max(chunk_lines - overlap, 1)
81
- chunks: list[CodeChunk] = []
82
-
83
- for start in range(0, len(lines), step):
84
- end = min(start + chunk_lines, len(lines))
85
- content = "".join(lines[start:end]).rstrip()
86
- if not content.strip():
87
- continue
88
- chunks.append(CodeChunk(
89
- file_path=str(file_path),
90
- start_line=start + 1,
91
- end_line=end,
92
- content=content,
93
- language=language,
94
- ))
95
- if end == len(lines):
96
- break
97
-
98
- return chunks
99
-
100
-
101
- def chunk_text(text: str, file_path: str, chunk_lines: int = 50, overlap: int = 10) -> list[CodeChunk]:
102
- lines = text.splitlines(keepends=True)
103
- if not lines:
104
- return []
105
-
106
- language = detect_language(file_path)
107
- step = max(chunk_lines - overlap, 1)
108
- chunks: list[CodeChunk] = []
109
-
110
- for start in range(0, len(lines), step):
111
- end = min(start + chunk_lines, len(lines))
112
- content = "".join(lines[start:end]).rstrip()
113
- if not content.strip():
114
- continue
115
- chunks.append(CodeChunk(
116
- file_path=file_path,
117
- start_line=start + 1,
118
- end_line=end,
119
- content=content,
120
- language=language,
121
- ))
122
- if end == len(lines):
123
- break
124
-
125
- return chunks
@@ -1,149 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- import logging
5
- import os
6
- import time
7
- from dataclasses import dataclass, field
8
- from pathlib import Path
9
- from typing import Optional
10
-
11
- from pathspec import PathSpec
12
- from pathspec.patterns import GitWildMatchPattern
13
-
14
- from onecode.codebase.chunker import chunk_file
15
- from onecode.config import CodebaseConfig
16
- from onecode.codebase.storage import CodebaseStorage
17
-
18
- logger = logging.getLogger(__name__)
19
-
20
-
21
- @dataclass
22
- class IndexResult:
23
- total_files: int = 0
24
- indexed_files: int = 0
25
- skipped_files: int = 0
26
- failed_files: int = 0
27
- total_chunks: int = 0
28
- duration_ms: float = 0.0
29
- errors: list[str] = field(default_factory=list)
30
-
31
-
32
- class CodebaseIndexer:
33
- def __init__(self, project_dir: Path, config: CodebaseConfig):
34
- self.project_dir = project_dir.resolve()
35
- self.config = config
36
- self.storage = CodebaseStorage(project_dir)
37
- self._spec = self._build_spec()
38
-
39
- def _build_spec(self) -> Optional[PathSpec]:
40
- patterns = self.config.exclude_patterns
41
- if not patterns:
42
- return None
43
- return PathSpec.from_lines(GitWildMatchPattern, patterns)
44
-
45
- def walk_files(self) -> list[Path]:
46
- include_exts = {ext.lower() for ext in self.config.include_extensions}
47
- files: list[Path] = []
48
- for root, dirs, filenames in os.walk(self.project_dir):
49
- root_path = Path(root)
50
- rel_root = root_path.relative_to(self.project_dir)
51
- dirs[:] = [
52
- d for d in dirs
53
- if not self._is_excluded(str(rel_root / d))
54
- ]
55
- for fname in filenames:
56
- fpath = root_path / fname
57
- rel = fpath.relative_to(self.project_dir)
58
- if self._is_excluded(str(rel)):
59
- continue
60
- if fpath.suffix.lower() in include_exts:
61
- files.append(fpath)
62
- return files
63
-
64
- def _is_excluded(self, rel_path: str) -> bool:
65
- if self._spec is None:
66
- return False
67
- return self._spec.match_file(rel_path)
68
-
69
- def needs_reindex(self, file_path: Path) -> bool:
70
- if not file_path.exists():
71
- return True
72
- stored_mtime = self.storage.get_file_mtime(str(file_path))
73
- actual_mtime = file_path.stat().st_mtime
74
- return actual_mtime > stored_mtime
75
-
76
- async def index(self, force: bool = False) -> IndexResult:
77
- result = IndexResult()
78
- start = time.monotonic()
79
-
80
- if force:
81
- self.storage.clear_all()
82
-
83
- files = self.walk_files()
84
- result.total_files = len(files)
85
-
86
- # Yield control to the event loop periodically so:
87
- # - CancelledError injected by ``prompt_task.cancel()`` during a
88
- # subagent chat_stream can actually propagate (without this
89
- # the synchronous SQLite/chunker loop below would monopolise
90
- # the event loop and a stuck subagent could never be stopped).
91
- # - other coroutines (e.g. the ACP stdin loop, TUI refresh) keep
92
- # getting scheduled while a long indexing pass runs.
93
- _YIELD_EVERY = 16
94
-
95
- for i, fpath in enumerate(files):
96
- if i and (i % _YIELD_EVERY) == 0:
97
- await asyncio.sleep(0)
98
-
99
- if not force and not self.needs_reindex(fpath):
100
- result.skipped_files += 1
101
- continue
102
-
103
- try:
104
- mtime = fpath.stat().st_mtime
105
- chunks = chunk_file(
106
- fpath,
107
- strategy=self.config.chunk_strategy,
108
- chunk_lines=self.config.chunk_lines,
109
- overlap=self.config.chunk_overlap,
110
- )
111
- if chunks:
112
- self.storage.save_chunks(chunks, mtime=mtime)
113
- result.indexed_files += 1
114
- result.total_chunks += len(chunks)
115
- except Exception as e:
116
- logger.warning("Failed to index %s: %s", fpath, e)
117
- result.failed_files += 1
118
- result.errors.append(f"{fpath}: {e}")
119
-
120
- result.duration_ms = (time.monotonic() - start) * 1000
121
- logger.info(
122
- "Indexed %d files (%d skipped, %d failed) → %d chunks in %.0fms",
123
- result.indexed_files, result.skipped_files, result.failed_files,
124
- result.total_chunks, result.duration_ms,
125
- )
126
- return result
127
-
128
- async def index_file(self, file_path: Path) -> None:
129
- if not file_path.exists():
130
- self.storage.remove_file(str(file_path))
131
- return
132
- include_exts = {ext.lower() for ext in self.config.include_extensions}
133
- if file_path.suffix.lower() not in include_exts:
134
- self.storage.remove_file(str(file_path))
135
- return
136
- try:
137
- mtime = file_path.stat().st_mtime
138
- chunks = chunk_file(
139
- file_path,
140
- strategy=self.config.chunk_strategy,
141
- chunk_lines=self.config.chunk_lines,
142
- overlap=self.config.chunk_overlap,
143
- )
144
- if chunks:
145
- self.storage.save_chunks(chunks, mtime=mtime)
146
- else:
147
- self.storage.remove_file(str(file_path))
148
- except Exception as e:
149
- logger.warning("Failed to index %s: %s", file_path, e)
@@ -1,203 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
- import math
5
- from typing import Optional
6
-
7
- import httpx
8
-
9
- from onecode.codebase.chunker import CodeChunk
10
- from onecode.config import CodebaseConfig
11
- from onecode.codebase.storage import CodebaseStorage
12
- from onecode.memory.recall import BM25
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
-
17
- def _cosine_similarity(a: list[float], b: list[float]) -> float:
18
- dot = sum(x * y for x, y in zip(a, b))
19
- norm_a = math.sqrt(sum(x * x for x in a))
20
- norm_b = math.sqrt(sum(y * y for y in b))
21
- if norm_a == 0 or norm_b == 0:
22
- return 0.0
23
- return dot / (norm_a * norm_b)
24
-
25
-
26
- class CodebaseRetriever:
27
- def __init__(self, project_dir, config: CodebaseConfig):
28
- self.storage = CodebaseStorage(project_dir)
29
- self.config = config
30
- self._bm25: Optional[BM25] = None
31
- self._chunks: list[CodeChunk] = []
32
- self._dirty = True
33
-
34
- def _ensure_indexed(self) -> None:
35
- if not self._dirty:
36
- return
37
- self._chunks = self.storage.get_all_chunks()
38
- if self._chunks:
39
- texts = [c.content for c in self._chunks]
40
- self._bm25 = BM25()
41
- self._bm25.index(texts)
42
- else:
43
- self._bm25 = None
44
- self._dirty = False
45
- logger.debug("BM25 index rebuilt with %d chunks", len(self._chunks))
46
-
47
- def mark_dirty(self) -> None:
48
- self._dirty = True
49
-
50
- async def retrieve(self, query: str, top_k: Optional[int] = None) -> list[CodeChunk]:
51
- k = top_k or self.config.top_k
52
- if not query.strip():
53
- return []
54
- retriever_type = self.config.retriever
55
- if retriever_type == "bm25":
56
- return self._retrieve_bm25(query, k)
57
- elif retriever_type == "embedding":
58
- return await self._retrieve_embedding(query, k) or self._retrieve_bm25(query, k)
59
- elif retriever_type == "hybrid":
60
- return await self._retrieve_hybrid(query, k)
61
- return self._retrieve_bm25(query, k)
62
-
63
- def _retrieve_bm25(self, query: str, top_k: int) -> list[CodeChunk]:
64
- self._ensure_indexed()
65
- if not self._bm25 or not self._chunks:
66
- return []
67
- results = self._bm25.search(query, top_k=top_k)
68
- scored: list[tuple[CodeChunk, float]] = []
69
- for idx, score in results:
70
- if 0 <= idx < len(self._chunks):
71
- scored.append((self._chunks[idx], score))
72
- scored.sort(key=lambda x: x[1], reverse=True)
73
- return [c for c, _ in scored[:top_k]]
74
-
75
- async def _retrieve_embedding(self, query: str, top_k: int) -> Optional[list[CodeChunk]]:
76
- self._ensure_indexed()
77
- if not self._chunks:
78
- return None
79
-
80
- query_emb = await _get_embedding(query, self.config)
81
- if query_emb is None:
82
- return None
83
-
84
- embs = await _get_batch_embeddings([c.content[:1000] for c in self._chunks], self.config)
85
- if not embs or len(embs) != len(self._chunks):
86
- return None
87
-
88
- scored = []
89
- for i, emb in enumerate(embs):
90
- if emb is not None:
91
- score = _cosine_similarity(query_emb, emb)
92
- scored.append((self._chunks[i], score))
93
-
94
- scored.sort(key=lambda x: x[1], reverse=True)
95
- return [c for c, _ in scored[:top_k]]
96
-
97
- async def _retrieve_hybrid(self, query: str, top_k: int) -> list[CodeChunk]:
98
- bm25_chunks = self._retrieve_bm25(query, top_k * 2)
99
- emb_chunks = await self._retrieve_embedding(query, top_k * 2) or []
100
- seen: set[str] = set()
101
- merged: list[CodeChunk] = []
102
- for chunk in bm25_chunks + emb_chunks:
103
- key = chunk.identifier
104
- if key not in seen:
105
- seen.add(key)
106
- merged.append(chunk)
107
- return merged[:top_k]
108
-
109
-
110
- EMBEDDING_CACHE: dict[str, list[float]] = {}
111
- BATCH_CACHE: dict[int, Optional[list[float]]] = {}
112
-
113
-
114
- async def _get_embedding(text: str, config: CodebaseConfig) -> Optional[list[float]]:
115
- if text in EMBEDDING_CACHE:
116
- return EMBEDDING_CACHE[text]
117
- try:
118
- from onecode.config import load_config
119
- cfg = load_config()
120
- provider_name = config.embedding_provider or cfg.default_provider
121
- pcfg = cfg.providers.get(provider_name)
122
- if not pcfg:
123
- return None
124
- if provider_name == "openai":
125
- emb = await _openai_embed(text, pcfg.api_key or "", pcfg.endpoint or "")
126
- elif provider_name == "ollama":
127
- emb = await _ollama_embed(text, pcfg.endpoint or "http://localhost:11434")
128
- else:
129
- emb = await _openai_embed(text, pcfg.api_key or "", pcfg.endpoint or "")
130
- if emb is not None:
131
- EMBEDDING_CACHE[text] = emb
132
- return emb
133
- except Exception as e:
134
- logger.warning("Embedding failed: %s", e)
135
- return None
136
-
137
-
138
- async def _get_batch_embeddings(texts: list[str], config: CodebaseConfig) -> list[Optional[list[float]]]:
139
- global BATCH_CACHE
140
- key = hash(tuple(texts))
141
- if key in BATCH_CACHE:
142
- return BATCH_CACHE[key]
143
-
144
- from onecode.config import load_config
145
- cfg = load_config()
146
- provider_name = config.embedding_provider or cfg.default_provider
147
- pcfg = cfg.providers.get(provider_name)
148
-
149
- MAX_EMBED_CHUNKS = 500
150
- if len(texts) > MAX_EMBED_CHUNKS:
151
- import logging
152
- logging.getLogger(__name__).warning(
153
- "Embedding requested on %d chunks (max=%d); truncating to avoid timeout",
154
- len(texts), MAX_EMBED_CHUNKS,
155
- )
156
- texts = texts[:MAX_EMBED_CHUNKS]
157
-
158
- if provider_name == "ollama" and pcfg:
159
- embs = await _ollama_batch_embed(texts, pcfg.endpoint or "http://localhost:11434")
160
- else:
161
- embs = []
162
- for i, t in enumerate(texts):
163
- if i > 0 and i % 16 == 0:
164
- import asyncio
165
- await asyncio.sleep(0)
166
- emb = await _get_embedding(t, config)
167
- embs.append(emb)
168
-
169
- BATCH_CACHE[key] = embs
170
- return embs
171
-
172
-
173
- async def _openai_embed(text: str, api_key: str, endpoint: str) -> Optional[list[float]]:
174
- url = f"{endpoint.rstrip('/')}/embeddings"
175
- async with httpx.AsyncClient(timeout=30) as client:
176
- resp = await client.post(
177
- url,
178
- headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
179
- json={"input": text, "model": "text-embedding-3-small"},
180
- )
181
- data = resp.json()
182
- emb = data.get("data", [{}])[0].get("embedding")
183
- return emb if emb else None
184
-
185
-
186
- async def _ollama_embed(text: str, endpoint: str) -> Optional[list[float]]:
187
- url = f"{endpoint.rstrip('/')}/api/embeddings"
188
- async with httpx.AsyncClient(timeout=30) as client:
189
- resp = await client.post(
190
- url,
191
- json={"model": "nomic-embed-text", "prompt": text},
192
- )
193
- data = resp.json()
194
- emb = data.get("embedding")
195
- return emb if emb else None
196
-
197
-
198
- async def _ollama_batch_embed(texts: list[str], endpoint: str) -> list[Optional[list[float]]]:
199
- embs = []
200
- for t in texts:
201
- emb = await _ollama_embed(t, endpoint)
202
- embs.append(emb)
203
- return embs