@scemoon/cdh 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/package.json +2 -2
  2. package/ai-dlc-skill/SKILL.md +0 -77
  3. package/ai-dlc-skill/agents/deliver-agent.md +0 -24
  4. package/ai-dlc-skill/agents/master.md +0 -50
  5. package/ai-dlc-skill/agents/plan-agent.md +0 -23
  6. package/ai-dlc-skill/agents/understand-agent.md +0 -23
  7. package/ai-dlc-skill/agents/verify-agent.md +0 -27
  8. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  9. package/ai-dlc-skill/brownfield/README.md +0 -30
  10. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  11. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  12. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  13. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  14. package/ai-dlc-skill/components/backend.md +0 -34
  15. package/ai-dlc-skill/components/desktop.md +0 -30
  16. package/ai-dlc-skill/components/mya.md +0 -29
  17. package/ai-dlc-skill/components/native.md +0 -30
  18. package/ai-dlc-skill/components/tta.md +0 -29
  19. package/ai-dlc-skill/components/web.md +0 -31
  20. package/ai-dlc-skill/components/wxa.md +0 -29
  21. package/ai-dlc-skill/contracts/README.md +0 -25
  22. package/ai-dlc-skill/core/adaptive-flow.md +0 -36
  23. package/ai-dlc-skill/core/security.md +0 -29
  24. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
  25. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
  26. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
  27. package/ai-dlc-skill/cross-tool/export.sh +0 -22
  28. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
  29. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
  30. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
  31. package/ai-dlc-skill/phases/deliver/entry.md +0 -26
  32. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  33. package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
  34. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  35. package/ai-dlc-skill/phases/plan/entry.md +0 -25
  36. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
  37. package/ai-dlc-skill/phases/plan/prompt.md +0 -38
  38. package/ai-dlc-skill/phases/plan/rules.md +0 -25
  39. package/ai-dlc-skill/phases/understand/entry.md +0 -26
  40. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  41. package/ai-dlc-skill/phases/understand/prompt.md +0 -41
  42. package/ai-dlc-skill/phases/understand/rules.md +0 -37
  43. package/ai-dlc-skill/phases/verify/entry.md +0 -26
  44. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
  45. package/ai-dlc-skill/phases/verify/prompt.md +0 -43
  46. package/ai-dlc-skill/phases/verify/rules.md +0 -73
  47. package/ai-dlc-skill/practices/bdd.md +0 -91
  48. package/ai-dlc-skill/practices/sdd.md +0 -84
  49. package/ai-dlc-skill/practices/tdd.md +0 -95
  50. package/ai-dlc-skill/providers/README.md +0 -114
  51. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  52. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  53. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  54. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
  55. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  56. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  57. package/ai-dlc-skill/requirements.md +0 -140
  58. package/ai-dlc-skill/skill.yaml +0 -147
  59. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  60. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  61. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  62. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  63. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  64. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  65. package/ai-dlc-skill/templates/plan/design.md +0 -49
  66. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  67. package/ai-dlc-skill/templates/project/README.md +0 -126
  68. package/ai-dlc-skill/templates/project/template.md +0 -119
  69. package/ai-dlc-skill/templates/understand/feature.feature +0 -23
  70. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  71. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  72. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  73. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  74. package/ai-dlc-skill/walkthrough/template.md +0 -54
  75. package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
  76. package/ai-dlc-skill/workflows/deployment.yaml +0 -199
  77. package/cdh/__init__.py +0 -0
  78. package/cdh/__main__.py +0 -4
  79. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
  82. package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
  83. package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
  84. package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
  85. package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
  86. package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
  87. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  88. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  89. package/cdh/cdh_mcp_injector.py +0 -115
  90. package/cdh/cdh_mcp_loader.py +0 -67
  91. package/cdh/cdh_mcp_manager.py +0 -73
  92. package/cdh/cdh_session_aggregator.py +0 -258
  93. package/cdh/cdh_skill_manager.py +0 -105
  94. package/cdh/cli.py +0 -807
  95. package/cdh/scaffold.py +0 -728
  96. package/onecode/__init__.py +0 -1
  97. package/onecode/__main__.py +0 -4
  98. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  99. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  100. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  101. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  102. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  103. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  104. package/onecode/agent/__init__.py +0 -0
  105. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  106. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  107. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  108. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  109. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  110. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  111. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  112. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  113. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  114. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  115. package/onecode/agent/agents/__init__.py +0 -29
  116. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  117. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  118. package/onecode/agent/agents/types.py +0 -589
  119. package/onecode/agent/attachments.py +0 -112
  120. package/onecode/agent/cdh_loader.py +0 -267
  121. package/onecode/agent/context.py +0 -343
  122. package/onecode/agent/engine.py +0 -2700
  123. package/onecode/agent/hooks.py +0 -86
  124. package/onecode/agent/onecode_agent_acp.py +0 -2743
  125. package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
  126. package/onecode/agent/permissions.py +0 -150
  127. package/onecode/agent/permissions_store.py +0 -62
  128. package/onecode/agent/project_doc.py +0 -19
  129. package/onecode/agent/session.py +0 -195
  130. package/onecode/agent/snapshot.py +0 -144
  131. package/onecode/agent/tools/__init__.py +0 -17
  132. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  133. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  145. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  146. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  147. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  148. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  149. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  150. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  151. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  152. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  153. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  154. package/onecode/agent/tools/agent_tools.py +0 -132
  155. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  156. package/onecode/agent/tools/bash_tool.py +0 -111
  157. package/onecode/agent/tools/communication_tools.py +0 -148
  158. package/onecode/agent/tools/config_tool.py +0 -130
  159. package/onecode/agent/tools/cron_tools.py +0 -178
  160. package/onecode/agent/tools/errors.py +0 -17
  161. package/onecode/agent/tools/file_ops.py +0 -221
  162. package/onecode/agent/tools/file_tools.py +0 -225
  163. package/onecode/agent/tools/git_tools.py +0 -88
  164. package/onecode/agent/tools/lsp_tools.py +0 -404
  165. package/onecode/agent/tools/mcp_tools.py +0 -127
  166. package/onecode/agent/tools/permission_handler.py +0 -46
  167. package/onecode/agent/tools/permissions.py +0 -77
  168. package/onecode/agent/tools/protocol.py +0 -20
  169. package/onecode/agent/tools/registry.py +0 -201
  170. package/onecode/agent/tools/sandbox.py +0 -358
  171. package/onecode/agent/tools/schema_validation.py +0 -100
  172. package/onecode/agent/tools/skill_tools.py +0 -52
  173. package/onecode/agent/tools/todo_tools.py +0 -207
  174. package/onecode/agent/tools/web_tools.py +0 -169
  175. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  176. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  177. package/onecode/builtin_skills/git/SKILL.md +0 -64
  178. package/onecode/builtin_skills/git/skill.yaml +0 -7
  179. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  180. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  181. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  182. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  183. package/onecode/cli.py +0 -935
  184. package/onecode/cloud/__init__.py +0 -0
  185. package/onecode/cloud/base.py +0 -20
  186. package/onecode/codebase/__init__.py +0 -69
  187. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  188. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  189. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  190. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  191. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  192. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  193. package/onecode/codebase/chunker.py +0 -125
  194. package/onecode/codebase/indexer.py +0 -149
  195. package/onecode/codebase/retriever.py +0 -203
  196. package/onecode/codebase/storage.py +0 -131
  197. package/onecode/codebase/tools.py +0 -59
  198. package/onecode/commands.py +0 -596
  199. package/onecode/config.py +0 -314
  200. package/onecode/config_screen.py +0 -600
  201. package/onecode/cron/__init__.py +0 -3
  202. package/onecode/lsp/__init__.py +0 -3
  203. package/onecode/mcp/__init__.py +0 -4
  204. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  205. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  206. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  207. package/onecode/mcp/client.py +0 -193
  208. package/onecode/mcp/manager.py +0 -190
  209. package/onecode/memory/__init__.py +0 -49
  210. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  212. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  213. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  214. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  215. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  216. package/onecode/memory/backend.py +0 -159
  217. package/onecode/memory/pyramid.py +0 -133
  218. package/onecode/memory/recall.py +0 -203
  219. package/onecode/migrate.py +0 -122
  220. package/onecode/models/__init__.py +0 -4
  221. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  222. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  223. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  224. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  225. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  226. package/onecode/models/errors.py +0 -104
  227. package/onecode/models/messages.py +0 -739
  228. package/onecode/models/provider.py +0 -699
  229. package/onecode/models/providers/__init__.py +0 -17
  230. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  231. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  232. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  233. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  234. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  235. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  236. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  237. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  238. package/onecode/models/providers/anthropic_provider.py +0 -273
  239. package/onecode/models/providers/deepseek_provider.py +0 -212
  240. package/onecode/models/providers/glm_provider.py +0 -195
  241. package/onecode/models/providers/minimax_provider.py +0 -158
  242. package/onecode/models/providers/minimaxi_provider.py +0 -417
  243. package/onecode/models/providers/ollama_provider.py +0 -100
  244. package/onecode/models/providers/openai_provider.py +0 -237
  245. package/onecode/models/registry.py +0 -212
  246. package/onecode/server/__init__.py +0 -3
  247. package/onecode/server/app.py +0 -224
  248. package/onecode/skills/__init__.py +0 -11
  249. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  251. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  252. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  253. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  254. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  255. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  256. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  257. package/onecode/skills/argument_substitution.py +0 -38
  258. package/onecode/skills/bootstrap.py +0 -124
  259. package/onecode/skills/create.py +0 -56
  260. package/onecode/skills/frontmatter.py +0 -33
  261. package/onecode/skills/loader.py +0 -139
  262. package/onecode/skills/manager.py +0 -75
  263. package/onecode/skills/model.py +0 -43
  264. package/onecode/storage/__init__.py +0 -0
  265. package/onecode/storage/activity.py +0 -63
  266. package/onecode/storage/project.py +0 -54
  267. package/onecode/storage/session.py +0 -112
  268. package/onecode/tasks/__init__.py +0 -26
  269. package/onecode/tasks/manager.py +0 -232
  270. package/onecode/tasks/models.py +0 -240
  271. package/onecode/trace/__init__.py +0 -0
  272. package/onecode/trace/tracer.py +0 -173
  273. package/onecode/utils/__init__.py +0 -0
  274. package/onecode/utils/helpers.py +0 -20
  275. package/pyproject.toml +0 -74
  276. package/tui/__init__.py +0 -46
  277. package/tui/__main__.py +0 -4
  278. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/about.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/app.cpython-313.pyc +0 -0
  288. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  289. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  308. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  309. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  310. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  311. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  312. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  313. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  314. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  315. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  316. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  317. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  318. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  319. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  320. package/tui/_loop.py +0 -86
  321. package/tui/_path_fuzzy_search.py +0 -48
  322. package/tui/_path_match.py +0 -141
  323. package/tui/about.py +0 -95
  324. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  325. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  326. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  327. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  328. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  329. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  330. package/tui/acp/agent.py +0 -1002
  331. package/tui/acp/api.py +0 -73
  332. package/tui/acp/encode_tool_call_id.py +0 -12
  333. package/tui/acp/messages.py +0 -203
  334. package/tui/acp/prompt.py +0 -53
  335. package/tui/acp/protocol.py +0 -499
  336. package/tui/agent.py +0 -70
  337. package/tui/agent_schema.py +0 -76
  338. package/tui/agents.py +0 -46
  339. package/tui/ansi/__init__.py +0 -1
  340. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  341. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  342. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  343. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  344. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  345. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  346. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  347. package/tui/ansi/_ansi.py +0 -1689
  348. package/tui/ansi/_ansi_colors.py +0 -264
  349. package/tui/ansi/_control_codes.py +0 -37
  350. package/tui/ansi/_keys.py +0 -251
  351. package/tui/ansi/_sgr_styles.py +0 -64
  352. package/tui/ansi/_stream_parser.py +0 -418
  353. package/tui/answer.py +0 -12
  354. package/tui/app.py +0 -1266
  355. package/tui/atomic.py +0 -37
  356. package/tui/cli.py +0 -313
  357. package/tui/code_analyze.py +0 -27
  358. package/tui/complete.py +0 -38
  359. package/tui/constants.py +0 -61
  360. package/tui/conversation_markdown.py +0 -30
  361. package/tui/danger.py +0 -372
  362. package/tui/data/agents/ampcode.com.toml +0 -52
  363. package/tui/data/agents/augmentcode.com.toml +0 -41
  364. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  365. package/tui/data/agents/claude.com.toml +0 -41
  366. package/tui/data/agents/copilot.github.com.toml +0 -29
  367. package/tui/data/agents/crowai.dev.toml +0 -36
  368. package/tui/data/agents/cursor.com.toml +0 -38
  369. package/tui/data/agents/deepagents.langchain.com +0 -34
  370. package/tui/data/agents/docker.com.toml +0 -60
  371. package/tui/data/agents/geminicli.com.toml +0 -28
  372. package/tui/data/agents/goose.ai.toml +0 -52
  373. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  374. package/tui/data/agents/kimi.com.toml +0 -35
  375. package/tui/data/agents/kiro.dev.toml +0 -43
  376. package/tui/data/agents/onecode.dev.toml +0 -22
  377. package/tui/data/agents/openai.com.toml +0 -53
  378. package/tui/data/agents/openclaw.ai.toml +0 -37
  379. package/tui/data/agents/opencode.ai.toml +0 -39
  380. package/tui/data/agents/openhands.dev.toml +0 -46
  381. package/tui/data/agents/stakpak.dev.toml +0 -62
  382. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  383. package/tui/data/agents/vtcode.dev.toml +0 -63
  384. package/tui/data/images/frog.png +0 -0
  385. package/tui/data/sounds/question.wav +0 -0
  386. package/tui/data/sounds/turn-over.wav +0 -0
  387. package/tui/db.py +0 -213
  388. package/tui/dec.py +0 -332
  389. package/tui/directory.py +0 -234
  390. package/tui/directory_suggester.py +0 -93
  391. package/tui/directory_watcher.py +0 -231
  392. package/tui/format_path.py +0 -25
  393. package/tui/fuzzy.py +0 -140
  394. package/tui/fuzzy_index.py +0 -275
  395. package/tui/gist.py +0 -33
  396. package/tui/history.py +0 -138
  397. package/tui/jsonrpc.py +0 -578
  398. package/tui/menus.py +0 -14
  399. package/tui/message_log.py +0 -69
  400. package/tui/messages.py +0 -144
  401. package/tui/option_content.py +0 -51
  402. package/tui/os.py +0 -0
  403. package/tui/path_complete.py +0 -217
  404. package/tui/path_filter.py +0 -124
  405. package/tui/paths.py +0 -87
  406. package/tui/pill.py +0 -23
  407. package/tui/platform_commands.py +0 -52
  408. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  409. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  410. package/tui/prompt/extract.py +0 -19
  411. package/tui/prompt/resource.py +0 -68
  412. package/tui/protocol.py +0 -28
  413. package/tui/screens/__init__.py +0 -0
  414. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  415. package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
  416. package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
  417. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  418. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  419. package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
  420. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  421. package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
  422. package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
  423. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  424. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  425. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  426. package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
  427. package/tui/screens/action_modal.py +0 -94
  428. package/tui/screens/agent_modal.py +0 -175
  429. package/tui/screens/command_edit_modal.py +0 -74
  430. package/tui/screens/component_picker.py +0 -168
  431. package/tui/screens/diff_screen.py +0 -84
  432. package/tui/screens/log.py +0 -553
  433. package/tui/screens/main.py +0 -385
  434. package/tui/screens/main.tcss +0 -655
  435. package/tui/screens/permissions.py +0 -404
  436. package/tui/screens/permissions.tcss +0 -72
  437. package/tui/screens/projects.tcss +0 -80
  438. package/tui/screens/projects_app.py +0 -347
  439. package/tui/screens/projects_screen.py +0 -284
  440. package/tui/screens/session_resume_modal.py +0 -172
  441. package/tui/screens/session_resume_modal.tcss +0 -35
  442. package/tui/screens/sessions.py +0 -164
  443. package/tui/screens/sessions.tcss +0 -119
  444. package/tui/screens/settings.py +0 -254
  445. package/tui/screens/settings.tcss +0 -101
  446. package/tui/screens/store.py +0 -500
  447. package/tui/screens/store.tcss +0 -274
  448. package/tui/screens/tool_content_screen.py +0 -59
  449. package/tui/session_tracker.py +0 -123
  450. package/tui/settings.py +0 -353
  451. package/tui/settings_schema.py +0 -431
  452. package/tui/shell.py +0 -304
  453. package/tui/shell_read.py +0 -42
  454. package/tui/slash_command.py +0 -34
  455. package/tui/tui.tcss +0 -246
  456. package/tui/twitter.py +0 -38
  457. package/tui/version.py +0 -80
  458. package/tui/visuals/__init__.py +0 -0
  459. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  460. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  461. package/tui/visuals/columns.py +0 -272
  462. package/tui/widgets/__init__.py +0 -0
  463. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  464. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  480. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  483. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  485. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  486. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  487. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  488. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  489. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  490. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  491. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  492. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  493. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  494. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  495. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  496. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  497. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  498. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  499. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  500. package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
  501. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  502. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  503. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  504. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  505. package/tui/widgets/acp_content.py +0 -70
  506. package/tui/widgets/agent_response.py +0 -76
  507. package/tui/widgets/agent_thought.py +0 -167
  508. package/tui/widgets/ask_user.py +0 -264
  509. package/tui/widgets/command_pane.py +0 -223
  510. package/tui/widgets/condensed_path.py +0 -115
  511. package/tui/widgets/context_stats.py +0 -66
  512. package/tui/widgets/conversation.py +0 -2641
  513. package/tui/widgets/danger_warning.py +0 -65
  514. package/tui/widgets/diff_view.py +0 -69
  515. package/tui/widgets/directory_input.py +0 -8
  516. package/tui/widgets/flash.py +0 -81
  517. package/tui/widgets/future_text.py +0 -126
  518. package/tui/widgets/grid_select.py +0 -234
  519. package/tui/widgets/highlighted_textarea.py +0 -180
  520. package/tui/widgets/load_more.py +0 -24
  521. package/tui/widgets/mandelbrot.py +0 -294
  522. package/tui/widgets/markdown_note.py +0 -13
  523. package/tui/widgets/menu.py +0 -147
  524. package/tui/widgets/modified_files.py +0 -306
  525. package/tui/widgets/non_selectable_label.py +0 -5
  526. package/tui/widgets/note.py +0 -18
  527. package/tui/widgets/path_search.py +0 -492
  528. package/tui/widgets/plan.py +0 -285
  529. package/tui/widgets/project_directory_tree.py +0 -102
  530. package/tui/widgets/project_grid_select.py +0 -64
  531. package/tui/widgets/project_summary.py +0 -33
  532. package/tui/widgets/prompt.py +0 -795
  533. package/tui/widgets/question.py +0 -360
  534. package/tui/widgets/session_grid_select.py +0 -230
  535. package/tui/widgets/session_summary.py +0 -115
  536. package/tui/widgets/session_tabs.py +0 -188
  537. package/tui/widgets/shell_result.py +0 -35
  538. package/tui/widgets/shell_terminal.py +0 -40
  539. package/tui/widgets/side_bar.py +0 -124
  540. package/tui/widgets/slash_complete.py +0 -235
  541. package/tui/widgets/strike_text.py +0 -70
  542. package/tui/widgets/subagent.py +0 -287
  543. package/tui/widgets/subagent_screen.py +0 -709
  544. package/tui/widgets/terminal.py +0 -576
  545. package/tui/widgets/terminal_tool.py +0 -360
  546. package/tui/widgets/throbber.py +0 -100
  547. package/tui/widgets/tool_call.py +0 -398
  548. package/tui/widgets/user_input.py +0 -23
  549. package/tui/widgets/version.py +0 -5
  550. package/tui/widgets/welcome.py +0 -31
