@scemoon/cdh 1.0.0

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 (528) hide show
  1. package/ai-dlc-skill/SKILL.md +75 -0
  2. package/ai-dlc-skill/agents/deliver-agent.md +24 -0
  3. package/ai-dlc-skill/agents/master.md +44 -0
  4. package/ai-dlc-skill/agents/plan-agent.md +23 -0
  5. package/ai-dlc-skill/agents/understand-agent.md +23 -0
  6. package/ai-dlc-skill/agents/verify-agent.md +27 -0
  7. package/ai-dlc-skill/architecture/project-structure.md +78 -0
  8. package/ai-dlc-skill/brownfield/README.md +30 -0
  9. package/ai-dlc-skill/brownfield/generate-context.sh +64 -0
  10. package/ai-dlc-skill/brownfield/scripts/deps.sh +27 -0
  11. package/ai-dlc-skill/brownfield/scripts/discover.sh +34 -0
  12. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +45 -0
  13. package/ai-dlc-skill/components/backend.md +34 -0
  14. package/ai-dlc-skill/components/desktop.md +30 -0
  15. package/ai-dlc-skill/components/mya.md +29 -0
  16. package/ai-dlc-skill/components/native.md +30 -0
  17. package/ai-dlc-skill/components/tta.md +29 -0
  18. package/ai-dlc-skill/components/web.md +31 -0
  19. package/ai-dlc-skill/components/wxa.md +29 -0
  20. package/ai-dlc-skill/contracts/README.md +25 -0
  21. package/ai-dlc-skill/core/adaptive-flow.md +36 -0
  22. package/ai-dlc-skill/core/security.md +29 -0
  23. package/ai-dlc-skill/cross-tool/cline/export.sh +31 -0
  24. package/ai-dlc-skill/cross-tool/copilot/export.sh +47 -0
  25. package/ai-dlc-skill/cross-tool/cursor/export.sh +32 -0
  26. package/ai-dlc-skill/cross-tool/export.sh +22 -0
  27. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +17 -0
  28. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +31 -0
  29. package/ai-dlc-skill/cross-tool/onecode/export.sh +48 -0
  30. package/ai-dlc-skill/phases/deliver/entry.md +26 -0
  31. package/ai-dlc-skill/phases/deliver/lifecycle.md +185 -0
  32. package/ai-dlc-skill/phases/deliver/prompt.md +40 -0
  33. package/ai-dlc-skill/phases/deliver/rules.md +61 -0
  34. package/ai-dlc-skill/phases/plan/entry.md +25 -0
  35. package/ai-dlc-skill/phases/plan/lifecycle.md +204 -0
  36. package/ai-dlc-skill/phases/plan/prompt.md +38 -0
  37. package/ai-dlc-skill/phases/plan/rules.md +25 -0
  38. package/ai-dlc-skill/phases/understand/entry.md +26 -0
  39. package/ai-dlc-skill/phases/understand/lifecycle.md +184 -0
  40. package/ai-dlc-skill/phases/understand/prompt.md +41 -0
  41. package/ai-dlc-skill/phases/understand/rules.md +37 -0
  42. package/ai-dlc-skill/phases/verify/entry.md +26 -0
  43. package/ai-dlc-skill/phases/verify/lifecycle.md +192 -0
  44. package/ai-dlc-skill/phases/verify/prompt.md +43 -0
  45. package/ai-dlc-skill/phases/verify/rules.md +73 -0
  46. package/ai-dlc-skill/practices/bdd.md +91 -0
  47. package/ai-dlc-skill/practices/sdd.md +84 -0
  48. package/ai-dlc-skill/practices/tdd.md +95 -0
  49. package/ai-dlc-skill/providers/README.md +114 -0
  50. package/ai-dlc-skill/providers/aliyun/deployment.yaml +66 -0
  51. package/ai-dlc-skill/providers/aliyun/preview.yaml +84 -0
  52. package/ai-dlc-skill/providers/aliyun/provider.yaml +160 -0
  53. package/ai-dlc-skill/providers/tcb/deployment.yaml +69 -0
  54. package/ai-dlc-skill/providers/tcb/preview.yaml +83 -0
  55. package/ai-dlc-skill/providers/tcb/provider.yaml +172 -0
  56. package/ai-dlc-skill/requirements.md +140 -0
  57. package/ai-dlc-skill/skill.yaml +147 -0
  58. package/ai-dlc-skill/templates/integration/CHANGELOG.md +41 -0
  59. package/ai-dlc-skill/templates/integration/asyncapi.yaml +43 -0
  60. package/ai-dlc-skill/templates/integration/contract-diff.md +63 -0
  61. package/ai-dlc-skill/templates/integration/contract-spec.md +49 -0
  62. package/ai-dlc-skill/templates/integration/openapi.yaml +18 -0
  63. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +36 -0
  64. package/ai-dlc-skill/templates/plan/design.md +49 -0
  65. package/ai-dlc-skill/templates/plan/task-list.md +32 -0
  66. package/ai-dlc-skill/templates/project/README.md +127 -0
  67. package/ai-dlc-skill/templates/project/template.md +119 -0
  68. package/ai-dlc-skill/templates/understand/feature.feature +23 -0
  69. package/ai-dlc-skill/templates/understand/intent.md +29 -0
  70. package/ai-dlc-skill/templates/understand/spec-delta.md +47 -0
  71. package/ai-dlc-skill/templates/verify/test-unit.py +27 -0
  72. package/ai-dlc-skill/walkthrough/collect.sh +50 -0
  73. package/ai-dlc-skill/walkthrough/template.md +54 -0
  74. package/ai-dlc-skill/workflows/ai-dlc.yaml +110 -0
  75. package/ai-dlc-skill/workflows/deployment.yaml +199 -0
  76. package/cdh/__init__.py +0 -0
  77. package/cdh/__main__.py +4 -0
  78. package/cdh/__pycache__/__init__.cpython-313.pyc +0 -0
  79. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/scaffold.cpython-313.pyc +0 -0
  82. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  83. package/cdh/cli.py +361 -0
  84. package/cdh/scaffold.py +312 -0
  85. package/cli.js +2 -0
  86. package/onecode/__init__.py +1 -0
  87. package/onecode/__main__.py +4 -0
  88. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  89. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  90. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  91. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  92. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  93. package/onecode/__pycache__/mock_data.cpython-314.pyc +0 -0
  94. package/onecode/agent/__init__.py +0 -0
  95. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  96. package/onecode/agent/__pycache__/cdh_agent_acp.cpython-313.pyc +0 -0
  97. package/onecode/agent/__pycache__/cdh_agent_acp.cpython-314.pyc +0 -0
  98. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  99. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  100. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  101. package/onecode/agent/__pycache__/harness_skill.cpython-314.pyc +0 -0
  102. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  103. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  104. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  105. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  106. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  107. package/onecode/agent/agents/__init__.py +29 -0
  108. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  109. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  110. package/onecode/agent/agents/types.py +662 -0
  111. package/onecode/agent/attachments.py +113 -0
  112. package/onecode/agent/cdh_loader.py +262 -0
  113. package/onecode/agent/context.py +338 -0
  114. package/onecode/agent/engine.py +1894 -0
  115. package/onecode/agent/hooks.py +86 -0
  116. package/onecode/agent/onecode_agent_acp.py +2203 -0
  117. package/onecode/agent/permissions.py +151 -0
  118. package/onecode/agent/permissions_store.py +62 -0
  119. package/onecode/agent/session.py +186 -0
  120. package/onecode/agent/snapshot.py +145 -0
  121. package/onecode/agent/tools/__init__.py +17 -0
  122. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  123. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  124. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  125. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  126. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  127. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  128. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  129. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  130. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  131. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  132. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  133. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/task_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/agent_tools.py +134 -0
  145. package/onecode/agent/tools/apply_patch_tool.py +144 -0
  146. package/onecode/agent/tools/bash_tool.py +91 -0
  147. package/onecode/agent/tools/communication_tools.py +149 -0
  148. package/onecode/agent/tools/config_tool.py +130 -0
  149. package/onecode/agent/tools/cron_tools.py +179 -0
  150. package/onecode/agent/tools/errors.py +17 -0
  151. package/onecode/agent/tools/file_ops.py +187 -0
  152. package/onecode/agent/tools/file_tools.py +226 -0
  153. package/onecode/agent/tools/git_tools.py +88 -0
  154. package/onecode/agent/tools/lsp_tools.py +404 -0
  155. package/onecode/agent/tools/mcp_tools.py +129 -0
  156. package/onecode/agent/tools/permission_handler.py +46 -0
  157. package/onecode/agent/tools/permissions.py +77 -0
  158. package/onecode/agent/tools/protocol.py +20 -0
  159. package/onecode/agent/tools/registry.py +134 -0
  160. package/onecode/agent/tools/sandbox.py +264 -0
  161. package/onecode/agent/tools/schema_validation.py +100 -0
  162. package/onecode/agent/tools/skill_tools.py +52 -0
  163. package/onecode/agent/tools/task_tools.py +249 -0
  164. package/onecode/agent/tools/web_tools.py +170 -0
  165. package/onecode/builtin_skills/git/SKILL.md +64 -0
  166. package/onecode/builtin_skills/git/skill.yaml +7 -0
  167. package/onecode/builtin_skills/shell/SKILL.md +58 -0
  168. package/onecode/builtin_skills/shell/skill.yaml +8 -0
  169. package/onecode/cli.py +755 -0
  170. package/onecode/cloud/__init__.py +0 -0
  171. package/onecode/cloud/base.py +20 -0
  172. package/onecode/codebase/__init__.py +69 -0
  173. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  174. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  175. package/onecode/codebase/__pycache__/config.cpython-314.pyc +0 -0
  176. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  177. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  178. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  179. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  180. package/onecode/codebase/chunker.py +130 -0
  181. package/onecode/codebase/indexer.py +136 -0
  182. package/onecode/codebase/retriever.py +192 -0
  183. package/onecode/codebase/storage.py +130 -0
  184. package/onecode/codebase/tools.py +59 -0
  185. package/onecode/commands.py +276 -0
  186. package/onecode/config.py +285 -0
  187. package/onecode/config_screen.py +594 -0
  188. package/onecode/cron/__init__.py +3 -0
  189. package/onecode/lsp/__init__.py +3 -0
  190. package/onecode/mcp/__init__.py +4 -0
  191. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  192. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  193. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  194. package/onecode/mcp/client.py +193 -0
  195. package/onecode/mcp/manager.py +191 -0
  196. package/onecode/memory/__init__.py +95 -0
  197. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  198. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  199. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  200. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  201. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  202. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  203. package/onecode/memory/backend.py +185 -0
  204. package/onecode/memory/offload.py +114 -0
  205. package/onecode/memory/pyramid.py +202 -0
  206. package/onecode/memory/recall.py +168 -0
  207. package/onecode/memory/symbolic.py +164 -0
  208. package/onecode/models/__init__.py +4 -0
  209. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  210. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  211. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  212. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  213. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  214. package/onecode/models/errors.py +94 -0
  215. package/onecode/models/messages.py +662 -0
  216. package/onecode/models/provider.py +450 -0
  217. package/onecode/models/providers/__init__.py +17 -0
  218. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  219. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  220. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  221. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  222. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  223. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  224. package/onecode/models/providers/__pycache__/mock_provider.cpython-314.pyc +0 -0
  225. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  226. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  227. package/onecode/models/providers/anthropic_provider.py +224 -0
  228. package/onecode/models/providers/deepseek_provider.py +210 -0
  229. package/onecode/models/providers/glm_provider.py +154 -0
  230. package/onecode/models/providers/minimax_provider.py +154 -0
  231. package/onecode/models/providers/minimaxi_provider.py +363 -0
  232. package/onecode/models/providers/ollama_provider.py +96 -0
  233. package/onecode/models/providers/openai_provider.py +233 -0
  234. package/onecode/models/registry.py +212 -0
  235. package/onecode/server/__init__.py +3 -0
  236. package/onecode/server/app.py +224 -0
  237. package/onecode/skills/__init__.py +11 -0
  238. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  239. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  240. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  241. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  242. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  243. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  244. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  245. package/onecode/skills/argument_substitution.py +39 -0
  246. package/onecode/skills/create.py +56 -0
  247. package/onecode/skills/frontmatter.py +33 -0
  248. package/onecode/skills/loader.py +157 -0
  249. package/onecode/skills/manager.py +75 -0
  250. package/onecode/skills/model.py +43 -0
  251. package/onecode/storage/__init__.py +0 -0
  252. package/onecode/storage/activity.py +64 -0
  253. package/onecode/storage/project.py +54 -0
  254. package/onecode/storage/session.py +113 -0
  255. package/onecode/tasks/__init__.py +26 -0
  256. package/onecode/tasks/manager.py +219 -0
  257. package/onecode/tasks/models.py +240 -0
  258. package/onecode/trace/__init__.py +0 -0
  259. package/onecode/trace/tracer.py +174 -0
  260. package/onecode/utils/__init__.py +0 -0
  261. package/onecode/utils/helpers.py +20 -0
  262. package/onecode-cli.js +2 -0
  263. package/package.json +32 -0
  264. package/pyproject.toml +60 -0
  265. package/run.js +86 -0
  266. package/tui/__init__.py +46 -0
  267. package/tui/__main__.py +4 -0
  268. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  269. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  270. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  271. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  272. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  273. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  274. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  275. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  276. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  277. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  278. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  279. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  288. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  289. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  308. package/tui/_loop.py +86 -0
  309. package/tui/_path_fuzzy_search.py +48 -0
  310. package/tui/_path_match.py +141 -0
  311. package/tui/about.py +95 -0
  312. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  313. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  314. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  315. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  316. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  317. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  318. package/tui/acp/agent.py +886 -0
  319. package/tui/acp/api.py +55 -0
  320. package/tui/acp/encode_tool_call_id.py +12 -0
  321. package/tui/acp/messages.py +190 -0
  322. package/tui/acp/prompt.py +110 -0
  323. package/tui/acp/protocol.py +462 -0
  324. package/tui/agent.py +70 -0
  325. package/tui/agent_schema.py +76 -0
  326. package/tui/agents.py +45 -0
  327. package/tui/ansi/__init__.py +1 -0
  328. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  329. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  330. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  331. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  332. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  333. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  334. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  335. package/tui/ansi/_ansi.py +1689 -0
  336. package/tui/ansi/_ansi_colors.py +264 -0
  337. package/tui/ansi/_control_codes.py +37 -0
  338. package/tui/ansi/_keys.py +251 -0
  339. package/tui/ansi/_sgr_styles.py +64 -0
  340. package/tui/ansi/_stream_parser.py +418 -0
  341. package/tui/answer.py +12 -0
  342. package/tui/app.py +1236 -0
  343. package/tui/atomic.py +37 -0
  344. package/tui/cli.py +313 -0
  345. package/tui/code_analyze.py +27 -0
  346. package/tui/complete.py +38 -0
  347. package/tui/constants.py +61 -0
  348. package/tui/conversation_markdown.py +30 -0
  349. package/tui/danger.py +372 -0
  350. package/tui/data/agents/ampcode.com.toml +51 -0
  351. package/tui/data/agents/augmentcode.com.toml +40 -0
  352. package/tui/data/agents/cdh.cloud-dev-harness.toml +22 -0
  353. package/tui/data/agents/claude.com.toml +41 -0
  354. package/tui/data/agents/copilot.github.com.toml +29 -0
  355. package/tui/data/agents/crowai.dev.toml +35 -0
  356. package/tui/data/agents/cursor.com.toml +38 -0
  357. package/tui/data/agents/deepagents.langchain.com +33 -0
  358. package/tui/data/agents/docker.com.toml +59 -0
  359. package/tui/data/agents/geminicli.com.toml +28 -0
  360. package/tui/data/agents/goose.ai.toml +51 -0
  361. package/tui/data/agents/inference.huggingface.co.toml +41 -0
  362. package/tui/data/agents/kimi.com.toml +35 -0
  363. package/tui/data/agents/kiro.dev.toml +42 -0
  364. package/tui/data/agents/openai.com.toml +53 -0
  365. package/tui/data/agents/openclaw.ai.toml +37 -0
  366. package/tui/data/agents/opencode.ai.toml +39 -0
  367. package/tui/data/agents/openhands.dev.toml +45 -0
  368. package/tui/data/agents/stakpak.dev.toml +61 -0
  369. package/tui/data/agents/vibe.mistral.ai.toml +30 -0
  370. package/tui/data/agents/vtcode.dev.toml +62 -0
  371. package/tui/data/images/frog.png +0 -0
  372. package/tui/data/sounds/question.wav +0 -0
  373. package/tui/data/sounds/turn-over.wav +0 -0
  374. package/tui/db.py +190 -0
  375. package/tui/dec.py +332 -0
  376. package/tui/directory.py +234 -0
  377. package/tui/directory_suggester.py +93 -0
  378. package/tui/directory_watcher.py +197 -0
  379. package/tui/format_path.py +25 -0
  380. package/tui/fuzzy.py +140 -0
  381. package/tui/fuzzy_index.py +275 -0
  382. package/tui/gist.py +33 -0
  383. package/tui/history.py +138 -0
  384. package/tui/jsonrpc.py +578 -0
  385. package/tui/menus.py +14 -0
  386. package/tui/message_log.py +69 -0
  387. package/tui/messages.py +139 -0
  388. package/tui/option_content.py +51 -0
  389. package/tui/os.py +0 -0
  390. package/tui/path_complete.py +217 -0
  391. package/tui/path_filter.py +124 -0
  392. package/tui/paths.py +71 -0
  393. package/tui/pill.py +23 -0
  394. package/tui/platform_commands.py +52 -0
  395. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  396. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  397. package/tui/prompt/extract.py +19 -0
  398. package/tui/prompt/resource.py +68 -0
  399. package/tui/protocol.py +28 -0
  400. package/tui/screens/__init__.py +0 -0
  401. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  402. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  403. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  404. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  405. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  406. package/tui/screens/__pycache__/settings.cpython-314.pyc +0 -0
  407. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  408. package/tui/screens/action_modal.py +94 -0
  409. package/tui/screens/agent_modal.py +175 -0
  410. package/tui/screens/command_edit_modal.py +74 -0
  411. package/tui/screens/log.py +553 -0
  412. package/tui/screens/main.py +411 -0
  413. package/tui/screens/main.tcss +655 -0
  414. package/tui/screens/permissions.py +404 -0
  415. package/tui/screens/permissions.tcss +72 -0
  416. package/tui/screens/projects.tcss +66 -0
  417. package/tui/screens/projects_app.py +319 -0
  418. package/tui/screens/projects_screen.py +142 -0
  419. package/tui/screens/session_resume_modal.py +172 -0
  420. package/tui/screens/session_resume_modal.tcss +35 -0
  421. package/tui/screens/sessions.py +166 -0
  422. package/tui/screens/sessions.tcss +119 -0
  423. package/tui/screens/settings.py +254 -0
  424. package/tui/screens/settings.tcss +101 -0
  425. package/tui/screens/store.py +500 -0
  426. package/tui/screens/store.tcss +274 -0
  427. package/tui/screens/tool_content_screen.py +59 -0
  428. package/tui/session_tracker.py +120 -0
  429. package/tui/settings.py +353 -0
  430. package/tui/settings_schema.py +431 -0
  431. package/tui/shell.py +304 -0
  432. package/tui/shell_read.py +42 -0
  433. package/tui/slash_command.py +34 -0
  434. package/tui/tui.tcss +246 -0
  435. package/tui/twitter.py +38 -0
  436. package/tui/version.py +80 -0
  437. package/tui/visuals/__init__.py +0 -0
  438. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  439. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  440. package/tui/visuals/columns.py +273 -0
  441. package/tui/widgets/__init__.py +0 -0
  442. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  443. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  444. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  445. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  446. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  447. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  448. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  449. package/tui/widgets/__pycache__/conversation.cpython-313.pyc +0 -0
  450. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  451. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  452. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  453. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  454. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  455. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  456. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  457. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  458. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  459. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  460. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  461. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  462. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  463. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  464. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/terminal.cpython-313.pyc +0 -0
  480. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/tool_call.cpython-313.pyc +0 -0
  483. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  485. package/tui/widgets/acp_content.py +70 -0
  486. package/tui/widgets/agent_response.py +77 -0
  487. package/tui/widgets/agent_thought.py +168 -0
  488. package/tui/widgets/ask_user.py +264 -0
  489. package/tui/widgets/command_pane.py +223 -0
  490. package/tui/widgets/condensed_path.py +115 -0
  491. package/tui/widgets/context_stats.py +66 -0
  492. package/tui/widgets/conversation.py +2441 -0
  493. package/tui/widgets/danger_warning.py +65 -0
  494. package/tui/widgets/diff_view.py +59 -0
  495. package/tui/widgets/directory_input.py +8 -0
  496. package/tui/widgets/flash.py +81 -0
  497. package/tui/widgets/future_text.py +126 -0
  498. package/tui/widgets/grid_select.py +234 -0
  499. package/tui/widgets/highlighted_textarea.py +180 -0
  500. package/tui/widgets/mandelbrot.py +294 -0
  501. package/tui/widgets/markdown_note.py +13 -0
  502. package/tui/widgets/menu.py +147 -0
  503. package/tui/widgets/modified_files.py +106 -0
  504. package/tui/widgets/non_selectable_label.py +5 -0
  505. package/tui/widgets/note.py +18 -0
  506. package/tui/widgets/path_search.py +492 -0
  507. package/tui/widgets/plan.py +263 -0
  508. package/tui/widgets/project_directory_tree.py +90 -0
  509. package/tui/widgets/project_grid_select.py +35 -0
  510. package/tui/widgets/project_summary.py +33 -0
  511. package/tui/widgets/prompt.py +795 -0
  512. package/tui/widgets/question.py +360 -0
  513. package/tui/widgets/session_grid_select.py +224 -0
  514. package/tui/widgets/session_summary.py +115 -0
  515. package/tui/widgets/session_tabs.py +188 -0
  516. package/tui/widgets/shell_result.py +35 -0
  517. package/tui/widgets/shell_terminal.py +40 -0
  518. package/tui/widgets/side_bar.py +114 -0
  519. package/tui/widgets/slash_complete.py +235 -0
  520. package/tui/widgets/strike_text.py +70 -0
  521. package/tui/widgets/subagent.py +87 -0
  522. package/tui/widgets/terminal.py +577 -0
  523. package/tui/widgets/terminal_tool.py +351 -0
  524. package/tui/widgets/throbber.py +100 -0
  525. package/tui/widgets/tool_call.py +368 -0
  526. package/tui/widgets/user_input.py +23 -0
  527. package/tui/widgets/version.py +5 -0
  528. package/tui/widgets/welcome.py +31 -0
