@scemoon/cdh 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/package.json +2 -2
  2. package/ai-dlc-skill/SKILL.md +0 -77
  3. package/ai-dlc-skill/agents/deliver-agent.md +0 -24
  4. package/ai-dlc-skill/agents/master.md +0 -50
  5. package/ai-dlc-skill/agents/plan-agent.md +0 -23
  6. package/ai-dlc-skill/agents/understand-agent.md +0 -23
  7. package/ai-dlc-skill/agents/verify-agent.md +0 -27
  8. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  9. package/ai-dlc-skill/brownfield/README.md +0 -30
  10. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  11. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  12. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  13. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  14. package/ai-dlc-skill/components/backend.md +0 -34
  15. package/ai-dlc-skill/components/desktop.md +0 -30
  16. package/ai-dlc-skill/components/mya.md +0 -29
  17. package/ai-dlc-skill/components/native.md +0 -30
  18. package/ai-dlc-skill/components/tta.md +0 -29
  19. package/ai-dlc-skill/components/web.md +0 -31
  20. package/ai-dlc-skill/components/wxa.md +0 -29
  21. package/ai-dlc-skill/contracts/README.md +0 -25
  22. package/ai-dlc-skill/core/adaptive-flow.md +0 -36
  23. package/ai-dlc-skill/core/security.md +0 -29
  24. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
  25. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
  26. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
  27. package/ai-dlc-skill/cross-tool/export.sh +0 -22
  28. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
  29. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
  30. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
  31. package/ai-dlc-skill/phases/deliver/entry.md +0 -26
  32. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  33. package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
  34. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  35. package/ai-dlc-skill/phases/plan/entry.md +0 -25
  36. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
  37. package/ai-dlc-skill/phases/plan/prompt.md +0 -38
  38. package/ai-dlc-skill/phases/plan/rules.md +0 -25
  39. package/ai-dlc-skill/phases/understand/entry.md +0 -26
  40. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  41. package/ai-dlc-skill/phases/understand/prompt.md +0 -41
  42. package/ai-dlc-skill/phases/understand/rules.md +0 -37
  43. package/ai-dlc-skill/phases/verify/entry.md +0 -26
  44. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
  45. package/ai-dlc-skill/phases/verify/prompt.md +0 -43
  46. package/ai-dlc-skill/phases/verify/rules.md +0 -73
  47. package/ai-dlc-skill/practices/bdd.md +0 -91
  48. package/ai-dlc-skill/practices/sdd.md +0 -84
  49. package/ai-dlc-skill/practices/tdd.md +0 -95
  50. package/ai-dlc-skill/providers/README.md +0 -114
  51. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  52. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  53. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  54. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
  55. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  56. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  57. package/ai-dlc-skill/requirements.md +0 -140
  58. package/ai-dlc-skill/skill.yaml +0 -147
  59. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  60. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  61. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  62. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  63. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  64. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  65. package/ai-dlc-skill/templates/plan/design.md +0 -49
  66. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  67. package/ai-dlc-skill/templates/project/README.md +0 -126
  68. package/ai-dlc-skill/templates/project/template.md +0 -119
  69. package/ai-dlc-skill/templates/understand/feature.feature +0 -23
  70. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  71. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  72. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  73. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  74. package/ai-dlc-skill/walkthrough/template.md +0 -54
  75. package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
  76. package/ai-dlc-skill/workflows/deployment.yaml +0 -199
  77. package/cdh/__init__.py +0 -0
  78. package/cdh/__main__.py +0 -4
  79. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
  82. package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
  83. package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
  84. package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
  85. package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
  86. package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
  87. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  88. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  89. package/cdh/cdh_mcp_injector.py +0 -115
  90. package/cdh/cdh_mcp_loader.py +0 -67
  91. package/cdh/cdh_mcp_manager.py +0 -73
  92. package/cdh/cdh_session_aggregator.py +0 -258
  93. package/cdh/cdh_skill_manager.py +0 -105
  94. package/cdh/cli.py +0 -807
  95. package/cdh/scaffold.py +0 -728
  96. package/onecode/__init__.py +0 -1
  97. package/onecode/__main__.py +0 -4
  98. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  99. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  100. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  101. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  102. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  103. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  104. package/onecode/agent/__init__.py +0 -0
  105. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  106. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  107. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  108. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  109. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  110. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  111. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  112. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  113. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  114. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  115. package/onecode/agent/agents/__init__.py +0 -29
  116. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  117. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  118. package/onecode/agent/agents/types.py +0 -589
  119. package/onecode/agent/attachments.py +0 -112
  120. package/onecode/agent/cdh_loader.py +0 -267
  121. package/onecode/agent/context.py +0 -343
  122. package/onecode/agent/engine.py +0 -2700
  123. package/onecode/agent/hooks.py +0 -86
  124. package/onecode/agent/onecode_agent_acp.py +0 -2743
  125. package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
  126. package/onecode/agent/permissions.py +0 -150
  127. package/onecode/agent/permissions_store.py +0 -62
  128. package/onecode/agent/project_doc.py +0 -19
  129. package/onecode/agent/session.py +0 -195
  130. package/onecode/agent/snapshot.py +0 -144
  131. package/onecode/agent/tools/__init__.py +0 -17
  132. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  133. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  145. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  146. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  147. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  148. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  149. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  150. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  151. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  152. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  153. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  154. package/onecode/agent/tools/agent_tools.py +0 -132
  155. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  156. package/onecode/agent/tools/bash_tool.py +0 -111
  157. package/onecode/agent/tools/communication_tools.py +0 -148
  158. package/onecode/agent/tools/config_tool.py +0 -130
  159. package/onecode/agent/tools/cron_tools.py +0 -178
  160. package/onecode/agent/tools/errors.py +0 -17
  161. package/onecode/agent/tools/file_ops.py +0 -221
  162. package/onecode/agent/tools/file_tools.py +0 -225
  163. package/onecode/agent/tools/git_tools.py +0 -88
  164. package/onecode/agent/tools/lsp_tools.py +0 -404
  165. package/onecode/agent/tools/mcp_tools.py +0 -127
  166. package/onecode/agent/tools/permission_handler.py +0 -46
  167. package/onecode/agent/tools/permissions.py +0 -77
  168. package/onecode/agent/tools/protocol.py +0 -20
  169. package/onecode/agent/tools/registry.py +0 -201
  170. package/onecode/agent/tools/sandbox.py +0 -358
  171. package/onecode/agent/tools/schema_validation.py +0 -100
  172. package/onecode/agent/tools/skill_tools.py +0 -52
  173. package/onecode/agent/tools/todo_tools.py +0 -207
  174. package/onecode/agent/tools/web_tools.py +0 -169
  175. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  176. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  177. package/onecode/builtin_skills/git/SKILL.md +0 -64
  178. package/onecode/builtin_skills/git/skill.yaml +0 -7
  179. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  180. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  181. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  182. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  183. package/onecode/cli.py +0 -935
  184. package/onecode/cloud/__init__.py +0 -0
  185. package/onecode/cloud/base.py +0 -20
  186. package/onecode/codebase/__init__.py +0 -69
  187. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  188. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  189. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  190. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  191. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  192. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  193. package/onecode/codebase/chunker.py +0 -125
  194. package/onecode/codebase/indexer.py +0 -149
  195. package/onecode/codebase/retriever.py +0 -203
  196. package/onecode/codebase/storage.py +0 -131
  197. package/onecode/codebase/tools.py +0 -59
  198. package/onecode/commands.py +0 -596
  199. package/onecode/config.py +0 -314
  200. package/onecode/config_screen.py +0 -600
  201. package/onecode/cron/__init__.py +0 -3
  202. package/onecode/lsp/__init__.py +0 -3
  203. package/onecode/mcp/__init__.py +0 -4
  204. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  205. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  206. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  207. package/onecode/mcp/client.py +0 -193
  208. package/onecode/mcp/manager.py +0 -190
  209. package/onecode/memory/__init__.py +0 -49
  210. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  212. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  213. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  214. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  215. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  216. package/onecode/memory/backend.py +0 -159
  217. package/onecode/memory/pyramid.py +0 -133
  218. package/onecode/memory/recall.py +0 -203
  219. package/onecode/migrate.py +0 -122
  220. package/onecode/models/__init__.py +0 -4
  221. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  222. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  223. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  224. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  225. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  226. package/onecode/models/errors.py +0 -104
  227. package/onecode/models/messages.py +0 -739
  228. package/onecode/models/provider.py +0 -699
  229. package/onecode/models/providers/__init__.py +0 -17
  230. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  231. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  232. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  233. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  234. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  235. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  236. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  237. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  238. package/onecode/models/providers/anthropic_provider.py +0 -273
  239. package/onecode/models/providers/deepseek_provider.py +0 -212
  240. package/onecode/models/providers/glm_provider.py +0 -195
  241. package/onecode/models/providers/minimax_provider.py +0 -158
  242. package/onecode/models/providers/minimaxi_provider.py +0 -417
  243. package/onecode/models/providers/ollama_provider.py +0 -100
  244. package/onecode/models/providers/openai_provider.py +0 -237
  245. package/onecode/models/registry.py +0 -212
  246. package/onecode/server/__init__.py +0 -3
  247. package/onecode/server/app.py +0 -224
  248. package/onecode/skills/__init__.py +0 -11
  249. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  251. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  252. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  253. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  254. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  255. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  256. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  257. package/onecode/skills/argument_substitution.py +0 -38
  258. package/onecode/skills/bootstrap.py +0 -124
  259. package/onecode/skills/create.py +0 -56
  260. package/onecode/skills/frontmatter.py +0 -33
  261. package/onecode/skills/loader.py +0 -139
  262. package/onecode/skills/manager.py +0 -75
  263. package/onecode/skills/model.py +0 -43
  264. package/onecode/storage/__init__.py +0 -0
  265. package/onecode/storage/activity.py +0 -63
  266. package/onecode/storage/project.py +0 -54
  267. package/onecode/storage/session.py +0 -112
  268. package/onecode/tasks/__init__.py +0 -26
  269. package/onecode/tasks/manager.py +0 -232
  270. package/onecode/tasks/models.py +0 -240
  271. package/onecode/trace/__init__.py +0 -0
  272. package/onecode/trace/tracer.py +0 -173
  273. package/onecode/utils/__init__.py +0 -0
  274. package/onecode/utils/helpers.py +0 -20
  275. package/pyproject.toml +0 -74
  276. package/tui/__init__.py +0 -46
  277. package/tui/__main__.py +0 -4
  278. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/about.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/app.cpython-313.pyc +0 -0
  288. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  289. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  308. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  309. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  310. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  311. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  312. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  313. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  314. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  315. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  316. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  317. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  318. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  319. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  320. package/tui/_loop.py +0 -86
  321. package/tui/_path_fuzzy_search.py +0 -48
  322. package/tui/_path_match.py +0 -141
  323. package/tui/about.py +0 -95
  324. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  325. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  326. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  327. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  328. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  329. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  330. package/tui/acp/agent.py +0 -1002
  331. package/tui/acp/api.py +0 -73
  332. package/tui/acp/encode_tool_call_id.py +0 -12
  333. package/tui/acp/messages.py +0 -203
  334. package/tui/acp/prompt.py +0 -53
  335. package/tui/acp/protocol.py +0 -499
  336. package/tui/agent.py +0 -70
  337. package/tui/agent_schema.py +0 -76
  338. package/tui/agents.py +0 -46
  339. package/tui/ansi/__init__.py +0 -1
  340. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  341. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  342. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  343. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  344. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  345. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  346. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  347. package/tui/ansi/_ansi.py +0 -1689
  348. package/tui/ansi/_ansi_colors.py +0 -264
  349. package/tui/ansi/_control_codes.py +0 -37
  350. package/tui/ansi/_keys.py +0 -251
  351. package/tui/ansi/_sgr_styles.py +0 -64
  352. package/tui/ansi/_stream_parser.py +0 -418
  353. package/tui/answer.py +0 -12
  354. package/tui/app.py +0 -1266
  355. package/tui/atomic.py +0 -37
  356. package/tui/cli.py +0 -313
  357. package/tui/code_analyze.py +0 -27
  358. package/tui/complete.py +0 -38
  359. package/tui/constants.py +0 -61
  360. package/tui/conversation_markdown.py +0 -30
  361. package/tui/danger.py +0 -372
  362. package/tui/data/agents/ampcode.com.toml +0 -52
  363. package/tui/data/agents/augmentcode.com.toml +0 -41
  364. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  365. package/tui/data/agents/claude.com.toml +0 -41
  366. package/tui/data/agents/copilot.github.com.toml +0 -29
  367. package/tui/data/agents/crowai.dev.toml +0 -36
  368. package/tui/data/agents/cursor.com.toml +0 -38
  369. package/tui/data/agents/deepagents.langchain.com +0 -34
  370. package/tui/data/agents/docker.com.toml +0 -60
  371. package/tui/data/agents/geminicli.com.toml +0 -28
  372. package/tui/data/agents/goose.ai.toml +0 -52
  373. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  374. package/tui/data/agents/kimi.com.toml +0 -35
  375. package/tui/data/agents/kiro.dev.toml +0 -43
  376. package/tui/data/agents/onecode.dev.toml +0 -22
  377. package/tui/data/agents/openai.com.toml +0 -53
  378. package/tui/data/agents/openclaw.ai.toml +0 -37
  379. package/tui/data/agents/opencode.ai.toml +0 -39
  380. package/tui/data/agents/openhands.dev.toml +0 -46
  381. package/tui/data/agents/stakpak.dev.toml +0 -62
  382. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  383. package/tui/data/agents/vtcode.dev.toml +0 -63
  384. package/tui/data/images/frog.png +0 -0
  385. package/tui/data/sounds/question.wav +0 -0
  386. package/tui/data/sounds/turn-over.wav +0 -0
  387. package/tui/db.py +0 -213
  388. package/tui/dec.py +0 -332
  389. package/tui/directory.py +0 -234
  390. package/tui/directory_suggester.py +0 -93
  391. package/tui/directory_watcher.py +0 -231
  392. package/tui/format_path.py +0 -25
  393. package/tui/fuzzy.py +0 -140
  394. package/tui/fuzzy_index.py +0 -275
  395. package/tui/gist.py +0 -33
  396. package/tui/history.py +0 -138
  397. package/tui/jsonrpc.py +0 -578
  398. package/tui/menus.py +0 -14
  399. package/tui/message_log.py +0 -69
  400. package/tui/messages.py +0 -144
  401. package/tui/option_content.py +0 -51
  402. package/tui/os.py +0 -0
  403. package/tui/path_complete.py +0 -217
  404. package/tui/path_filter.py +0 -124
  405. package/tui/paths.py +0 -87
  406. package/tui/pill.py +0 -23
  407. package/tui/platform_commands.py +0 -52
  408. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  409. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  410. package/tui/prompt/extract.py +0 -19
  411. package/tui/prompt/resource.py +0 -68
  412. package/tui/protocol.py +0 -28
  413. package/tui/screens/__init__.py +0 -0
  414. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  415. package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
  416. package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
  417. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  418. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  419. package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
  420. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  421. package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
  422. package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
  423. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  424. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  425. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  426. package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
  427. package/tui/screens/action_modal.py +0 -94
  428. package/tui/screens/agent_modal.py +0 -175
  429. package/tui/screens/command_edit_modal.py +0 -74
  430. package/tui/screens/component_picker.py +0 -168
  431. package/tui/screens/diff_screen.py +0 -84
  432. package/tui/screens/log.py +0 -553
  433. package/tui/screens/main.py +0 -385
  434. package/tui/screens/main.tcss +0 -655
  435. package/tui/screens/permissions.py +0 -404
  436. package/tui/screens/permissions.tcss +0 -72
  437. package/tui/screens/projects.tcss +0 -80
  438. package/tui/screens/projects_app.py +0 -347
  439. package/tui/screens/projects_screen.py +0 -284
  440. package/tui/screens/session_resume_modal.py +0 -172
  441. package/tui/screens/session_resume_modal.tcss +0 -35
  442. package/tui/screens/sessions.py +0 -164
  443. package/tui/screens/sessions.tcss +0 -119
  444. package/tui/screens/settings.py +0 -254
  445. package/tui/screens/settings.tcss +0 -101
  446. package/tui/screens/store.py +0 -500
  447. package/tui/screens/store.tcss +0 -274
  448. package/tui/screens/tool_content_screen.py +0 -59
  449. package/tui/session_tracker.py +0 -123
  450. package/tui/settings.py +0 -353
  451. package/tui/settings_schema.py +0 -431
  452. package/tui/shell.py +0 -304
  453. package/tui/shell_read.py +0 -42
  454. package/tui/slash_command.py +0 -34
  455. package/tui/tui.tcss +0 -246
  456. package/tui/twitter.py +0 -38
  457. package/tui/version.py +0 -80
  458. package/tui/visuals/__init__.py +0 -0
  459. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  460. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  461. package/tui/visuals/columns.py +0 -272
  462. package/tui/widgets/__init__.py +0 -0
  463. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  464. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  480. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  483. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  485. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  486. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  487. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  488. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  489. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  490. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  491. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  492. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  493. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  494. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  495. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  496. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  497. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  498. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  499. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  500. package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
  501. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  502. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  503. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  504. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  505. package/tui/widgets/acp_content.py +0 -70
  506. package/tui/widgets/agent_response.py +0 -76
  507. package/tui/widgets/agent_thought.py +0 -167
  508. package/tui/widgets/ask_user.py +0 -264
  509. package/tui/widgets/command_pane.py +0 -223
  510. package/tui/widgets/condensed_path.py +0 -115
  511. package/tui/widgets/context_stats.py +0 -66
  512. package/tui/widgets/conversation.py +0 -2641
  513. package/tui/widgets/danger_warning.py +0 -65
  514. package/tui/widgets/diff_view.py +0 -69
  515. package/tui/widgets/directory_input.py +0 -8
  516. package/tui/widgets/flash.py +0 -81
  517. package/tui/widgets/future_text.py +0 -126
  518. package/tui/widgets/grid_select.py +0 -234
  519. package/tui/widgets/highlighted_textarea.py +0 -180
  520. package/tui/widgets/load_more.py +0 -24
  521. package/tui/widgets/mandelbrot.py +0 -294
  522. package/tui/widgets/markdown_note.py +0 -13
  523. package/tui/widgets/menu.py +0 -147
  524. package/tui/widgets/modified_files.py +0 -306
  525. package/tui/widgets/non_selectable_label.py +0 -5
  526. package/tui/widgets/note.py +0 -18
  527. package/tui/widgets/path_search.py +0 -492
  528. package/tui/widgets/plan.py +0 -285
  529. package/tui/widgets/project_directory_tree.py +0 -102
  530. package/tui/widgets/project_grid_select.py +0 -64
  531. package/tui/widgets/project_summary.py +0 -33
  532. package/tui/widgets/prompt.py +0 -795
  533. package/tui/widgets/question.py +0 -360
  534. package/tui/widgets/session_grid_select.py +0 -230
  535. package/tui/widgets/session_summary.py +0 -115
  536. package/tui/widgets/session_tabs.py +0 -188
  537. package/tui/widgets/shell_result.py +0 -35
  538. package/tui/widgets/shell_terminal.py +0 -40
  539. package/tui/widgets/side_bar.py +0 -124
  540. package/tui/widgets/slash_complete.py +0 -235
  541. package/tui/widgets/strike_text.py +0 -70
  542. package/tui/widgets/subagent.py +0 -287
  543. package/tui/widgets/subagent_screen.py +0 -709
  544. package/tui/widgets/terminal.py +0 -576
  545. package/tui/widgets/terminal_tool.py +0 -360
  546. package/tui/widgets/throbber.py +0 -100
  547. package/tui/widgets/tool_call.py +0 -398
  548. package/tui/widgets/user_input.py +0 -23
  549. package/tui/widgets/version.py +0 -5
  550. package/tui/widgets/welcome.py +0 -31
