@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,662 @@
1
+ from __future__ import annotations
2
+
3
+ import fnmatch
4
+ import re
5
+ from dataclasses import dataclass, field
6
+ from enum import Enum
7
+ from typing import Optional
8
+
9
+
10
+ class AgentMode(Enum):
11
+ PRIMARY = "primary"
12
+ SUBAGENT = "subagent"
13
+ ALL = "all"
14
+
15
+
16
+ class AgentPermission(Enum):
17
+ ALLOW = "allow"
18
+ ASK = "ask"
19
+ DENY = "deny"
20
+
21
+
22
+ @dataclass
23
+ class ToolConfig:
24
+ name: str
25
+ permission: AgentPermission = AgentPermission.ALLOW
26
+ patterns: list[str] = field(default_factory=list)
27
+
28
+
29
+ @dataclass
30
+ class AgentConfig:
31
+ name: str
32
+ description: str = ""
33
+ mode: AgentMode = AgentMode.PRIMARY
34
+ temperature: float = 0.3
35
+ top_p: Optional[float] = None
36
+ model: Optional[str] = None
37
+ max_turns: int = 0
38
+ steps: int = 0
39
+ hidden: bool = False
40
+ color: str = ""
41
+ permission_edit: AgentPermission = AgentPermission.ALLOW
42
+ permission_bash: AgentPermission = AgentPermission.ALLOW
43
+ permission_read: AgentPermission = AgentPermission.ALLOW
44
+ permission_webfetch: AgentPermission = AgentPermission.ALLOW
45
+ permission_websearch: AgentPermission = AgentPermission.DENY
46
+ permission_task: AgentPermission = AgentPermission.ALLOW
47
+ permission_doom_loop: AgentPermission = AgentPermission.ASK
48
+ permission_skill: AgentPermission = AgentPermission.ALLOW
49
+ permission_lsp: AgentPermission = AgentPermission.ALLOW
50
+ permission_question: AgentPermission = AgentPermission.ALLOW
51
+ permission_external_directory: AgentPermission = AgentPermission.DENY
52
+ permission_glob: AgentPermission = AgentPermission.ALLOW
53
+ permission_grep: AgentPermission = AgentPermission.ALLOW
54
+ permission_list: AgentPermission = AgentPermission.ALLOW
55
+ permission_todowrite: AgentPermission = AgentPermission.ALLOW
56
+ tools: list[str] = field(default_factory=list)
57
+ disallowed_tools: list[str] = field(default_factory=list)
58
+ prompt_file: str = ""
59
+ bash_permissions: dict[str, str] = field(default_factory=dict)
60
+
61
+ def get_tools_config(self) -> dict[str, AgentPermission]:
62
+ return {
63
+ "edit": self.permission_edit,
64
+ "bash": self.permission_bash,
65
+ "read": self.permission_read,
66
+ "webfetch": self.permission_webfetch,
67
+ "websearch": self.permission_websearch,
68
+ "task": self.permission_task,
69
+ "lsp": self.permission_lsp,
70
+ "skill": self.permission_skill,
71
+ "question": self.permission_question,
72
+ "glob": self.permission_glob,
73
+ "grep": self.permission_grep,
74
+ "list": self.permission_list,
75
+ "todowrite": self.permission_todowrite,
76
+ "external_directory": self.permission_external_directory,
77
+ "doom_loop": self.permission_doom_loop,
78
+ }
79
+
80
+ def should_ask_for_edit(self) -> bool:
81
+ return self.permission_edit == AgentPermission.ASK
82
+
83
+ def should_ask_for_bash(self) -> bool:
84
+ return self.permission_bash == AgentPermission.ASK
85
+
86
+ def tool_allowed(self, tool_name: str) -> bool:
87
+ if self.tools:
88
+ return tool_name in self.tools
89
+ if self.disallowed_tools:
90
+ return tool_name not in self.disallowed_tools
91
+ return True
92
+
93
+ def get_bash_permission(self, command: str) -> AgentPermission:
94
+ for pattern, action in self.bash_permissions.items():
95
+ if fnmatch.fnmatch(command, pattern) or fnmatch.fnmatch(command.split()[0] if command.split() else "", pattern):
96
+ if action == "allow":
97
+ return AgentPermission.ALLOW
98
+ elif action == "ask":
99
+ return AgentPermission.ASK
100
+ elif action == "deny":
101
+ return AgentPermission.DENY
102
+ return self.permission_bash
103
+
104
+ def get_effective_max_turns(self) -> int:
105
+ if self.steps > 0:
106
+ return min(self.steps, self.max_turns) if self.max_turns > 0 else self.steps
107
+ return self.max_turns
108
+
109
+ def is_hidden(self) -> bool:
110
+ return self.hidden
111
+
112
+
113
+ class BuildAgent(AgentConfig):
114
+ def __init__(self):
115
+ super().__init__(
116
+ name="build",
117
+ description="Full development agent with all tools enabled. Edits and shell commands require user approval. Uses CoT reasoning + ReAct loop with Task-first delegation.",
118
+ mode=AgentMode.PRIMARY,
119
+ permission_edit=AgentPermission.ASK,
120
+ permission_bash=AgentPermission.ASK,
121
+ permission_read=AgentPermission.ALLOW,
122
+ permission_webfetch=AgentPermission.ALLOW,
123
+ permission_websearch=AgentPermission.ALLOW,
124
+ max_turns=10,
125
+ steps=0,
126
+ tools=[],
127
+ )
128
+
129
+
130
+ class PlanAgent(AgentConfig):
131
+ def __init__(self):
132
+ super().__init__(
133
+ name="plan",
134
+ description="Plan mode: CoT + ReAct (思考→行动→观察) agent with hard plan gate and Task-first delegation. Creates task plans first, presents for user review, then delegates execution via Task subagents with Human-in-the-loop.",
135
+ mode=AgentMode.PRIMARY,
136
+ permission_edit=AgentPermission.ASK,
137
+ permission_bash=AgentPermission.ASK,
138
+ permission_read=AgentPermission.ALLOW,
139
+ permission_webfetch=AgentPermission.ALLOW,
140
+ permission_websearch=AgentPermission.ALLOW,
141
+ max_turns=20,
142
+ temperature=0.2,
143
+ tools=[],
144
+ )
145
+
146
+
147
+ class SoloAgent(AgentConfig):
148
+ def __init__(self):
149
+ super().__init__(
150
+ name="solo",
151
+ description="Independent agent that plans first, then acts with full tool access. Uses CoT reasoning + ReAct loop with Task-first delegation. Shell commands require user approval.",
152
+ mode=AgentMode.PRIMARY,
153
+ permission_edit=AgentPermission.ALLOW,
154
+ permission_bash=AgentPermission.ASK,
155
+ permission_read=AgentPermission.ALLOW,
156
+ permission_webfetch=AgentPermission.ALLOW,
157
+ permission_websearch=AgentPermission.ALLOW,
158
+ max_turns=10,
159
+ temperature=0.3,
160
+ tools=[],
161
+ )
162
+
163
+
164
+ class GeneralAgent(AgentConfig):
165
+ def __init__(self):
166
+ super().__init__(
167
+ name="general",
168
+ description="General-purpose subagent for complex multi-step tasks. Executes focused work delegated by parent agent via Task tool. Uses CoT + ReAct internally.",
169
+ mode=AgentMode.SUBAGENT,
170
+ permission_edit=AgentPermission.ALLOW,
171
+ permission_bash=AgentPermission.ALLOW,
172
+ permission_read=AgentPermission.ALLOW,
173
+ permission_todowrite=AgentPermission.DENY,
174
+ tools=[],
175
+ )
176
+
177
+
178
+ class ExploreAgent(AgentConfig):
179
+ def __init__(self):
180
+ super().__init__(
181
+ name="explore",
182
+ description="Fast read-only agent for exploring codebases",
183
+ mode=AgentMode.SUBAGENT,
184
+ permission_edit=AgentPermission.DENY,
185
+ permission_bash=AgentPermission.DENY,
186
+ permission_read=AgentPermission.ALLOW,
187
+ hidden=True,
188
+ tools=[],
189
+ )
190
+
191
+
192
+ class ScoutAgent(AgentConfig):
193
+ def __init__(self):
194
+ super().__init__(
195
+ name="scout",
196
+ description="Read-only agent for external docs and dependency research",
197
+ mode=AgentMode.SUBAGENT,
198
+ permission_edit=AgentPermission.DENY,
199
+ permission_bash=AgentPermission.DENY,
200
+ permission_read=AgentPermission.ALLOW,
201
+ permission_webfetch=AgentPermission.ALLOW,
202
+ permission_websearch=AgentPermission.ALLOW,
203
+ hidden=True,
204
+ tools=[],
205
+ )
206
+
207
+
208
+ class CompactionAgent(AgentConfig):
209
+ def __init__(self):
210
+ super().__init__(
211
+ name="compaction",
212
+ description="System agent that compacts long context into a smaller summary",
213
+ mode=AgentMode.PRIMARY,
214
+ permission_edit=AgentPermission.DENY,
215
+ permission_bash=AgentPermission.DENY,
216
+ permission_read=AgentPermission.ALLOW,
217
+ permission_webfetch=AgentPermission.DENY,
218
+ permission_websearch=AgentPermission.DENY,
219
+ permission_task=AgentPermission.DENY,
220
+ permission_skill=AgentPermission.DENY,
221
+ hidden=True,
222
+ temperature=0.1,
223
+ tools=["read"],
224
+ )
225
+
226
+
227
+ class TitleAgent(AgentConfig):
228
+ def __init__(self):
229
+ super().__init__(
230
+ name="title",
231
+ description="System agent that generates short session titles",
232
+ mode=AgentMode.PRIMARY,
233
+ permission_edit=AgentPermission.DENY,
234
+ permission_bash=AgentPermission.DENY,
235
+ permission_read=AgentPermission.ALLOW,
236
+ permission_webfetch=AgentPermission.DENY,
237
+ permission_websearch=AgentPermission.DENY,
238
+ permission_task=AgentPermission.DENY,
239
+ permission_skill=AgentPermission.DENY,
240
+ hidden=True,
241
+ temperature=0.1,
242
+ max_turns=1,
243
+ tools=["read"],
244
+ )
245
+
246
+
247
+ class SummaryAgent(AgentConfig):
248
+ def __init__(self):
249
+ super().__init__(
250
+ name="summary",
251
+ description="System agent that creates session summaries",
252
+ mode=AgentMode.PRIMARY,
253
+ permission_edit=AgentPermission.DENY,
254
+ permission_bash=AgentPermission.DENY,
255
+ permission_read=AgentPermission.ALLOW,
256
+ permission_webfetch=AgentPermission.DENY,
257
+ permission_websearch=AgentPermission.DENY,
258
+ permission_task=AgentPermission.DENY,
259
+ permission_skill=AgentPermission.DENY,
260
+ hidden=True,
261
+ temperature=0.1,
262
+ max_turns=2,
263
+ tools=["read"],
264
+ )
265
+
266
+
267
+ BUILT_IN_AGENTS = {
268
+ "build": BuildAgent,
269
+ "plan": PlanAgent,
270
+ "solo": SoloAgent,
271
+ "general": GeneralAgent,
272
+ "explore": ExploreAgent,
273
+ "scout": ScoutAgent,
274
+ "compaction": CompactionAgent,
275
+ "title": TitleAgent,
276
+ "summary": SummaryAgent,
277
+ }
278
+
279
+
280
+ def create_agent(agent_type: str) -> AgentConfig:
281
+ agent_cls = BUILT_IN_AGENTS.get(agent_type)
282
+ if agent_cls:
283
+ return agent_cls()
284
+ return BuildAgent()
285
+
286
+
287
+ def get_agent_by_name(name: str) -> Optional[AgentConfig]:
288
+ agent_cls = BUILT_IN_AGENTS.get(name)
289
+ if agent_cls:
290
+ return agent_cls()
291
+ return None
292
+
293
+
294
+ def get_system_prompt(agent_type: str) -> str:
295
+ agent = create_agent(agent_type)
296
+ lines = [
297
+ f"You are {agent.name}.",
298
+ agent.description,
299
+ ]
300
+
301
+ if agent.should_ask_for_edit():
302
+ lines.append("- File edits require user approval")
303
+ if agent.should_ask_for_bash():
304
+ lines.append("- Shell commands require user approval")
305
+
306
+ return "\n".join(lines)
307
+
308
+
309
+ TOOL_DESCRIPTIONS = """
310
+ ## Available Tools
311
+
312
+ ### Tool Call Format (REQUIRED)
313
+
314
+ To call one or more tools in a single assistant turn, emit the structured
315
+ ``<minimax:tool_call>`` block. Each tool call goes inside an
316
+ ``<invoke name="ToolName">`` element with one or more
317
+ ``<parameter name="arg">value</parameter>`` children. You may put multiple
318
+ ``<invoke>`` blocks inside a single ``<minimax:tool_call>`` to run them in
319
+ parallel.
320
+
321
+ ```xml
322
+ <minimax:tool_call>
323
+ <invoke name="Read">
324
+ <parameter name="path">SPEC.md</parameter>
325
+ </invoke>
326
+ <invoke name="Bash">
327
+ <parameter name="command">ls -la</parameter>
328
+ <parameter name="timeout">30</parameter>
329
+ </invoke>
330
+ </minimax:tool_call>
331
+ ```
332
+
333
+ Rules:
334
+ - The outer wrapper is **always** ``<minimax:tool_call>...</minimax:tool_call>``.
335
+ - Parameter values are written **inline** (no JSON encoding).
336
+ - Escape only the five XML predefined entities: ``&lt;`` ``&gt;`` ``&amp;``
337
+ ``&quot;`` ``&apos;`` — do not invent new escapes.
338
+ - You may emit multiple tool calls in one block; the engine will execute
339
+ them in document order.
340
+ - Do NOT use bare ``{tool => "X", args => {...}}`` or
341
+ ``[TOOL_CALL]...[/TOOL_CALL]`` formats — those are legacy and will be
342
+ parsed only as a fallback for old session replays.
343
+
344
+ ### File Operations
345
+ - **Read**: read(path, offset=0, limit=0) - Read file contents. Returns content with line numbers.
346
+ - **Write**: write(path, content) - Create or overwrite file with content.
347
+ - **Edit**: edit(path, old_string, new_string) - Replace exact string in file. **CRITICAL**: old_string must be UNIQUE in the file — provide enough context (surrounding lines) to guarantee a single match. The edit WILL FAIL if old_string appears multiple times.
348
+ - **Insert**: insert(path, line, text) - Insert text at a specific line. line=-1 for beginning, line=0 to insert after line 0, etc. Must read file first to verify target location.
349
+ - **UndoEdit**: undo_edit(path) - Undo the most recent Edit/Insert on a file. Restores previous content.
350
+ - **Glob**: glob(pattern) - Find files matching a glob pattern (e.g., "**/*.py").
351
+ - **Grep**: grep(pattern, include=None) - Search for regex pattern in files.
352
+ - **List**: list(path=".") - List directory contents.
353
+ - **ApplyPatch**: apply_patch(patch) - Apply a patch file. Supports Add/Update/Move/Delete File markers.
354
+
355
+ ### Shell
356
+ - **Bash**: bash(command, timeout=60) - Execute shell command. Returns stdout/stderr.
357
+
358
+ ### Web
359
+ - **WebFetch**: webfetch(url, prompt) - Fetch URL content and extract info.
360
+ - **WebSearch**: websearch(query) - Search the web and return results.
361
+
362
+ ### Agent
363
+ - **Task**: task(agent_type, prompt) - Spawn subagent to handle subtask.
364
+ - **Agent**: agent(calls, stop_on_error=True) - Execute a batch of tool calls as an atomic step. Each call includes {name, input}. Halts on first error when stop_on_error is true.
365
+ - **ToolSearch**: tool_search(query) - Search for available tools by keyword.
366
+ - **Skill**: skill(name) - Load skill by name.
367
+
368
+ ### Communication
369
+ - **SendMessage**: send_message(message, attachments=[]) - Send a user-visible message during execution. Use to communicate status updates, findings, or results.
370
+
371
+ ### Human Interaction
372
+ - **AskUser**: ask_user(question, context="", options=[]) - Ask the user a question. Use when you need:
373
+ - Approval before modifying or creating files (when permission_edit is ASK)
374
+ - Clarification on ambiguous requirements
375
+ - Confirmation before destructive operations
376
+ - Any time you need human input to continue
377
+
378
+ When asking for confirmation or a simple choice, **always provide `options`** with predefined choices instead of free-text input. Each option supports:
379
+ - `label` (str, required): Display text shown to the user
380
+ - `value` (str, required): Value returned when selected
381
+ - `key` (str, optional): Single-character keyboard shortcut (e.g. "y", "n", "1")
382
+ - `default` (bool, optional): Auto-select if user doesn't respond (set on at most one option)
383
+
384
+ Examples:
385
+ ```
386
+ # Confirmation with options
387
+ ask_user(
388
+ question="Please confirm SPEC.md is correct?",
389
+ options=[
390
+ {"label": "✓ Confirm", "value": "confirmed", "key": "y", "default": true},
391
+ {"label": "✗ Needs changes", "value": "needs_changes", "key": "n"},
392
+ ]
393
+ )
394
+
395
+ # Multiple choice
396
+ ask_user(
397
+ question="Which environment to deploy?",
398
+ options=[
399
+ {"label": "1. Development", "value": "dev", "key": "1"},
400
+ {"label": "2. Staging", "value": "staging", "key": "2", "default": true},
401
+ {"label": "3. Production", "value": "prod", "key": "3"},
402
+ ]
403
+ )
404
+ ```
405
+
406
+ ### Skills (CDH)
407
+ - **Skill**: skill(name, arguments=[]) - Run a registered skill by name. Skills are markdown-based instruction sets with YAML frontmatter.
408
+
409
+ ### MCP (CDH)
410
+ - **MCPTool**: mcp_tool(server, tool, arguments) - Call a tool on a connected MCP server.
411
+ - **MCPResources**: mcp_resources(server, action, uri) - List or read resources on a connected MCP server.
412
+
413
+ ### LSP (CDH)
414
+ - **LSP**: lsp(command, file_path, action, line, character, query) - Get code intelligence from a Language Server. Supported actions: diagnostics, gotoDefinition, findReferences, hover, documentSymbol, workspaceSymbol, gotoImplementation, callHierarchy, incomingCalls, outgoingCalls.
415
+
416
+ ### Cron (CDH)
417
+ - **CronCreate**: cron_create(name, interval_seconds, command) - Create a scheduled cron job.
418
+ - **CronList**: cron_list() - List all cron jobs.
419
+ - **CronRemove**: cron_remove(name) - Remove a cron job.
420
+
421
+ ### Git (CDH)
422
+ - **Worktree**: worktree(action, path, branch) - Manage git worktrees: create, list, prune.
423
+
424
+ ### Config (CDH)
425
+ - **ConfigRead**: config_read(key) - Read configuration values.
426
+ - **ConfigWrite**: config_write(key, value) - Set allowed configuration values (does NOT expose secrets).
427
+
428
+ ### Tasks & Planning (CDH)
429
+ - **TaskCreate**: task_create(subject, description, activeForm="", metadata={}) - Create a task. Returns task id.
430
+ - **TaskGet**: task_get(taskId) - Retrieve a task by ID.
431
+ - **TaskList**: task_list() - List all tasks with status, owner, and blockers.
432
+ - **TaskUpdate**: task_update(taskId, subject, description, activeForm, status, owner, addBlocks, addBlockedBy, metadata, output) - Update task fields and dependencies.
433
+ - **TaskOutput**: task_output(task_id) - Get output from a task.
434
+ - **TaskStop**: task_stop(task_id) - Stop a running task.
435
+ - **TodoCreate**: todo_create(text) - Create a todo item. Returns todo id.
436
+ - **TodoList**: todo_list() - List all todos.
437
+ - **TodoComplete**: todo_complete(todo_id) - Mark a todo as complete.
438
+ """
439
+
440
+ def filter_tool_descriptions(
441
+ allowlist: list[str] | None = None,
442
+ denylist: list[str] | None = None,
443
+ ) -> str:
444
+ """Return TOOL_DESCRIPTIONS filtered to only show the allowed tools.
445
+
446
+ When *allowlist* is non-empty, only those tool names are shown.
447
+ When *denylist* is non-empty, those tool names are hidden (their
448
+ description lines are removed, but category headers are kept).
449
+ If both are empty, the full tool list is returned.
450
+ """
451
+ if not allowlist and not denylist:
452
+ return TOOL_DESCRIPTIONS
453
+
454
+ _TOOL_LINE_RE = re.compile(r'^- \*\*([^*]+)\*\*:')
455
+
456
+ lines = TOOL_DESCRIPTIONS.split("\n")
457
+ result_lines: list[str] = []
458
+ skip_this_line = False
459
+
460
+ for line in lines:
461
+ m = _TOOL_LINE_RE.match(line.lstrip())
462
+ if m:
463
+ tool_name = m.group(1).strip()
464
+ if allowlist:
465
+ skip_this_line = tool_name not in allowlist
466
+ elif denylist:
467
+ skip_this_line = tool_name in denylist
468
+ else:
469
+ skip_this_line = False
470
+ else:
471
+ skip_this_line = False
472
+
473
+ if not skip_this_line:
474
+ result_lines.append(line)
475
+
476
+ return "\n".join(result_lines)
477
+
478
+
479
+ REACT_CYCLE = """
480
+ ## ReAct Cycle — 思考 → 行动 → 观察
481
+
482
+ You operate in a **ReAct loop with Chain of Thought (CoT) reasoning**:
483
+
484
+ ```
485
+ ┌────────────────────────────────────────────────────┐
486
+ │ ╭──────────╮ ╭──────────╮ ╭──────────╮ │
487
+ │ │ Thought │ → │ Action │ → │Observa- │ │
488
+ │ │ (思考) │ │ (行动) │ │tion(观察)│ ──→ │
489
+ │ ╰──────────╯ ╰──────────╯ ╰──────────╯ │
490
+ │ ↑ ↓ (cycle continues) │
491
+ │ │ │
492
+ │ └──────── Feedback Loop ────────────────────┘ │
493
+ └────────────────────────────────────────────────────┘
494
+ ```
495
+
496
+ ### Thought Phase (思考阶段)
497
+ Before any action, reason step by step inside `<thinking>`:
498
+ 1. **Current state**: What do I know? What has been done? What are the results?
499
+ 2. **Goal**: What needs to be accomplished next?
500
+ 3. **Plan**: How should I approach it? What's the smallest next step?
501
+ 4. **Tool selection**: Which tool is appropriate?
502
+ - **For multi-step or independent work → always use `Task`** to spawn a subagent
503
+ - For simple queries → use read/search tools directly
504
+ - For execution (Write/Edit/Insert/ApplyPatch/Bash) → prefer delegating via `Task`
505
+
506
+ ### Action Phase (行动阶段)
507
+ Execute the chosen action. **Action types (in priority order)**:
508
+ 1. **Delegate via Task**: `Task(agent_type="general"|"explore"|"scout", prompt="...")` — **preferred for any substantial work**. Multi-step logic, file modifications, research, and any task that needs >1-2 tool calls should be delegated.
509
+ 2. **Plan**: `task_create()` / `task_update()` / `todo_create()` to organize the work DAG.
510
+ 3. **Research**: `Read()` / `Grep()` / `Glob()` / `WebFetch()` / `WebSearch()` for information gathering.
511
+ 4. **Direct execute**: Only for trivial single-step operations that cannot justify a subagent.
512
+
513
+ ### Observation Phase (观察阶段)
514
+ The tool result IS your observation. Process it:
515
+ - **Success**: Note key outputs, update task status, move to next step
516
+ - **Error**: Diagnose root cause, decide: retry with fix | modify plan | ask user
517
+ - **Partial**: Extract what worked, adjust approach for remaining work
518
+
519
+ ### Core Rules
520
+ - **ALL reasoning goes in `<thinking>`**: Never narrate "I will now..." in visible text
521
+ - **Prefer Task over direct execution**: File edits, multi-step logic, research → always use `Task()`
522
+ - **One responsibility per Task**: Each subagent should have a clear, focused goal
523
+ - **Pass context**: Include relevant context (file paths, findings) in Task prompts
524
+ - **CoT every cycle**: Every turn starts with `<thinking>` reasoning before any action
525
+ """
526
+
527
+ PLAN_INSTRUCTIONS = """
528
+ ## ReAct Workflow (Thought → Action → Observation)
529
+
530
+ The agent is a **ReAct** implementation: each cycle is **Thought → Action → Observation**.
531
+ **Action always delegates to `Task` subagents for any substantial work.**
532
+ **Human-in-the-loop** means you involve the user at key decision points.
533
+
534
+ ```
535
+ Loop:
536
+ Thought → Reason step by step (CoT) inside <thinking>
537
+ Always ask: "Should I delegate this to a Task subagent?"
538
+ Action → Prefer Task(agent_type, prompt) for multi-step work
539
+ Only use direct tools for trivial single-step operations
540
+ Observation → Incorporate results into the next Thought
541
+ ```
542
+
543
+ Plan/Build/Solo are different configurations of this same ReAct engine. The
544
+ difference is how strictly planning is enforced before execution:
545
+ - **plan** mode: hard gate — execution tools blocked until a task plan exists
546
+ - **build**/**solo** mode: soft gate — execution allowed but planning encouraged
547
+
548
+ **Task-first principle**: Any action that requires >1 tool call or involves
549
+ file modification MUST be delegated to a `Task` subagent. Direct execution
550
+ (Write/Edit/Insert/ApplyPatch/Bash) is only for trivial single-step operations.
551
+
552
+ ---
553
+
554
+ ### Step 1: Think (CoT) — Chain of Thought Reasoning
555
+
556
+ Analyze the request with step-by-step reasoning before any action.
557
+
558
+ - Wrap ALL reasoning in `<thinking>...</thinking>` — visible text is for the user only
559
+ - Think step by step: What's the goal? What's the current state? What's the best approach?
560
+ - **Always consider**: "Can this be delegated to a Task subagent?"
561
+ - Read relevant files, grep for patterns, glob for structure
562
+ - Use `webfetch`/`websearch` for external APIs or docs
563
+ - Delegate deep research to `explore`/`scout` subagents via `task()`
564
+ - Ask the user via `ask_user()` if requirements are ambiguous
565
+ - Do NOT create tasks yet — first understand what is needed
566
+
567
+ ---
568
+
569
+ ### Step 2: Act (Plan) — Create the Task Plan
570
+
571
+ Once you understand the work, create a complete task plan via `task_create()`.
572
+
573
+ **Task Granularity Rules**
574
+ - One task = one concern (e.g. "Create User model", "Add login API endpoint")
575
+ - Each task: **delegate to a Task subagent**. If a task needs >5 tool calls, split it.
576
+ - Every task must have a **clear, verifiable completion criterion**
577
+ - Use `todo_create()` only for truly trivial items (single config change, one quick check)
578
+
579
+ **Creating Tasks**
580
+ ```
581
+ task_create(subject="<verb + noun>", description="<what + acceptance criteria>",
582
+ metadata={"priority": "high|medium|low", "effort": "small|medium|large"})
583
+ ```
584
+ - Set `addBlockedBy` on dependent tasks so the dependency DAG is clear
585
+ - **Create ALL tasks upfront** before presenting the plan to the user
586
+
587
+ **Present Plan for Review (Human-in-the-loop)**
588
+ After creating all tasks, use `send_message()` to summarize the plan, then
589
+ `ask_user()` to get approval before executing:
590
+ ```
591
+ send_message("Plan: 1. Setup DB model 2. Add API endpoint 3. Write tests")
592
+ ask_user("Shall I proceed with executing this plan?")
593
+ ```
594
+ Wait for user approval before moving to execution.
595
+
596
+ ---
597
+
598
+ ### Step 3: Act (Execute) — Delegate to Task Subagents
599
+
600
+ Execute by **delegating to Task subagents** rather than using direct tools.
601
+
602
+ - **PREFERRED**: `Task(agent_type="general", prompt="Detailed instructions with context...")`
603
+ - Use `general` subagent for implementation work, `explore` for code search, `scout` for research
604
+ - Pass enough context in the prompt: relevant file paths, code snippets, requirements
605
+ - Update task status: `pending` → `in_progress` → `completed`
606
+ - Use `task_update(..., output=...)` to pass results to downstream tasks
607
+ - Direct execution tools (Write/Edit/Insert/ApplyPatch/Bash) should be avoided
608
+ in favor of `Task` delegation. Only use them for truly trivial operations.
609
+ - After each task, report progress via `send_message()` to keep the user in the loop
610
+
611
+ ---
612
+
613
+ ### Step 4: Observe — Feed Results Back
614
+
615
+ After every Action, the tool result is your **Observation**. Use it to inform the
616
+ next Thought:
617
+ - Task subagent completed → review SUMMARY/CHANGES/EVIDENCE/RISKS/BLOCKERS sections
618
+ - Task creation succeeded → proceed to present plan or delegate execution
619
+ - Error occurred → diagnose and decide: retry, modify plan, or ask the user
620
+ - User denied an action → adapt the task plan accordingly
621
+
622
+ ---
623
+
624
+ ### Rules
625
+
626
+ - **No top-level planning prose**: All planning goes through task/todo tools so the UI renders it.
627
+ - **CoT in `<thinking>`**: Every turn starts with chain-of-thought reasoning inside `<thinking>`. Never narrate "I will now…" in visible text.
628
+ - **Task-first**: Any operation needing >1 tool call → delegate via `Task()`. Direct tool use is exceptional.
629
+ - **Task status discipline**: `pending` → `in_progress` → `completed`. Every task transitions through all three.
630
+ - **No execution without a plan**: Write/Edit/Insert/ApplyPatch/Bash require tasks. Create tasks first.
631
+ - **Human at key decisions**: Present the plan, get approval, then execute. Report progress as you go.
632
+ """
633
+
634
+ COMPACTION_INSTRUCTIONS = """
635
+ ## Context Compaction
636
+
637
+ You are a compaction agent. Your job is to summarize the conversation history into a concise format that preserves key information while minimizing token usage.
638
+
639
+ Output a summary with these sections:
640
+ - **Summary**: Brief overview of what has been discussed/accomplished
641
+ - **Key Decisions**: Important choices made and their rationale
642
+ - **Remaining Tasks**: What still needs to be done
643
+ - **Context Needed**: Information required to continue the work
644
+
645
+ Keep each section concise. Use bullet points where possible.
646
+ """
647
+
648
+ TITLE_INSTRUCTIONS = """
649
+ Generate a short, descriptive title (max 5 words) for this conversation.
650
+ The title should capture the main topic or task being worked on.
651
+ Only output the title, nothing else.
652
+ """
653
+
654
+ SUMMARY_INSTRUCTIONS = """
655
+ Create a summary of this conversation session. Include:
656
+ - What was the user trying to accomplish
657
+ - What was done
658
+ - What was the outcome
659
+ - Any important notes for future sessions
660
+
661
+ Keep it concise but informative.
662
+ """