@@ -0,0 +1,594 @@
1
+ from __future__ import annotations
2
+
3
+ from textual import on
4
+ from textual.app import App, ComposeResult
5
+ from textual.binding import Binding
6
+ from textual.containers import Horizontal, Vertical
7
+ from textual.reactive import var
8
+ from textual.screen import ModalScreen
9
+ from textual.widget import Widget
10
+ from textual.widgets import Button, Input, Label, Select, Static
11
+
12
+ from onecode.config import GlobalConfig, load_config, resolve_env, save_config
13
+
14
+ def _display_val(v: str | None) -> str:
15
+ if not v:
16
+ return "default"
17
+ resolved = resolve_env(v)
18
+ return resolved if resolved else v
19
+
20
+ def _truncate(s: str, max_len: int) -> str:
21
+ return s if len(s) <= max_len else s[:max_len-1] + "…"
22
+
23
+
24
+ SECTIONS = [
25
+ ("general", "General", "basic settings"),
26
+ ("providers", "Providers", "LLM provider config"),
27
+ ("agent", "Agent", "agent parameters"),
28
+ ("observability","Observability", "tracing & monitoring"),
29
+ ("attachments", "Attachments", "file attachment settings"),
30
+ ("model_auto", "Model Auto", "model selection hints"),
31
+ ("skills", "Skills", "skill management"),
32
+ ("mcps", "MCPs", "MCP server management"),
33
+ ]
34
+
35
+ PROVIDER_NAMES = {
36
+ "anthropic": "Anthropic", "openai": "OpenAI", "deepseek": "DeepSeek",
37
+ "minimax": "MiniMax", "minimaxi": "MiniMaxi", "glm": "GLM", "ollama": "Ollama",
38
+ }
39
+
40
+
41
+ class ConfigItem(Static, can_focus=True):
42
+ def __init__(self, key: str, label: str, value: str = "", item_type: str = "field"):
43
+ super().__init__()
44
+ self.key = key
45
+ self.label = label
46
+ self.value = value
47
+ self.item_type = item_type
48
+
49
+ def render(self) -> str:
50
+ if self.item_type in ("section", "provider", "skill", "mcp"):
51
+ return f"> {self.label:<18} {self.value}"
52
+ if self.item_type == "back":
53
+ return f"< {self.label}"
54
+ if self.item_type == "add_model":
55
+ return f" {self.label}"
56
+ return f" {self.label:<18} {_truncate(self.value, 36)}"
57
+
58
+
59
+ CSS = """
60
+ Screen {
61
+ align: center middle;
62
+ }
63
+
64
+ ConfigScreen {
65
+ background: #000;
66
+ }
67
+
68
+ #dialog {
69
+ width: 64;
70
+ height: 27;
71
+ background: #000;
72
+ border: solid #555;
73
+ }
74
+
75
+ #header {
76
+ height: 2;
77
+ background: #333;
78
+ content-align: center middle;
79
+ color: #fff;
80
+ text-style: bold;
81
+ }
82
+
83
+ #breadcrumb {
84
+ height: 1;
85
+ background: #222;
86
+ color: #aaa;
87
+ padding: 0 1;
88
+ }
89
+
90
+ #content {
91
+ width: 100%;
92
+ height: 1fr;
93
+ background: #000;
94
+ }
95
+
96
+ ConfigItem {
97
+ width: 100%;
98
+ height: 1;
99
+ padding: 0 1;
100
+ color: #fff;
101
+ background: #000;
102
+ }
103
+
104
+ ConfigItem:hover, ConfigItem.-focus {
105
+ background: #444;
106
+ }
107
+
108
+ #shortcuts {
109
+ height: 1;
110
+ background: #222;
111
+ color: #888;
112
+ padding: 0 1;
113
+ content-align: left middle;
114
+ }
115
+
116
+ #button-row {
117
+ height: 3;
118
+ background: #333;
119
+ align: center middle;
120
+ }
121
+
122
+ Button {
123
+ margin: 0 1;
124
+ }
125
+
126
+ Button:disabled {
127
+ color: #666;
128
+ }
129
+ """
130
+
131
+
132
+ class EditFieldScreen(ModalScreen[str]):
133
+ def __init__(self, field_label: str, current_value: str):
134
+ super().__init__()
135
+ self.field_label = field_label
136
+ self.current_value = current_value
137
+
138
+ BINDINGS = [
139
+ Binding("escape", "dismiss_modal", "Cancel"),
140
+ ]
141
+
142
+ CSS = """
143
+ EditFieldScreen { background: rgba(0,0,0,0.7); align: center middle; }
144
+ #edit-dialog { width: 50; height: 7; background: #111; border: solid #555; }
145
+ #edit-label { height: 1; background: #333; color: #fff; padding: 0 1; }
146
+ #edit-input { height: 3; padding: 0 1; }
147
+ #edit-buttons { height: 3; background: #222; align: center middle; }
148
+ Button { margin: 0 1; background: #444; color: #fff; }
149
+ Button:hover { background: #666; }
150
+ Button:focus { background: #555; }
151
+ """
152
+
153
+ def compose(self) -> ComposeResult:
154
+ with Vertical(id="edit-dialog"):
155
+ yield Label(f" {self.field_label}", id="edit-label")
156
+ yield Input(value=self.current_value, id="edit-input")
157
+ with Horizontal(id="edit-buttons"):
158
+ yield Button("Cancel", id="edit-cancel")
159
+ yield Button("Save", id="edit-save")
160
+
161
+ @on(Button.Pressed, "#edit-save")
162
+ def on_save(self) -> None:
163
+ self.dismiss(self.query_one("#edit-input", Input).value)
164
+
165
+ @on(Button.Pressed, "#edit-cancel")
166
+ def on_cancel(self) -> None:
167
+ self.dismiss(None)
168
+
169
+ @on(Input.Submitted)
170
+ def on_input_submitted(self) -> None:
171
+ self.dismiss(self.query_one("#edit-input", Input).value)
172
+
173
+ def action_dismiss_modal(self) -> None:
174
+ self.dismiss(None)
175
+
176
+
177
+ class OptionPickerScreen(ModalScreen[str]):
178
+ def __init__(self, field_label: str, options: list[tuple[str, str]], current_value: str):
179
+ super().__init__()
180
+ self.field_label = field_label
181
+ self.options = options
182
+ self.current_value = current_value
183
+ self._selected_index = 0
184
+
185
+ BINDINGS = [
186
+ Binding("escape", "dismiss_modal", "Cancel"),
187
+ Binding("up", "cursor_up", "Up"),
188
+ Binding("down", "cursor_down", "Down"),
189
+ Binding("enter", "confirm", "Confirm"),
190
+ ]
191
+
192
+ CSS = """
193
+ OptionPickerScreen { background: rgba(0,0,0,0.7); align: center middle; }
194
+ #picker-dialog { width: 50; height: auto; background: #111; border: solid #555; max-height: 20; }
195
+ #picker-label { height: 1; background: #333; color: #fff; padding: 0 1; }
196
+ #picker-list { height: auto; max-height: 15; background: #000; }
197
+ .option-item { height: 1; padding: 0 1; color: #fff; background: #000; }
198
+ .option-item:hover, .option-item.selected { background: #444; }
199
+ #picker-buttons { height: 3; background: #222; align: center middle; }
200
+ Button { margin: 0 1; background: #444; color: #fff; }
201
+ Button:hover { background: #666; }
202
+ Button:focus { background: #555; }
203
+ """
204
+
205
+ def compose(self) -> ComposeResult:
206
+ with Vertical(id="picker-dialog"):
207
+ yield Label(f" {self.field_label}", id="picker-label")
208
+ with Vertical(id="picker-list"):
209
+ pass
210
+ with Horizontal(id="picker-buttons"):
211
+ yield Button("Cancel (ESC)", id="picker-cancel")
212
+ yield Button("Confirm (ENTER)", id="picker-confirm")
213
+
214
+ def on_mount(self) -> None:
215
+ list_container = self.query_one("#picker-list", Vertical)
216
+ for i, (label, val) in enumerate(self.options):
217
+ is_selected = (val == self.current_value) or (self.current_value is None and i == 0)
218
+ if is_selected:
219
+ self._selected_index = i
220
+ item = Static(f" {'>' if is_selected else ' '}{label}", classes="option-item")
221
+ item._option_index = i
222
+ list_container.mount(item)
223
+ self.query_one("#picker-confirm", Button).focus()
224
+
225
+ def _refresh_list(self) -> None:
226
+ list_container = self.query_one("#picker-list", Vertical)
227
+ for i, item in enumerate(list_container.children):
228
+ if isinstance(item, Static):
229
+ label = self.options[i][0]
230
+ marker = ">" if i == self._selected_index else " "
231
+ item.update(f" {marker}{label}")
232
+
233
+ def action_cursor_up(self) -> None:
234
+ if self._selected_index > 0:
235
+ self._selected_index -= 1
236
+ self._refresh_list()
237
+
238
+ def action_cursor_down(self) -> None:
239
+ if self._selected_index < len(self.options) - 1:
240
+ self._selected_index += 1
241
+ self._refresh_list()
242
+
243
+ def action_confirm(self) -> None:
244
+ _, val = self.options[self._selected_index]
245
+ self.dismiss(val)
246
+
247
+ @on(Button.Pressed, "#picker-confirm")
248
+ def on_confirm_button(self) -> None:
249
+ self.action_confirm()
250
+
251
+ @on(Button.Pressed, "#picker-cancel")
252
+ def on_cancel(self) -> None:
253
+ self.dismiss(None)
254
+
255
+ def action_dismiss_modal(self) -> None:
256
+ self.dismiss(None)
257
+
258
+
259
+ class ConfigScreen(App):
260
+ TITLE = "CDH Configuration"
261
+ CSS = CSS
262
+
263
+ BINDINGS = [
264
+ Binding("up", "cursor_up", "Up", show=False),
265
+ Binding("down", "cursor_down", "Down", show=False),
266
+ Binding("left", "go_back", "Back"),
267
+ Binding("right", "go_enter", "Select"),
268
+ Binding("enter", "confirm", "Confirm"),
269
+ Binding("escape", "cancel", "Cancel"),
270
+ Binding("ctrl+q", "quit_app", "Quit"),
271
+ ]
272
+
273
+ MODE_OPTIONS = [
274
+ ("Build", "build"),
275
+ ("Plan", "plan"),
276
+ ("Solo", "solo"),
277
+ ]
278
+
279
+ LOG_LEVELS = ["debug", "info", "warn", "error"]
280
+
281
+ cursor: var[int] = var(0)
282
+ view: var[str] = var("menu")
283
+ section_items: list[ConfigItem] = var(list)
284
+
285
+ def __init__(self):
286
+ super().__init__()
287
+ self._cfg: GlobalConfig = load_config()
288
+ self._breadcrumb = ["Menu"]
289
+ self._current_section: str | None = None
290
+ self._section_fields: list[ConfigItem] = []
291
+ self._current_provider: str | None = None
292
+
293
+ @property
294
+ def current_items(self) -> list[ConfigItem]:
295
+ return self._section_fields if self.view in ("section", "provider") else list(self.section_items)
296
+
297
+ def compose(self) -> ComposeResult:
298
+ with Vertical(id="dialog"):
299
+ yield Static("CDH Configuration", id="header")
300
+ yield Label("Menu", id="breadcrumb")
301
+ with Widget(id="content"):
302
+ pass
303
+ yield Label("", id="shortcuts")
304
+ with Horizontal(id="button-row"):
305
+ yield Button("Confirm (↵)", id="save")
306
+ yield Button("Cancel (ESC)", id="cancel")
307
+ yield Button("Quit (Ctrl+Q)", id="quit")
308
+
309
+ def on_mount(self) -> None:
310
+ self._build_menu()
311
+ self._refresh_items()
312
+
313
+ def _build_menu(self) -> None:
314
+ self.section_items = [
315
+ ConfigItem(sid, label, hint, item_type="section")
316
+ for sid, label, hint in SECTIONS
317
+ ]
318
+ self.cursor = 0
319
+
320
+ def _build_section(self, section_id: str) -> None:
321
+ self._section_fields = [
322
+ ConfigItem("__back__", "Back to Menu", item_type="back")
323
+ ]
324
+
325
+ cfg = self._cfg
326
+ match section_id:
327
+ case "general":
328
+ self._section_fields.append(ConfigItem("default_mode", "Mode", cfg.default_mode))
329
+ self._section_fields.append(ConfigItem("default_provider", "Provider", cfg.default_provider))
330
+ self._section_fields.append(ConfigItem("default_model", "Model", cfg.default_model))
331
+ self._section_fields.append(ConfigItem("log_level", "Log", cfg.log_level))
332
+ case "providers":
333
+ for pid, pcfg in cfg.providers.items():
334
+ n_models = len(pcfg.models)
335
+ ak = _truncate(_display_val(pcfg.api_key), 24)
336
+ ep = _truncate(_display_val(pcfg.endpoint), 20)
337
+ status = f"ep:{ep} ak:{ak}"
338
+ self._section_fields.append(ConfigItem(pid, PROVIDER_NAMES.get(pid, pid), status, item_type="provider"))
339
+ case "agent":
340
+ self._section_fields.append(ConfigItem("agent.max_iterations", "Max Iter", str(cfg.agent.max_iterations)))
341
+ self._section_fields.append(ConfigItem("agent.timeout_seconds", "Timeout", str(cfg.agent.timeout_seconds)))
342
+ case "observability":
343
+ self._section_fields.append(ConfigItem("observability.trace_dir", "Trace Dir", cfg.observability.trace_dir))
344
+ case "attachments":
345
+ self._section_fields.append(ConfigItem("attachments.max_size_mb", "Max Size", str(cfg.attachments.max_size_mb)))
346
+ case "model_auto":
347
+ self._section_fields.append(ConfigItem("model_auto.simple_tasks", "Simple", cfg.model_auto.simple_tasks))
348
+ case "skills":
349
+ from onecode.skills.manager import SkillManager
350
+ mgr = SkillManager()
351
+ for s in mgr.list():
352
+ status = "[enabled]" if s.get("enabled", True) else "[disabled]"
353
+ self._section_fields.append(ConfigItem(f"skills.{s['name']}", s["name"], status, item_type="skill"))
354
+ case "mcps":
355
+ from onecode.mcp.manager import MCPManager
356
+ mgr = MCPManager()
357
+ for m in mgr.list():
358
+ status = "[enabled]" if m.get("enabled", True) else "[disabled]"
359
+ transport = m.get("transport", "sse")
360
+ self._section_fields.append(ConfigItem(f"mcps.{m['name']}", m["name"], f"{status} ({transport})", item_type="mcp"))
361
+ self.cursor = 0
362
+
363
+ def _build_provider(self, provider_id: str) -> None:
364
+ self._section_fields = [
365
+ ConfigItem("__back__", "Back to Providers", item_type="back")
366
+ ]
367
+ pcfg = self._cfg.providers.get(provider_id)
368
+ if pcfg:
369
+ self._section_fields.append(ConfigItem(f"{provider_id}.api_key", "API Key", _display_val(pcfg.api_key)))
370
+ self._section_fields.append(ConfigItem(f"{provider_id}.endpoint", "Endpoint", _display_val(pcfg.endpoint)))
371
+ for i, m in enumerate(pcfg.models):
372
+ self._section_fields.append(ConfigItem(f"{provider_id}.models.{i}", "Model", m))
373
+ self._section_fields.append(ConfigItem("__add_model__", "+ Add Model", item_type="add_model"))
374
+ self.cursor = 0
375
+
376
+ def _update_shortcuts(self) -> None:
377
+ label = self.query_one("#shortcuts", Label)
378
+ if self.view == "menu":
379
+ label.update("")
380
+ elif self.view == "provider":
381
+ label.update("← Back to Providers ↵ Confirm")
382
+ else:
383
+ label.update("← Back to Menu → Select ↵ Confirm")
384
+
385
+ def _refresh_items(self) -> None:
386
+ content = self.query_one("#content", Widget)
387
+ content.remove_children()
388
+ for item in self.current_items:
389
+ content.mount(item)
390
+ self.query_one("#breadcrumb", Label).update(" / ".join(self._breadcrumb))
391
+ self._update_shortcuts()
392
+ self._clamp_cursor()
393
+
394
+ def _clamp_cursor(self) -> None:
395
+ items = self.current_items
396
+ if items:
397
+ self.cursor = max(0, min(self.cursor, len(items) - 1))
398
+ self._highlight_cursor()
399
+ items[self.cursor].focus()
400
+
401
+ def _highlight_cursor(self) -> None:
402
+ for i, item in enumerate(self.current_items):
403
+ item.set_class(i == self.cursor, "-focus")
404
+
405
+ def action_cursor_up(self) -> None:
406
+ items = self.current_items
407
+ if not items:
408
+ return
409
+ self.cursor = max(0, self.cursor - 1)
410
+ self._highlight_cursor()
411
+ items[self.cursor].focus()
412
+
413
+ def action_cursor_down(self) -> None:
414
+ items = self.current_items
415
+ if not items:
416
+ return
417
+ self.cursor = min(len(items) - 1, self.cursor + 1)
418
+ self._highlight_cursor()
419
+ items[self.cursor].focus()
420
+
421
+ def action_go_back(self) -> None:
422
+ if self.view == "provider":
423
+ self.view = "section"
424
+ self._breadcrumb = ["Menu", "Providers"]
425
+ self._current_provider = None
426
+ self._build_section(self._current_section or "providers")
427
+ self._refresh_items()
428
+ elif self.view == "section":
429
+ self.view = "menu"
430
+ self._breadcrumb = ["Menu"]
431
+ self._current_section = None
432
+ self.cursor = 0
433
+ self._build_menu()
434
+ self._refresh_items()
435
+
436
+ def action_go_enter(self) -> None:
437
+ self._activate_current()
438
+
439
+ def action_confirm(self) -> None:
440
+ self._activate_current()
441
+
442
+ def _edit_field(self, item: ConfigItem) -> None:
443
+ key = item.key
444
+ label = item.label
445
+ options = self._get_enum_options(key)
446
+ if options is not None:
447
+ val = item.value if any(v == item.value for _, v in options) else options[0][1]
448
+ self.push_screen(OptionPickerScreen(label, options, val), lambda v, k=key: self._on_field_edited(v, k))
449
+ else:
450
+ self.push_screen(EditFieldScreen(label, item.value), lambda v, k=key: self._on_field_edited(v, k))
451
+
452
+ def _get_enum_options(self, key: str) -> list[tuple[str, str]] | None:
453
+ if key == "default_mode":
454
+ return self.MODE_OPTIONS
455
+ if key == "log_level":
456
+ return [(v, v) for v in self.LOG_LEVELS]
457
+ if key == "default_provider":
458
+ pids = list(self._cfg.providers.keys())
459
+ return [(PROVIDER_NAMES.get(v, v), v) for v in pids]
460
+ if key == "default_model":
461
+ pcfg = self._cfg.providers.get(self._cfg.default_provider)
462
+ if pcfg and pcfg.models:
463
+ return [(m, m) for m in pcfg.models]
464
+ return None
465
+
466
+ def _apply_field_value(self, key: str, value: str) -> None:
467
+ parts = key.split(".")
468
+ if len(parts) == 1:
469
+ setattr(self._cfg, parts[0], value)
470
+ elif len(parts) == 2:
471
+ parent = getattr(self._cfg, parts[0], None)
472
+ if parent is not None:
473
+ setattr(parent, parts[1], value)
474
+ elif parts[0] in self._cfg.providers:
475
+ setattr(self._cfg.providers[parts[0]], parts[1], value)
476
+ elif parts[0] in self._cfg.clouds:
477
+ setattr(self._cfg.clouds[parts[0]], parts[1], value)
478
+ elif len(parts) == 3 and parts[0] == "providers":
479
+ pcfg = self._cfg.providers.get(parts[1])
480
+ if pcfg:
481
+ setattr(pcfg, parts[2], value)
482
+ elif len(parts) == 3 and parts[0] == "clouds":
483
+ ccfg = self._cfg.clouds.get(parts[1])
484
+ if ccfg:
485
+ setattr(ccfg, parts[2], value)
486
+
487
+ def _on_field_edited(self, value: str | None, key: str = "") -> None:
488
+ if value is None:
489
+ return
490
+ self._apply_field_value(key, value)
491
+ for item in self.current_items:
492
+ if item.key == key:
493
+ item.value = value
494
+ if item.item_type == "field":
495
+ item.refresh()
496
+ break
497
+ save_config(self._cfg)
498
+
499
+ def _on_model_added(self, value: str | None) -> None:
500
+ if not value or not self._current_provider:
501
+ return
502
+ pcfg = self._cfg.providers.get(self._current_provider)
503
+ if pcfg:
504
+ pcfg.models.append(value)
505
+ save_config(self._cfg)
506
+ self._build_provider(self._current_provider)
507
+ self.cursor = len(self._section_fields) - 1
508
+ self._refresh_items()
509
+
510
+ def _toggle_skill(self, item: ConfigItem) -> None:
511
+ parts = item.key.split(".", 1)
512
+ if len(parts) < 2:
513
+ return
514
+ name = parts[1]
515
+ from onecode.skills.manager import SkillManager
516
+ mgr = SkillManager()
517
+ skill = mgr.get(name)
518
+ if skill:
519
+ new_enabled = not skill.get("enabled", True)
520
+ mgr.enable(name, new_enabled)
521
+ item.value = "[enabled]" if new_enabled else "[disabled]"
522
+ item.refresh()
523
+
524
+ def _toggle_mcp(self, item: ConfigItem) -> None:
525
+ parts = item.key.split(".", 1)
526
+ if len(parts) < 2:
527
+ return
528
+ name = parts[1]
529
+ from onecode.mcp.manager import MCPManager
530
+ mgr = MCPManager()
531
+ mcp = mgr.get(name)
532
+ if mcp:
533
+ new_enabled = not mcp.get("enabled", True)
534
+ mgr.enable(name, new_enabled)
535
+ transport = mcp.get("transport", "sse")
536
+ item.value = f"[{'enabled' if new_enabled else 'disabled'}] ({transport})"
537
+ item.refresh()
538
+
539
+ def _activate_current(self) -> None:
540
+ items = self.current_items
541
+ if not items or self.cursor >= len(items):
542
+ return
543
+ item = items[self.cursor]
544
+ if item.item_type == "section":
545
+ self.view = "section"
546
+ self._current_section = item.key
547
+ self._breadcrumb = ["Menu", item.label]
548
+ self._build_section(item.key)
549
+ self.cursor = 0
550
+ self._refresh_items()
551
+ elif item.item_type == "provider":
552
+ self.view = "provider"
553
+ self._current_provider = item.key
554
+ self._breadcrumb = ["Menu", "Providers", item.label]
555
+ self._build_provider(item.key)
556
+ self.cursor = 0
557
+ self._refresh_items()
558
+ elif item.item_type == "field":
559
+ self._edit_field(item)
560
+ elif item.item_type == "add_model":
561
+ self.push_screen(EditFieldScreen("Model Name", ""), self._on_model_added)
562
+ elif item.item_type == "back":
563
+ self.action_go_back()
564
+ elif item.item_type == "skill":
565
+ self._toggle_skill(item)
566
+ elif item.item_type == "mcp":
567
+ self._toggle_mcp(item)
568
+
569
+ def action_cancel(self) -> None:
570
+ if self.view != "menu":
571
+ self.action_go_back()
572
+
573
+ def action_quit_app(self) -> None:
574
+ self.exit()
575
+
576
+ def _on_click(self, event) -> None:
577
+ pass
578
+
579
+ @on(Button.Pressed, "#save")
580
+ def on_save(self) -> None:
581
+ self.notify("Configuration saved")
582
+ self.exit()
583
+
584
+ @on(Button.Pressed, "#cancel")
585
+ def on_cancel_button(self) -> None:
586
+ self.exit()
587
+
588
+ @on(Button.Pressed, "#quit")
589
+ def on_quit(self) -> None:
590
+ self.exit()
591
+
592
+
593
+ def main() -> None:
594
+ ConfigScreen().run()
@@ -0,0 +1,3 @@
1
+ from onecode.agent.tools.cron_tools import CronScheduler, CronJob, CronCreateTool, CronListTool, CronRemoveTool
2
+
3
+ __all__ = ["CronScheduler", "CronJob", "CronCreateTool", "CronListTool", "CronRemoveTool"]
@@ -0,0 +1,3 @@
1
+ from onecode.agent.tools.lsp_tools import LSPServer, LSPTool
2
+
3
+ __all__ = ["LSPServer", "LSPTool"]
@@ -0,0 +1,4 @@
1
+ from onecode.mcp.client import MCPClient, MCPTool, MCPResource
2
+ from onecode.mcp.manager import MCPManager, MCPSSEClient
3
+
4
+ __all__ = ["MCPClient", "MCPTool", "MCPResource", "MCPManager", "MCPSSEClient"]