@@ -1,88 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import subprocess
4
- from pathlib import Path
5
- from typing import Any
6
-
7
- from onecode.agent.tools.protocol import ToolResult
8
- from onecode.agent.tools.registry import Tool, ToolSpec
9
-
10
-
11
- class WorktreeTool(Tool):
12
- """Manage git worktrees (Clawd-Code pattern)."""
13
-
14
- def __init__(self, workspace_root: Path | None = None):
15
- self._workspace_root = (workspace_root or Path.cwd()).resolve()
16
-
17
- def spec(self) -> ToolSpec:
18
- return ToolSpec(
19
- name="Worktree",
20
- description="Manage git worktrees: create, list, prune. Worktrees allow checking out multiple branches simultaneously.",
21
- input_schema={
22
- "type": "object",
23
- "properties": {
24
- "action": {
25
- "type": "string",
26
- "enum": ["list", "add", "prune"],
27
- "description": "List worktrees, add a new worktree, or prune stale ones",
28
- },
29
- "path": {"type": "string", "description": "Path for the new worktree (required for add)"},
30
- "branch": {"type": "string", "description": "Branch to checkout (default: new branch named after path)"},
31
- "commitish": {"type": "string", "description": "Commit, tag, or branch to base the worktree on"},
32
- },
33
- "required": ["action"],
34
- },
35
- )
36
-
37
- def run(self, tool_input: dict[str, Any]) -> ToolResult:
38
- action = tool_input.get("action", "list")
39
- try:
40
- if action == "list":
41
- result = subprocess.run(
42
- ["git", "worktree", "list"],
43
- capture_output=True, text=True, timeout=30,
44
- cwd=str(self._workspace_root),
45
- )
46
- if result.returncode != 0:
47
- return ToolResult(name="Worktree", output={"error": result.stderr.strip()}, is_error=True)
48
- worktrees = []
49
- for line in result.stdout.strip().split("\n"):
50
- if line:
51
- parts = line.split()
52
- worktrees.append({"path": parts[0], "branch": parts[1] if len(parts) > 1 else ""})
53
- return ToolResult(name="Worktree", output={"worktrees": worktrees})
54
-
55
- elif action == "add":
56
- wt_path = tool_input.get("path", "")
57
- if not wt_path:
58
- return ToolResult(name="Worktree", output={"error": "path required for add"}, is_error=True)
59
- branch = tool_input.get("branch")
60
- commitish = tool_input.get("commitish")
61
- cmd = ["git", "worktree", "add", wt_path]
62
- if branch:
63
- cmd.extend(["-b", branch])
64
- if commitish:
65
- cmd.append(commitish)
66
- result = subprocess.run(cmd, capture_output=True, text=True, timeout=60, cwd=str(self._workspace_root))
67
- if result.returncode != 0:
68
- return ToolResult(name="Worktree", output={"error": result.stderr.strip()}, is_error=True)
69
- return ToolResult(name="Worktree", output={"path": wt_path, "status": "created", "output": result.stdout.strip()})
70
-
71
- elif action == "prune":
72
- result = subprocess.run(
73
- ["git", "worktree", "prune"],
74
- capture_output=True, text=True, timeout=30,
75
- cwd=str(self._workspace_root),
76
- )
77
- if result.returncode != 0:
78
- return ToolResult(name="Worktree", output={"error": result.stderr.strip()}, is_error=True)
79
- return ToolResult(name="Worktree", output={"status": "pruned"})
80
-
81
- return ToolResult(name="Worktree", output={"error": f"unknown action: {action}"}, is_error=True)
82
- except subprocess.TimeoutExpired:
83
- return ToolResult(name="Worktree", output={"error": "git worktree command timed out"}, is_error=True)
84
- except FileNotFoundError:
85
- return ToolResult(name="Worktree", output={"error": "git not found"}, is_error=True)
86
- except Exception as e:
87
- return ToolResult(name="Worktree", output={"error": str(e)}, is_error=True)
88
-
@@ -1,404 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import subprocess
5
- from pathlib import Path
6
- from typing import Any
7
-
8
- from onecode.agent.tools.protocol import ToolResult
9
- from onecode.agent.tools.registry import Tool, ToolSpec
10
-
11
-
12
- class LSPClient:
13
- def __init__(self, command: list[str], root_uri: str, workspace_root: Path | None = None):
14
- self._command = command
15
- self._root_uri = root_uri
16
- self._workspace_root = workspace_root or Path(root_uri.replace("file://", "")) if root_uri else Path.cwd()
17
- self._process: subprocess.Popen | None = None
18
- self._request_id = 0
19
- self._pending: dict[int, Any] = {}
20
-
21
- def start(self) -> bool:
22
- try:
23
- self._process = subprocess.Popen(
24
- self._command,
25
- stdin=subprocess.PIPE,
26
- stdout=subprocess.PIPE,
27
- stderr=subprocess.PIPE,
28
- )
29
- resp = self._send("initialize", {
30
- "processId": None,
31
- "rootUri": self._root_uri,
32
- "capabilities": {
33
- "textDocument": {
34
- "definition": {"dynamicRegistration": True},
35
- "references": {"dynamicRegistration": True},
36
- "hover": {"dynamicRegistration": True},
37
- "documentSymbol": {"dynamicRegistration": True},
38
- "callHierarchy": {"dynamicRegistration": True},
39
- },
40
- "workspace": {
41
- "symbol": {"dynamicRegistration": True},
42
- },
43
- },
44
- })
45
- self._send("initialized", {"parameters": {}})
46
- return resp is not None
47
- except Exception:
48
- self.stop()
49
- return False
50
-
51
- def _send(self, method: str, params: dict) -> dict | None:
52
- if not self._process or not self._process.stdin:
53
- return None
54
- self._request_id += 1
55
- msg_id = self._request_id
56
- msg = json.dumps({"jsonrpc": "2.0", "id": msg_id, "method": method, "params": params})
57
- self._process.stdin.write((msg + "\n").encode())
58
- self._process.stdin.flush()
59
-
60
- line = self._process.stdout.readline() if self._process.stdout else b""
61
- if line:
62
- try:
63
- resp = json.loads(line)
64
- if resp.get("id") == msg_id:
65
- if "error" in resp:
66
- return {"error": resp["error"]}
67
- return resp.get("result")
68
- return None
69
- except json.JSONDecodeError:
70
- pass
71
- return None
72
-
73
- def _read_notification(self) -> dict | None:
74
- if not self._process or not self._process.stdout:
75
- return None
76
- import select
77
- if select.select([self._process.stdout], [], [], 0.1)[0]:
78
- line = self._process.stdout.readline()
79
- if line:
80
- try:
81
- return json.loads(line)
82
- except json.JSONDecodeError:
83
- pass
84
- return None
85
-
86
- def _position_params(self, file_uri: str, line: int, character: int) -> dict:
87
- return {
88
- "textDocument": {"uri": file_uri},
89
- "position": {"line": line, "character": character},
90
- }
91
-
92
- def goto_definition(self, file_uri: str, line: int, character: int) -> list[dict]:
93
- result = self._send("textDocument/definition", self._position_params(file_uri, line, character))
94
- if result is None:
95
- return []
96
- if isinstance(result, dict) and "error" in result:
97
- return []
98
- if not isinstance(result, list):
99
- result = [result] if result else []
100
- return [self._location_to_dict(loc) for loc in result if loc]
101
-
102
- def find_references(self, file_uri: str, line: int, character: int, include_declaration: bool = True) -> list[dict]:
103
- params = self._position_params(file_uri, line, character)
104
- params["context"] = {"includeDeclaration": include_declaration}
105
- result = self._send("textDocument/references", params)
106
- if result is None:
107
- return []
108
- if isinstance(result, dict) and "error" in result:
109
- return []
110
- return [self._location_to_dict(loc) for loc in result if loc]
111
-
112
- def hover(self, file_uri: str, line: int, character: int) -> dict | None:
113
- result = self._send("textDocument/hover", self._position_params(file_uri, line, character))
114
- if result is None or isinstance(result, dict) and "error" in result:
115
- return None
116
- if not result:
117
- return None
118
- return {
119
- "contents": result.get("contents", ""),
120
- "range": result.get("range"),
121
- }
122
-
123
- def document_symbol(self, file_uri: str) -> list[dict]:
124
- result = self._send("textDocument/documentSymbol", {"textDocument": {"uri": file_uri}})
125
- if result is None or isinstance(result, dict) and "error" in result:
126
- return []
127
- if not isinstance(result, list):
128
- return []
129
- symbols = []
130
- for item in result:
131
- if isinstance(item, dict):
132
- symbols.append({
133
- "name": item.get("name", ""),
134
- "kind": item.get("kind", ""),
135
- "location": self._location_to_dict(item.get("location")),
136
- "containerName": item.get("containerName", ""),
137
- })
138
- return symbols
139
-
140
- def workspace_symbol(self, query: str) -> list[dict]:
141
- result = self._send("workspace/symbol", {"query": query})
142
- if result is None or isinstance(result, dict) and "error" in result:
143
- return []
144
- if not isinstance(result, list):
145
- return []
146
- symbols = []
147
- for item in result:
148
- if isinstance(item, dict):
149
- symbols.append({
150
- "name": item.get("name", ""),
151
- "kind": item.get("kind", ""),
152
- "location": self._location_to_dict(item.get("location")),
153
- "containerName": item.get("containerName", ""),
154
- })
155
- return symbols
156
-
157
- def goto_implementation(self, file_uri: str, line: int, character: int) -> list[dict]:
158
- result = self._send("textDocument/implementation", self._position_params(file_uri, line, character))
159
- if result is None or isinstance(result, dict) and "error" in result:
160
- return []
161
- if not isinstance(result, list):
162
- result = [result] if result else []
163
- return [self._location_to_dict(loc) for loc in result if loc]
164
-
165
- def call_hierarchy(self, file_uri: str, line: int, character: int) -> dict:
166
- result = self._send("textDocument/prepareCallHierarchy", self._position_params(file_uri, line, character))
167
- if result is None or isinstance(result, dict) and "error" in result:
168
- return {"incomingCalls": [], "outgoingCalls": []}
169
-
170
- if not isinstance(result, list) or not result:
171
- return {"incomingCalls": [], "outgoingCalls": []}
172
-
173
- item = result[0] if result else {}
174
- call_hierarchy = {"incomingCalls": [], "outgoingCalls": []}
175
-
176
- if item.get("from"):
177
- incoming = self._send("callHierarchy/incomingCalls", {"item": item})
178
- if incoming and isinstance(incoming, list):
179
- call_hierarchy["incomingCalls"] = [
180
- {"from": c.get("from", {}).get("name", ""), "locations": [self._location_to_dict(loc) for loc in c.get("from", {}).get("locations", [])]}
181
- for c in incoming if isinstance(c, dict)
182
- ]
183
-
184
- if item.get("to"):
185
- outgoing = self._send("callHierarchy/outgoingCalls", {"item": item})
186
- if outgoing and isinstance(outgoing, list):
187
- call_hierarchy["outgoingCalls"] = [
188
- {"to": c.get("to", {}).get("name", ""), "locations": [self._location_to_dict(loc) for loc in c.get("to", {}).get("locations", [])]}
189
- for c in outgoing if isinstance(c, dict)
190
- ]
191
-
192
- return call_hierarchy
193
-
194
- def incoming_calls(self, file_uri: str, line: int, character: int) -> list[dict]:
195
- result = self._send("callHierarchy/incomingCalls", {
196
- "item": {
197
- "name": "",
198
- "uri": file_uri,
199
- "range": {"start": {"line": line, "character": character}, "end": {"line": line, "character": character}},
200
- }
201
- })
202
- if result is None or isinstance(result, dict) and "error" in result:
203
- return []
204
- if not isinstance(result, list):
205
- return []
206
- return [
207
- {"from": c.get("from", {}).get("name", ""), "locations": [self._location_to_dict(loc) for loc in c.get("from", {}).get("locations", [])]}
208
- for c in result if isinstance(c, dict)
209
- ]
210
-
211
- def outgoing_calls(self, file_uri: str, line: int, character: int) -> list[dict]:
212
- result = self._send("callHierarchy/outgoingCalls", {
213
- "item": {
214
- "name": "",
215
- "uri": file_uri,
216
- "range": {"start": {"line": line, "character": character}, "end": {"line": line, "character": character}},
217
- }
218
- })
219
- if result is None or isinstance(result, dict) and "error" in result:
220
- return []
221
- if not isinstance(result, list):
222
- return []
223
- return [
224
- {"to": c.get("to", {}).get("name", ""), "locations": [self._location_to_dict(loc) for loc in c.get("to", {}).get("locations", [])]}
225
- for c in result if isinstance(c, dict)
226
- ]
227
-
228
- def diagnostics(self, file_uri: str, text: str) -> list[dict]:
229
- self._send("textDocument/didOpen", {
230
- "textDocument": {"uri": file_uri, "languageId": "python", "version": 1, "text": text},
231
- })
232
- result = self._send("textDocument/diagnostic", {"textDocument": {"uri": file_uri}})
233
- if result is None:
234
- return []
235
- if isinstance(result, dict) and "error" in result:
236
- return []
237
- return result.get("diagnostics", []) if isinstance(result, dict) else []
238
-
239
- def _location_to_dict(self, loc: Any) -> dict | None:
240
- if not isinstance(loc, dict):
241
- return None
242
- uri = loc.get("uri", "")
243
- range_data = loc.get("range", {})
244
- if not range_data:
245
- return {"uri": uri, "line": 0, "endLine": 0, "column": 0, "endColumn": 0}
246
- start = range_data.get("start", {})
247
- end = range_data.get("end", {})
248
- return {
249
- "uri": uri,
250
- "line": start.get("line", 0) + 1,
251
- "endLine": end.get("line", 0) + 1,
252
- "column": start.get("character", 0) + 1,
253
- "endColumn": end.get("character", 0) + 1,
254
- }
255
-
256
- def stop(self):
257
- if self._process:
258
- try:
259
- self._process.terminate()
260
- self._process.wait(timeout=2)
261
- except subprocess.TimeoutExpired:
262
- self._process.kill()
263
- self._process = None
264
-
265
-
266
- class LSPTool(Tool):
267
- def __init__(self):
268
- self._servers: dict[str, LSPClient] = {}
269
-
270
- def spec(self) -> ToolSpec:
271
- return ToolSpec(
272
- name="LSP",
273
- description="Get code intelligence from a Language Server. Supports: diagnostics, gotoDefinition, findReferences, hover, documentSymbol, workspaceSymbol, gotoImplementation, callHierarchy, incomingCalls, outgoingCalls.",
274
- input_schema={
275
- "type": "object",
276
- "properties": {
277
- "command": {
278
- "type": "array",
279
- "items": {"type": "string"},
280
- "description": "LSP server command (e.g. ['pyright-langserver', '--stdio'])",
281
- },
282
- "file_path": {"type": "string", "description": "Path to the file to analyze"},
283
- "action": {
284
- "type": "string",
285
- "enum": [
286
- "diagnostics",
287
- "gotoDefinition",
288
- "findReferences",
289
- "hover",
290
- "documentSymbol",
291
- "workspaceSymbol",
292
- "gotoImplementation",
293
- "callHierarchy",
294
- "incomingCalls",
295
- "outgoingCalls",
296
- ],
297
- "description": "LSP action to perform",
298
- },
299
- "line": {
300
- "type": "integer",
301
- "description": "Line number (1-based) for position-based actions (gotoDefinition, findReferences, hover, gotoImplementation, callHierarchy, incomingCalls, outgoingCalls)",
302
- },
303
- "character": {
304
- "type": "integer",
305
- "description": "Character position (1-based) for position-based actions",
306
- },
307
- "query": {
308
- "type": "string",
309
- "description": "Query string for workspaceSymbol action",
310
- },
311
- "include_declaration": {
312
- "type": "boolean",
313
- "description": "Include declaration in references (default: true)",
314
- "default": True,
315
- },
316
- },
317
- "required": ["command", "file_path", "action"],
318
- },
319
- )
320
-
321
- def run(self, tool_input: dict[str, Any]) -> ToolResult:
322
- command = tool_input.get("command", [])
323
- file_path = tool_input.get("file_path", "")
324
- action = tool_input.get("action", "diagnostics")
325
-
326
- if not command or not file_path:
327
- return ToolResult(name="LSP", output={"error": "command and file_path required"}, is_error=True)
328
-
329
- server_key = "|".join(command)
330
- if server_key not in self._servers:
331
- workspace_root = Path(file_path).parent if file_path else Path.cwd()
332
- root_uri = workspace_root.as_uri()
333
- server = LSPClient(command, root_uri, workspace_root)
334
- if not server.start():
335
- return ToolResult(name="LSP", output={"error": f"failed to start LSP server: {command}"}, is_error=True)
336
- self._servers[server_key] = server
337
-
338
- server = self._servers[server_key]
339
- file_uri = Path(file_path).absolute().as_uri()
340
- text = ""
341
- try:
342
- text = Path(file_path).read_text(encoding="utf-8")
343
- except Exception as e:
344
- return ToolResult(name="LSP", output={"error": f"cannot read file: {e}"}, is_error=True)
345
-
346
- line = tool_input.get("line", 1) - 1
347
- character = tool_input.get("character", 1) - 1
348
-
349
- try:
350
- if action == "diagnostics":
351
- diags = server.diagnostics(file_uri, text)
352
- return ToolResult(name="LSP", output={"diagnostics": diags, "count": len(diags)})
353
-
354
- elif action == "gotoDefinition":
355
- results = server.goto_definition(file_uri, line, character)
356
- return ToolResult(name="LSP", output={"definitions": results, "count": len(results)})
357
-
358
- elif action == "findReferences":
359
- include_decl = tool_input.get("include_declaration", True)
360
- results = server.find_references(file_uri, line, character, include_decl)
361
- return ToolResult(name="LSP", output={"references": results, "count": len(results)})
362
-
363
- elif action == "hover":
364
- result = server.hover(file_uri, line, character)
365
- if result:
366
- return ToolResult(name="LSP", output=result)
367
- return ToolResult(name="LSP", output={"error": "no hover info available"})
368
-
369
- elif action == "documentSymbol":
370
- symbols = server.document_symbol(file_uri)
371
- return ToolResult(name="LSP", output={"symbols": symbols, "count": len(symbols)})
372
-
373
- elif action == "workspaceSymbol":
374
- query = tool_input.get("query", "")
375
- symbols = server.workspace_symbol(query)
376
- return ToolResult(name="LSP", output={"symbols": symbols, "count": len(symbols)})
377
-
378
- elif action == "gotoImplementation":
379
- results = server.goto_implementation(file_uri, line, character)
380
- return ToolResult(name="LSP", output={"implementations": results, "count": len(results)})
381
-
382
- elif action == "callHierarchy":
383
- result = server.call_hierarchy(file_uri, line, character)
384
- return ToolResult(name="LSP", output=result)
385
-
386
- elif action == "incomingCalls":
387
- results = server.incoming_calls(file_uri, line, character)
388
- return ToolResult(name="LSP", output={"incomingCalls": results, "count": len(results)})
389
-
390
- elif action == "outgoingCalls":
391
- results = server.outgoing_calls(file_uri, line, character)
392
- return ToolResult(name="LSP", output={"outgoingCalls": results, "count": len(results)})
393
-
394
- else:
395
- return ToolResult(name="LSP", output={"error": f"unknown action: {action}"}, is_error=True)
396
-
397
- except Exception as e:
398
- return ToolResult(name="LSP", output={"error": str(e)}, is_error=True)
399
-
400
-
401
- def stop_all(self):
402
- for server in self._servers.values():
403
- server.stop()
404
- self._servers.clear()
@@ -1,127 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Any
4
-
5
- from onecode.agent.tools.protocol import ToolResult
6
- from onecode.agent.tools.registry import Tool, ToolSpec
7
- from onecode.mcp.manager import MCPManager
8
-
9
-
10
- class MCPTool(Tool):
11
- """Call a tool from a connected MCP server (Clawd-Code pattern)."""
12
-
13
- def __init__(self, mcp_manager: MCPManager):
14
- self._mcp = mcp_manager
15
-
16
- def spec(self) -> ToolSpec:
17
- return ToolSpec(
18
- name="MCPTool",
19
- description="Call a tool on an MCP server. Requires an active MCP connection.",
20
- input_schema={
21
- "type": "object",
22
- "properties": {
23
- "server": {"type": "string", "description": "MCP server name"},
24
- "tool": {"type": "string", "description": "Tool name on the MCP server"},
25
- "arguments": {"type": "object", "description": "Tool arguments"},
26
- },
27
- "required": ["server", "tool"],
28
- },
29
- )
30
-
31
- def run(self, tool_input: dict[str, Any]) -> ToolResult:
32
- import asyncio
33
- server = tool_input.get("server", "")
34
- tool_name = tool_input.get("tool", "")
35
- args = tool_input.get("arguments", {})
36
- if not self._mcp.is_connected(server):
37
- return ToolResult(
38
- name="MCPTool",
39
- output={"error": f"MCP server '{server}' is not connected"},
40
- is_error=True,
41
- )
42
- try:
43
- loop = asyncio.get_event_loop()
44
- if loop.is_running():
45
- future = asyncio.run_coroutine_threadsafe(
46
- self._mcp.call_tool(server, tool_name, args), loop
47
- )
48
- result = future.result(timeout=60)
49
- else:
50
- result = asyncio.run(self._mcp.call_tool(server, tool_name, args))
51
- return ToolResult(name="MCPTool", output=result or {"error": "no response"})
52
- except Exception as e:
53
- return ToolResult(
54
- name="MCPTool",
55
- output={"error": str(e)},
56
- is_error=True,
57
- )
58
-
59
-
60
-
61
- class MCPResourcesTool(Tool):
62
- """Access resources from a connected MCP server."""
63
-
64
- def __init__(self, mcp_manager: MCPManager):
65
- self._mcp = mcp_manager
66
-
67
- def spec(self) -> ToolSpec:
68
- return ToolSpec(
69
- name="MCPResources",
70
- description="List or read resources from a connected MCP server. Provides access to external data sources.",
71
- input_schema={
72
- "type": "object",
73
- "properties": {
74
- "server": {"type": "string", "description": "MCP server name"},
75
- "action": {
76
- "type": "string",
77
- "enum": ["list", "read"],
78
- "description": "List available resources or read a specific resource",
79
- },
80
- "uri": {
81
- "type": "string",
82
- "description": "Resource URI to read (required for action='read')",
83
- },
84
- },
85
- "required": ["server", "action"],
86
- },
87
- )
88
-
89
- def run(self, tool_input: dict[str, Any]) -> ToolResult:
90
- import asyncio
91
- server = tool_input.get("server", "")
92
- action = tool_input.get("action", "list")
93
- uri = tool_input.get("uri", "")
94
- if not self._mcp.is_connected(server):
95
- return ToolResult(
96
- name="MCPResources",
97
- output={"error": f"MCP server '{server}' is not connected"},
98
- is_error=True,
99
- )
100
- client = self._mcp.get_client(server)
101
- if not client:
102
- return ToolResult(name="MCPResources", output={"error": "client not found"}, is_error=True)
103
- try:
104
- loop = asyncio.get_event_loop()
105
- if loop.is_running():
106
- if action == "list":
107
- future = asyncio.run_coroutine_threadsafe(
108
- client._send_request("resources/list", {}), loop
109
- )
110
- else:
111
- future = asyncio.run_coroutine_threadsafe(
112
- client._send_request("resources/read", {"uri": uri}), loop
113
- )
114
- result = future.result(timeout=60)
115
- else:
116
- if action == "list":
117
- result = asyncio.run(client._send_request("resources/list", {}))
118
- else:
119
- result = asyncio.run(client._send_request("resources/read", {"uri": uri}))
120
- return ToolResult(name="MCPResources", output=result or {"error": "no response"})
121
- except Exception as e:
122
- return ToolResult(
123
- name="MCPResources",
124
- output={"error": str(e)},
125
- is_error=True,
126
- )
127
-
@@ -1,46 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass
4
- from typing import Callable, Optional
5
-
6
- from onecode.agent.tools.permissions import PermissionResult
7
-
8
-
9
- @dataclass(frozen=True)
10
- class PermissionDecision:
11
- result: PermissionResult
12
- reason: str = ""
13
-
14
-
15
- PermissionHandler = Callable[[str, str, dict], PermissionDecision]
16
- """Signature: (tool_name: str, question: str, tool_input: dict) -> PermissionDecision"""
17
-
18
-
19
- class InteractivePermissionHandler:
20
- """Handles ASK-level permission requests from tools.
21
-
22
- Clawd-Code pattern: when a tool's check_permissions() returns ASK,
23
- the handler determines whether to allow or deny based on user input.
24
-
25
- The default implementation denies all ASK requests (fail-safe).
26
- Callers can provide a custom handler to prompt the user interactively.
27
- """
28
-
29
- def __init__(self, handler: Optional[PermissionHandler] = None) -> None:
30
- self._handler = handler
31
-
32
- def handle(
33
- self,
34
- tool_name: str,
35
- tool_input: dict,
36
- question: str = "",
37
- ) -> PermissionDecision:
38
- if self._handler is not None:
39
- return self._handler(tool_name, question, tool_input)
40
- return PermissionDecision(
41
- result=PermissionResult.DENY,
42
- reason="No interactive permission handler configured",
43
- )
44
-
45
- def __repr__(self) -> str:
46
- return f"InteractivePermissionHandler(handler={'set' if self._handler else 'None'})"