@@ -1,112 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import uuid
5
- from datetime import datetime, timezone
6
- from pathlib import Path
7
- from typing import Optional
8
-
9
- from sqlalchemy import (
10
- Column,
11
- String,
12
- DateTime,
13
- JSON,
14
- create_engine,
15
- )
16
- from sqlalchemy.orm import declarative_base, sessionmaker
17
-
18
- from onecode.config import ONECODE_DIR
19
-
20
- Base = declarative_base()
21
-
22
-
23
- class SessionRecord(Base):
24
- __tablename__ = "sessions"
25
-
26
- id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
27
- name = Column(String(255), default="Untitled")
28
- mode = Column(String(50), default="build")
29
- project = Column(String(255), default="")
30
- model = Column(String(255), default="")
31
- provider = Column(String(255), default="")
32
- messages = Column(JSON, default=list)
33
- lifecycle_state = Column(JSON, default=dict)
34
- created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
35
- updated_at = Column(
36
- DateTime,
37
- default=lambda: datetime.now(timezone.utc),
38
- onupdate=lambda: datetime.now(timezone.utc),
39
- )
40
-
41
-
42
- class SessionStore:
43
- def __init__(self, db_path: Optional[Path] = None):
44
- if db_path is None:
45
- db_path = ONECODE_DIR / "sessions" / "cdh.db"
46
- db_path.parent.mkdir(parents=True, exist_ok=True)
47
- self.engine = create_engine(f"sqlite:///{db_path}")
48
- Base.metadata.create_all(self.engine)
49
- self.Session = sessionmaker(bind=self.engine)
50
-
51
- def create(self, name: str = "Untitled", mode: str = "build", project: str = "") -> SessionRecord:
52
- with self.Session() as session:
53
- record = SessionRecord(name=name, mode=mode, project=project)
54
- session.add(record)
55
- session.commit()
56
- session.refresh(record)
57
- return record
58
-
59
- def list_all(self) -> list[SessionRecord]:
60
- with self.Session() as session:
61
- return session.query(SessionRecord).order_by(SessionRecord.updated_at.desc()).all()
62
-
63
- def list_by_project(self, project: str) -> list[SessionRecord]:
64
- with self.Session() as session:
65
- return (
66
- session.query(SessionRecord)
67
- .filter_by(project=project)
68
- .order_by(SessionRecord.updated_at.desc())
69
- .all()
70
- )
71
-
72
- def load(self, session_id: str) -> Optional[SessionRecord]:
73
- with self.Session() as session:
74
- return session.query(SessionRecord).filter_by(id=session_id).first()
75
-
76
- def update(self, record: SessionRecord):
77
- with self.Session() as s:
78
- s.merge(record)
79
- s.commit()
80
-
81
- def delete(self, session_id: str):
82
- with self.Session() as s:
83
- record = s.query(SessionRecord).filter_by(id=session_id).first()
84
- if record:
85
- s.delete(record)
86
- s.commit()
87
-
88
- def rename(self, session_id: str, new_name: str):
89
- with self.Session() as s:
90
- record = s.query(SessionRecord).filter_by(id=session_id).first()
91
- if record:
92
- record.name = new_name
93
- s.commit()
94
-
95
- def export_json(self, session_id: str) -> Optional[str]:
96
- record = self.load(session_id)
97
- if not record:
98
- return None
99
- return json.dumps(
100
- {
101
- "id": record.id,
102
- "name": record.name,
103
- "mode": record.mode,
104
- "project": record.project,
105
- "model": record.model,
106
- "messages": record.messages,
107
- "created_at": record.created_at.isoformat() if record.created_at else None,
108
- "updated_at": record.updated_at.isoformat() if record.updated_at else None,
109
- },
110
- indent=2,
111
- ensure_ascii=False,
112
- )
@@ -1,26 +0,0 @@
1
- from onecode.tasks.models import (
2
- TaskStatus,
3
- TodoStatus,
4
- TodoItem,
5
- TaskChecklistState,
6
- TaskGateRecord,
7
- TaskToolCallSummary,
8
- TaskTimelineEntry,
9
- TaskRecord,
10
- )
11
- from onecode.tasks.manager import TaskManager, TaskExecutor, ExecutionTask, TaskExecutionResult
12
-
13
- __all__ = [
14
- "TaskStatus",
15
- "TodoStatus",
16
- "TodoItem",
17
- "TaskChecklistState",
18
- "TaskGateRecord",
19
- "TaskToolCallSummary",
20
- "TaskTimelineEntry",
21
- "TaskRecord",
22
- "TaskManager",
23
- "TaskExecutor",
24
- "ExecutionTask",
25
- "TaskExecutionResult",
26
- ]
@@ -1,232 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- import logging
5
- import uuid
6
- from dataclasses import dataclass
7
- from datetime import datetime
8
- from pathlib import Path
9
- from typing import Any, Callable, Optional
10
-
11
- logger = logging.getLogger("onecode.tasks")
12
-
13
- from onecode.tasks.models import (
14
- TaskRecord,
15
- TaskStatus,
16
- TaskChecklistState,
17
- TaskGateRecord,
18
- TaskToolCallSummary,
19
- )
20
-
21
-
22
- class TaskExecutor(Callable[..., Any]):
23
- async def execute(
24
- self,
25
- task: "ExecutionTask",
26
- events: asyncio.Queue,
27
- cancel: asyncio.Event,
28
- ) -> dict[str, Any]:
29
- raise NotImplementedError
30
-
31
-
32
- @dataclass
33
- class ExecutionTask:
34
- id: str
35
- prompt: str
36
- model: str
37
- workspace: Path
38
-
39
-
40
- @dataclass
41
- class TaskExecutionResult:
42
- task_id: str
43
- success: bool
44
- output: str = ""
45
- error: Optional[str] = None
46
- duration_ms: int = 0
47
-
48
-
49
- class TaskManager:
50
- def __init__(self, storage_path: Optional[Path] = None):
51
- self._tasks: dict[str, TaskRecord] = {}
52
- self._queue: asyncio.Queue[ExecutionTask] = asyncio.Queue()
53
- self._running: dict[str, asyncio.Task] = {}
54
- self._storage_path = storage_path or Path.home() / ".cdh" / "tasks"
55
- self._executor: Optional[TaskExecutor] = None
56
- self._worker_task: Optional[asyncio.Task] = None
57
- self._semaphore = asyncio.Semaphore(5)
58
- self._shutdown: bool = False
59
-
60
- def set_executor(self, executor: TaskExecutor) -> None:
61
- self._executor = executor
62
-
63
- def add_task(
64
- self,
65
- prompt: str,
66
- model: str = "MiniMax-M2.7",
67
- workspace: Optional[Path] = None,
68
- checklist: Optional[TaskChecklistState] = None,
69
- ) -> TaskRecord:
70
- task = TaskRecord(
71
- id=str(uuid.uuid4())[:8],
72
- prompt=prompt,
73
- model=model,
74
- workspace=workspace or Path.cwd(),
75
- checklist=checklist or TaskChecklistState(),
76
- )
77
- self._tasks[task.id] = task
78
- self._queue.put_nowait(
79
- ExecutionTask(
80
- id=task.id,
81
- prompt=prompt,
82
- model=model,
83
- workspace=task.workspace,
84
- )
85
- )
86
- return task
87
-
88
- async def start_worker(self) -> None:
89
- if self._worker_task is None:
90
- self._worker_task = asyncio.create_task(self._worker_loop())
91
-
92
- async def _worker_loop(self) -> None:
93
- while not self._shutdown:
94
- try:
95
- task = await asyncio.wait_for(self._queue.get(), timeout=30)
96
- if task.id not in self._running:
97
- async with self._semaphore:
98
- self._running[task.id] = asyncio.create_task(self._run_task(task))
99
- except asyncio.TimeoutError:
100
- continue
101
- except asyncio.CancelledError:
102
- break
103
- except Exception as e:
104
- logger.error("Task worker error: %s", e)
105
-
106
- async def _run_task(self, execution: ExecutionTask) -> None:
107
- task_record = self._tasks.get(execution.id)
108
- if not task_record:
109
- return
110
-
111
- task_record.status = TaskStatus.RUNNING
112
- task_record.started_at = datetime.utcnow()
113
-
114
- try:
115
- if self._executor:
116
- cancel = asyncio.Event()
117
- events: asyncio.Queue = asyncio.Queue()
118
- result = await asyncio.wait_for(
119
- self._executor.execute(execution, events, cancel),
120
- timeout=300,
121
- )
122
- task_record.status = TaskStatus.COMPLETED if result.get("success") else TaskStatus.FAILED
123
- task_record.error = result.get("error")
124
- else:
125
- await asyncio.sleep(0.1)
126
- task_record.status = TaskStatus.COMPLETED
127
- except Exception as e:
128
- task_record.status = TaskStatus.FAILED
129
- task_record.error = str(e)
130
- finally:
131
- task_record.ended_at = datetime.utcnow()
132
- if task_record.started_at:
133
- task_record.duration_ms = int(
134
- (task_record.ended_at - task_record.started_at).total_seconds() * 1000
135
- )
136
- self._running.pop(execution.id, None)
137
-
138
- def cancel_task(self, task_id: str) -> bool:
139
- if task_id in self._running:
140
- self._running[task_id].cancel()
141
- task_record = self._tasks.get(task_id)
142
- if task_record:
143
- task_record.status = TaskStatus.CANCELED
144
- task_record.ended_at = datetime.utcnow()
145
- return True
146
- return False
147
-
148
- def get_task(self, task_id: str) -> Optional[TaskRecord]:
149
- return self._tasks.get(task_id)
150
-
151
- def list_tasks(self, status: Optional[TaskStatus] = None) -> list[TaskRecord]:
152
- if status is None:
153
- return list(self._tasks.values())
154
- return [t for t in self._tasks.values() if t.status == status]
155
-
156
- def add_todo_to_task(self, task_id: str, content: str, status: str = "pending") -> Optional["TaskChecklistItem"]: # noqa: F821
157
- task = self._tasks.get(task_id)
158
- if not task:
159
- return None
160
- return task.checklist.add(content, status)
161
-
162
- def update_todo_status(self, task_id: str, todo_id: int, status: str) -> bool:
163
- task = self._tasks.get(task_id)
164
- if not task:
165
- return False
166
- return task.checklist.update_status(todo_id, status)
167
-
168
- def add_gate(
169
- self,
170
- task_id: str,
171
- gate: str,
172
- command: str,
173
- ) -> Optional[TaskGateRecord]:
174
- task = self._tasks.get(task_id)
175
- if not task:
176
- return None
177
- gate_record = TaskGateRecord(
178
- id=str(uuid.uuid4())[:8],
179
- gate=gate,
180
- command=command,
181
- )
182
- task.gates.append(gate_record)
183
- return gate_record
184
-
185
- def add_tool_call(
186
- self,
187
- task_id: str,
188
- tool_id: str,
189
- name: str,
190
- input: dict[str, Any],
191
- ) -> Optional[TaskToolCallSummary]:
192
- task = self._tasks.get(task_id)
193
- if not task:
194
- return None
195
- tc = TaskToolCallSummary(id=tool_id, name=name, input=input)
196
- task.tool_calls.append(tc)
197
- return tc
198
-
199
- def update_tool_call_output(self, task_id: str, tool_id: str, output: str, duration_ms: int) -> bool:
200
- task = self._tasks.get(task_id)
201
- if not task:
202
- return False
203
- for tc in task.tool_calls:
204
- if tc.id == tool_id:
205
- tc.output = output
206
- tc.duration_ms = duration_ms
207
- return True
208
- return False
209
-
210
- def add_timeline_entry(self, task_id: str, event: str, detail: str = "") -> bool:
211
- task = self._tasks.get(task_id)
212
- if not task:
213
- return False
214
- from onecode.tasks.models import TaskTimelineEntry
215
- task.timeline.append(TaskTimelineEntry(timestamp=datetime.utcnow(), event=event, detail=detail))
216
- return True
217
-
218
- async def stop(self) -> None:
219
- self._shutdown = True
220
- if self._worker_task:
221
- self._worker_task.cancel()
222
- try:
223
- await self._worker_task
224
- except asyncio.CancelledError:
225
- pass
226
- if self._running:
227
- results = await asyncio.gather(
228
- *self._running.values(), return_exceptions=True,
229
- )
230
- for tid, res in zip(list(self._running.keys()), results):
231
- if isinstance(res, Exception):
232
- logger.warning("Task %s exited with error: %s", tid, res)
@@ -1,240 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass, field
4
- from datetime import datetime
5
- from enum import Enum
6
- from typing import Any, Optional
7
- from pathlib import Path
8
-
9
-
10
- class TaskStatus(str, Enum):
11
- QUEUED = "queued"
12
- RUNNING = "running"
13
- COMPLETED = "completed"
14
- FAILED = "failed"
15
- CANCELED = "canceled"
16
-
17
-
18
- class TodoStatus(str, Enum):
19
- PENDING = "pending"
20
- IN_PROGRESS = "in_progress"
21
- COMPLETED = "completed"
22
-
23
-
24
- @dataclass
25
- class TaskChecklistItem:
26
- id: int
27
- content: str
28
- status: str = "pending"
29
-
30
- def to_dict(self) -> dict:
31
- return {"id": self.id, "content": self.content, "status": self.status}
32
-
33
- @classmethod
34
- def from_dict(cls, data: dict) -> TaskChecklistItem:
35
- return cls(
36
- id=data["id"],
37
- content=data["content"],
38
- status=data.get("status", "pending"),
39
- )
40
-
41
-
42
- @dataclass
43
- class TodoItem:
44
- id: int
45
- content: str
46
- status: TodoStatus = TodoStatus.PENDING
47
-
48
- def to_dict(self) -> dict:
49
- return {"id": self.id, "content": self.content, "status": self.status.value}
50
-
51
- @classmethod
52
- def from_dict(cls, data: dict) -> TodoItem:
53
- return cls(
54
- id=data["id"],
55
- content=data["content"],
56
- status=TodoStatus(data.get("status", "pending")),
57
- )
58
-
59
-
60
- @dataclass
61
- class TaskChecklistState:
62
- items: list[TaskChecklistItem] = field(default_factory=list)
63
- completion_pct: int = 0
64
- in_progress_id: Optional[int] = None
65
- updated_at: Optional[datetime] = None
66
-
67
- def add(self, content: str, status: str = "pending") -> TaskChecklistItem:
68
- next_id = max([0] + [item.id for item in self.items]) + 1
69
- item = TaskChecklistItem(id=next_id, content=content, status=status)
70
- self.items.append(item)
71
- self._recalc()
72
- return item
73
-
74
- def update_status(self, item_id: int, status: str) -> bool:
75
- for item in self.items:
76
- if item.id == item_id:
77
- item.status = status
78
- self._recalc()
79
- return True
80
- return False
81
-
82
- def remove(self, item_id: int) -> bool:
83
- for i, item in enumerate(self.items):
84
- if item.id == item_id:
85
- self.items.pop(i)
86
- self._recalc()
87
- return True
88
- return False
89
-
90
- def _recalc(self) -> None:
91
- if not self.items:
92
- self.completion_pct = 0
93
- self.in_progress_id = None
94
- else:
95
- completed = sum(1 for item in self.items if item.status == "completed")
96
- self.completion_pct = int(100 * completed / len(self.items))
97
- in_progress = next((item.id for item in self.items if item.status == "in_progress"), None)
98
- self.in_progress_id = in_progress
99
- self.updated_at = datetime.utcnow()
100
-
101
- def to_dict(self) -> dict:
102
- return {
103
- "items": [item.to_dict() for item in self.items],
104
- "completion_pct": self.completion_pct,
105
- "in_progress_id": self.in_progress_id,
106
- "updated_at": self.updated_at.isoformat() if self.updated_at else None,
107
- }
108
-
109
- @classmethod
110
- def from_dict(cls, data: dict) -> TaskChecklistState:
111
- return cls(
112
- items=[TaskChecklistItem.from_dict(d) for d in data.get("items", [])],
113
- completion_pct=data.get("completion_pct", 0),
114
- in_progress_id=data.get("in_progress_id"),
115
- updated_at=datetime.fromisoformat(data["updated_at"]) if data.get("updated_at") else None,
116
- )
117
-
118
-
119
- @dataclass
120
- class TaskGateRecord:
121
- id: str
122
- gate: str
123
- command: str
124
- exit_code: Optional[int] = None
125
- status: str = "pending"
126
- classification: str = ""
127
- duration_ms: int = 0
128
- summary: str = ""
129
- log_path: Optional[Path] = None
130
-
131
-
132
- @dataclass
133
- class TaskToolCallSummary:
134
- id: str
135
- name: str
136
- input: dict[str, Any]
137
- output: str = ""
138
- duration_ms: int = 0
139
-
140
-
141
- @dataclass
142
- class TaskTimelineEntry:
143
- timestamp: datetime
144
- event: str
145
- detail: str = ""
146
-
147
-
148
- @dataclass
149
- class TaskRecord:
150
- id: str
151
- prompt: str
152
- model: str
153
- workspace: Path
154
- status: TaskStatus = TaskStatus.QUEUED
155
- created_at: datetime = field(default_factory=datetime.utcnow)
156
- started_at: Optional[datetime] = None
157
- ended_at: Optional[datetime] = None
158
- duration_ms: Optional[int] = None
159
- checklist: TaskChecklistState = field(default_factory=TaskChecklistState)
160
- gates: list[TaskGateRecord] = field(default_factory=list)
161
- tool_calls: list[TaskToolCallSummary] = field(default_factory=list)
162
- timeline: list[TaskTimelineEntry] = field(default_factory=list)
163
- artifacts: list[str] = field(default_factory=list)
164
- error: Optional[str] = None
165
-
166
- def to_dict(self) -> dict:
167
- return {
168
- "id": self.id,
169
- "prompt": self.prompt,
170
- "model": self.model,
171
- "workspace": str(self.workspace),
172
- "status": self.status.value,
173
- "created_at": self.created_at.isoformat(),
174
- "started_at": self.started_at.isoformat() if self.started_at else None,
175
- "ended_at": self.ended_at.isoformat() if self.ended_at else None,
176
- "duration_ms": self.duration_ms,
177
- "checklist": self.checklist.to_dict(),
178
- "gates": [
179
- {
180
- "id": g.id,
181
- "gate": g.gate,
182
- "command": g.command,
183
- "exit_code": g.exit_code,
184
- "status": g.status,
185
- "classification": g.classification,
186
- "duration_ms": g.duration_ms,
187
- "summary": g.summary,
188
- "log_path": str(g.log_path) if g.log_path else None,
189
- }
190
- for g in self.gates
191
- ],
192
- "tool_calls": [
193
- {
194
- "id": tc.id,
195
- "name": tc.name,
196
- "input": tc.input,
197
- "output": tc.output,
198
- "duration_ms": tc.duration_ms,
199
- }
200
- for tc in self.tool_calls
201
- ],
202
- "timeline": [
203
- {
204
- "timestamp": t.timestamp.isoformat(),
205
- "event": t.event,
206
- "detail": t.detail,
207
- }
208
- for t in self.timeline
209
- ],
210
- "artifacts": self.artifacts,
211
- "error": self.error,
212
- }
213
-
214
- @classmethod
215
- def from_dict(cls, data: dict) -> TaskRecord:
216
- from datetime import datetime
217
- return cls(
218
- id=data["id"],
219
- prompt=data["prompt"],
220
- model=data["model"],
221
- workspace=Path(data["workspace"]),
222
- status=TaskStatus(data.get("status", "queued")),
223
- created_at=datetime.fromisoformat(data["created_at"]) if data.get("created_at") else datetime.utcnow(),
224
- started_at=datetime.fromisoformat(data["started_at"]) if data.get("started_at") else None,
225
- ended_at=datetime.fromisoformat(data["ended_at"]) if data.get("ended_at") else None,
226
- duration_ms=data.get("duration_ms"),
227
- checklist=TaskChecklistState.from_dict(data.get("checklist", {})),
228
- gates=[TaskGateRecord(**g) for g in data.get("gates", [])],
229
- tool_calls=[TaskToolCallSummary(**tc) for tc in data.get("tool_calls", [])],
230
- timeline=[
231
- TaskTimelineEntry(
232
- timestamp=datetime.fromisoformat(t["timestamp"]),
233
- event=t["event"],
234
- detail=t.get("detail", ""),
235
- )
236
- for t in data.get("timeline", [])
237
- ],
238
- artifacts=data.get("artifacts", []),
239
- error=data.get("error"),
240
- )
File without changes