@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,739 +0,0 @@
1
- """Typed message model for agent interactions.
2
-
3
- Inspired by DeepSeek-TUI's structured message hierarchy:
4
- - AgentMessage: base with id, role, type, timestamp
5
- - ThinkBlock: collapsible thinking/reasoning
6
- - ToolCall: with name, args, lifecycle status
7
- - ToolResult: typed by tool category
8
- - SubAgentBlock: independent lifecycle tracking
9
- - HistoryCell: unified renderable cell (mirrors DeepSeek-TUI's core rendering model)
10
- - ErrorSeverity: severity taxonomy for error cells
11
- """
12
-
13
- from __future__ import annotations
14
-
15
- import sys
16
- import time
17
- import uuid
18
- from dataclasses import dataclass, field
19
- from enum import Enum
20
- from typing import Any, Optional
21
-
22
-
23
- def _now() -> float:
24
- return time.time()
25
-
26
-
27
- def _uid() -> str:
28
- return uuid.uuid4().hex[:12]
29
-
30
-
31
- # ── Status enums ──
32
-
33
- class MessageRole(str, Enum):
34
- USER = "user"
35
- ASSISTANT = "assistant"
36
- SYSTEM = "system"
37
- ERROR = "error"
38
-
39
-
40
- class BlockType(str, Enum):
41
- TEXT = "text"
42
- THINKING = "thinking"
43
- TOOL_CALL = "tool_call"
44
- TOOL_RESULT = "tool_result"
45
- SUBAGENT = "subagent"
46
-
47
-
48
- class LifecycleStatus(str, Enum):
49
- PENDING = "pending"
50
- RUNNING = "running"
51
- COMPLETE = "complete"
52
- FAILED = "failed"
53
- CANCELLED = "cancelled"
54
-
55
-
56
- class ErrorSeverity(str, Enum):
57
- """Categorized engine/tool error severity, mirroring DeepSeek-TUI."""
58
- ERROR = "error"
59
- WARNING = "warning"
60
- INFO = "info"
61
- CRITICAL = "critical"
62
-
63
-
64
- class RenderMode(str, Enum):
65
- """Controls whether tool/thinking cells render compact 'Live' or full 'Transcript' form."""
66
- LIVE = "live"
67
- TRANSCRIPT = "transcript"
68
-
69
-
70
- class ToolCategory(str, Enum):
71
- FILE_READ = "file_read"
72
- FILE_WRITE = "file_write"
73
- FILE_EDIT = "file_edit"
74
- FILE_LIST = "file_list"
75
- FILE_GLOB = "file_glob"
76
- FILE_GREP = "file_grep"
77
- BASH = "bash"
78
- WEB_FETCH = "web_fetch"
79
- WEB_SEARCH = "web_search"
80
- TASK = "task" # sub-agent
81
- TODO_MGMT = "todo_mgmt" # todo CRUD
82
- INTERACTION = "interaction" # user approval / AskUser
83
- UNKNOWN = "unknown"
84
-
85
-
86
- TOOL_CATEGORY_MAP: dict[str, ToolCategory] = {
87
- "Read": ToolCategory.FILE_READ,
88
- "Write": ToolCategory.FILE_WRITE,
89
- "Edit": ToolCategory.FILE_EDIT,
90
- "Insert": ToolCategory.FILE_EDIT,
91
- "UndoEdit": ToolCategory.FILE_EDIT,
92
- "List": ToolCategory.FILE_LIST,
93
- "Glob": ToolCategory.FILE_GLOB,
94
- "Grep": ToolCategory.FILE_GREP,
95
- "Bash": ToolCategory.BASH,
96
- "WebFetch": ToolCategory.WEB_FETCH,
97
- "WebSearch": ToolCategory.WEB_SEARCH,
98
- "Spawn": ToolCategory.TASK,
99
- "SendMessage": ToolCategory.INTERACTION,
100
- "Agent": ToolCategory.TASK,
101
- "ToolSearch": ToolCategory.TODO_MGMT,
102
- "TodoCreate": ToolCategory.TODO_MGMT,
103
- "TodoGet": ToolCategory.TODO_MGMT,
104
- "TodoList": ToolCategory.TODO_MGMT,
105
- "TodoUpdate": ToolCategory.TODO_MGMT,
106
- "TodoOutput": ToolCategory.TODO_MGMT,
107
- "TodoStop": ToolCategory.TODO_MGMT,
108
- "TodoClear": ToolCategory.TODO_MGMT,
109
- "AskUser": ToolCategory.INTERACTION,
110
- }
111
-
112
-
113
- def get_tool_category(name: str) -> ToolCategory:
114
- return TOOL_CATEGORY_MAP.get(name, ToolCategory.UNKNOWN)
115
-
116
-
117
- # ── Core data types ──
118
-
119
- @dataclass
120
- class ThinkBlock:
121
- """A thinking/reasoning block — collapsible in UI."""
122
- id: str = field(default_factory=_uid)
123
- content: str = ""
124
- timestamp: float = field(default_factory=_now)
125
-
126
- def to_dict(self) -> dict:
127
- return {
128
- "type": BlockType.THINKING.value,
129
- "thinking": self.content,
130
- }
131
-
132
- @classmethod
133
- def from_dict(cls, d: dict) -> "ThinkBlock":
134
- return cls(content=d.get("thinking", ""))
135
-
136
-
137
- @dataclass
138
- class ToolCall:
139
- """A tool invocation with lifecycle status."""
140
- id: str = field(default_factory=_uid)
141
- name: str = ""
142
- arguments: dict[str, Any] = field(default_factory=dict)
143
- status: LifecycleStatus = LifecycleStatus.RUNNING
144
- timestamp: float = field(default_factory=_now)
145
- category: ToolCategory = ToolCategory.UNKNOWN
146
- caller: str = "agent"
147
-
148
- def __post_init__(self):
149
- if self.category == ToolCategory.UNKNOWN:
150
- self.category = get_tool_category(self.name)
151
-
152
- def to_dict(self) -> dict:
153
- return {
154
- "type": BlockType.TOOL_CALL.value,
155
- "tool_use": {
156
- "id": self.id,
157
- "name": self.name,
158
- "input": self.arguments,
159
- "caller": self.caller,
160
- "status": self.status.value,
161
- "category": self.category.value,
162
- }
163
- }
164
-
165
- @classmethod
166
- def from_dict(cls, d: dict) -> "ToolCall":
167
- tu = d.get("tool_use", {})
168
- return cls(
169
- id=tu.get("id", ""),
170
- name=tu.get("name", ""),
171
- arguments=tu.get("input", {}),
172
- status=LifecycleStatus(tu.get("status", "running")),
173
- category=ToolCategory(tu.get("category", "unknown")),
174
- caller=tu.get("caller", "agent"),
175
- )
176
-
177
-
178
- @dataclass
179
- class ToolResult:
180
- """Result of a tool execution — typed by tool category."""
181
- tool_use_id: str = ""
182
- content: str = ""
183
- is_error: bool = False
184
- category: ToolCategory = ToolCategory.UNKNOWN
185
- truncated: bool = False
186
- full_size: int = 0
187
- timestamp: float = field(default_factory=_now)
188
-
189
- def to_dict(self) -> dict:
190
- return {
191
- "type": BlockType.TOOL_RESULT.value,
192
- "tool_result": {
193
- "tool_use_id": self.tool_use_id,
194
- "content": self.content,
195
- "is_error": self.is_error,
196
- "category": self.category.value,
197
- "truncated": self.truncated,
198
- "full_size": self.full_size,
199
- }
200
- }
201
-
202
- @classmethod
203
- def from_dict(cls, d: dict) -> "ToolResult":
204
- tr = d.get("tool_result", {})
205
- return cls(
206
- tool_use_id=tr.get("tool_use_id", ""),
207
- content=tr.get("content", ""),
208
- is_error=tr.get("is_error", False),
209
- category=ToolCategory(tr.get("category", "unknown")),
210
- truncated=tr.get("truncated", False),
211
- full_size=tr.get("full_size", 0),
212
- )
213
-
214
-
215
- @dataclass
216
- class SubAgentBlock:
217
- """A sub-agent execution with independent lifecycle."""
218
- id: str = field(default_factory=_uid)
219
- agent_type: str = "general"
220
- prompt: str = ""
221
- status: LifecycleStatus = LifecycleStatus.PENDING
222
- result: str = ""
223
- error: str = ""
224
- timestamp: float = field(default_factory=_now)
225
- blocks: list[dict] = field(default_factory=list) # nested blocks streamed from sub-agent
226
-
227
- def to_dict(self) -> dict:
228
- return {
229
- "type": BlockType.SUBAGENT.value,
230
- "subagent": {
231
- "id": self.id,
232
- "agent_type": self.agent_type,
233
- "prompt": self.prompt,
234
- "status": self.status.value,
235
- "result": self.result,
236
- "error": self.error,
237
- "blocks": self.blocks,
238
- }
239
- }
240
-
241
- @classmethod
242
- def from_dict(cls, d: dict) -> "SubAgentBlock":
243
- sa = d.get("subagent", {})
244
- return cls(
245
- id=sa.get("id", ""),
246
- agent_type=sa.get("agent_type", "general"),
247
- prompt=sa.get("prompt", ""),
248
- status=LifecycleStatus(sa.get("status", "pending")),
249
- result=sa.get("result", ""),
250
- error=sa.get("error", ""),
251
- blocks=sa.get("blocks", []),
252
- )
253
-
254
-
255
- @dataclass
256
- class TextBlock:
257
- """A plain text block."""
258
- id: str = field(default_factory=_uid)
259
- content: str = ""
260
-
261
- def to_dict(self) -> dict:
262
- return {
263
- "type": BlockType.TEXT.value,
264
- "text": self.content,
265
- }
266
-
267
-
268
- # ── Stream events (ai-sdk-python style typed protocol) ──
269
-
270
- class StreamEventType(str, Enum):
271
- TEXT_DELTA = "text_delta"
272
- THINKING = "thinking"
273
- TOOL_CALL_START = "tool_call_start"
274
- TOOL_CALL_ARGS = "tool_call_args"
275
- TOOL_CALL_COMPLETE = "tool_call_complete"
276
- TOOL_RESULT = "tool_result"
277
- ASK_USER = "ask_user"
278
- ERROR = "error"
279
- PLAN = "plan"
280
- SUBAGENT_START = "subagent_start"
281
- SUBAGENT_CHUNK = "subagent_chunk"
282
- SUBAGENT_THINKING = "subagent_thinking"
283
- SUBAGENT_END = "subagent_end"
284
- # A tool invoked *inside* a subagent, forwarded to the parent so the TUI
285
- # can render it as a real ToolCall card inside the SubAgent widget (same
286
- # style as main-conversation tools) instead of a plain "[Tool: X]" line.
287
- SUBAGENT_TOOL_CALL = "subagent_tool_call"
288
- SUBAGENT_TOOL_RESULT = "subagent_tool_result"
289
-
290
-
291
- @dataclass
292
- class StreamEvent:
293
- """Typed streaming event — replaces raw XML string protocol between Engine and TUI.
294
-
295
- ai-sdk-python reference:
296
- - textStream equivalent: TEXT_DELTA events
297
- - fullStream equivalent: TOOL_CALL_START → TOOL_CALL_ARGS → TOOL_RESULT + TEXT_DELTA
298
- """
299
- type: StreamEventType
300
- # TEXT_DELTA fields
301
- text: str = ""
302
- # THINKING fields
303
- thinking: str = ""
304
- # TOOL_CALL_START fields
305
- tool_name: str = ""
306
- tool_id: str = ""
307
- tool_category: ToolCategory = ToolCategory.UNKNOWN
308
- # TOOL_CALL_ARGS / TOOL_CALL_COMPLETE fields
309
- tool_args: dict[str, Any] = field(default_factory=dict)
310
- tool_args_delta: str = ""
311
- # TOOL_RESULT fields
312
- result_content: str = ""
313
- result_is_error: bool = False
314
- result_category: ToolCategory = ToolCategory.UNKNOWN
315
- # ASK_USER fields
316
- ask_action: str = ""
317
- ask_question: str = ""
318
- ask_context: str = ""
319
- ask_options: list[dict] = field(default_factory=list)
320
- ask_questions: list[dict] = field(default_factory=list)
321
- ask_action_type: str = ""
322
- ask_path: str = ""
323
- ask_command: str = ""
324
- # ERROR fields
325
- error_message: str = ""
326
- # PLAN fields
327
- plan_entries: list[dict] = field(default_factory=list)
328
- # SUBAGENT fields
329
- subagent_id: str = ""
330
- subagent_type: str = ""
331
- subagent_text: str = ""
332
- subagent_prompt: str = ""
333
- subagent_thinking_text: str = ""
334
- subagent_status: str = ""
335
- subagent_error: str = ""
336
- # SUBAGENT_TOOL_CALL fields ("start" | "complete"; reuses tool_id/name/
337
- # category/args). SUBAGENT_TOOL_RESULT reuses tool_id/result_* and needs
338
- # tool_name for display when no prior TOOL_CALL_COMPLETE was captured.
339
- subagent_tool_phase: str = ""
340
-
341
- @classmethod
342
- def text_delta(cls, text: str) -> "StreamEvent":
343
- return cls(type=StreamEventType.TEXT_DELTA, text=text)
344
-
345
- @classmethod
346
- def thinking(cls, thought: str) -> "StreamEvent":
347
- return cls(type=StreamEventType.THINKING, thinking=thought)
348
-
349
- @classmethod
350
- def tool_call_start(cls, name: str, call_id: str) -> "StreamEvent":
351
- return cls(
352
- type=StreamEventType.TOOL_CALL_START,
353
- tool_name=name,
354
- tool_id=call_id,
355
- tool_category=get_tool_category(name),
356
- )
357
-
358
- @classmethod
359
- def tool_call_args_delta(cls, call_id: str, name: str, args_delta: str) -> "StreamEvent":
360
- return cls(
361
- type=StreamEventType.TOOL_CALL_ARGS,
362
- tool_id=call_id,
363
- tool_name=name,
364
- tool_category=get_tool_category(name),
365
- tool_args_delta=args_delta,
366
- )
367
-
368
- @classmethod
369
- def tool_call_complete(cls, call_id: str, name: str, arguments: dict[str, Any]) -> "StreamEvent":
370
- return cls(
371
- type=StreamEventType.TOOL_CALL_COMPLETE,
372
- tool_id=call_id,
373
- tool_name=name,
374
- tool_category=get_tool_category(name),
375
- tool_args=arguments,
376
- )
377
-
378
- @classmethod
379
- def tool_result(cls, call_id: str, content: str, is_error: bool = False,
380
- category: ToolCategory = ToolCategory.UNKNOWN) -> "StreamEvent":
381
- return cls(
382
- type=StreamEventType.TOOL_RESULT,
383
- tool_id=call_id,
384
- result_content=content,
385
- result_is_error=is_error,
386
- result_category=category,
387
- )
388
-
389
- @classmethod
390
- def ask_user(cls, call_id: str, action: str, question: str,
391
- context: str = "", action_type: str = "",
392
- path: str = "", command: str = "",
393
- options: list[dict] | None = None,
394
- questions: list[dict] | None = None) -> "StreamEvent":
395
- return cls(
396
- type=StreamEventType.ASK_USER,
397
- tool_id=call_id,
398
- ask_action=action,
399
- ask_question=question,
400
- ask_context=context,
401
- ask_options=options or [],
402
- ask_questions=questions or [],
403
- ask_action_type=action_type,
404
- ask_path=path,
405
- ask_command=command,
406
- )
407
-
408
- @classmethod
409
- def error(cls, message: str) -> "StreamEvent":
410
- return cls(type=StreamEventType.ERROR, error_message=message)
411
-
412
- @classmethod
413
- def plan(cls, entries: list[dict]) -> "StreamEvent":
414
- """Create a plan update event.
415
-
416
- Args:
417
- entries: List of plan entries, each with:
418
- - content: str - The todo description
419
- - status: str - "pending" | "in_progress" | "completed"
420
- - priority: str - "high" | "medium" | "low"
421
- """
422
- return cls(type=StreamEventType.PLAN, plan_entries=entries)
423
-
424
- @classmethod
425
- def subagent_start(cls, agent_type: str, call_id: str, prompt: str = "") -> "StreamEvent":
426
- return cls(
427
- type=StreamEventType.SUBAGENT_START,
428
- subagent_id=call_id,
429
- subagent_type=agent_type,
430
- subagent_prompt=prompt,
431
- )
432
-
433
- @classmethod
434
- def subagent_chunk(cls, call_id: str, text: str) -> "StreamEvent":
435
- return cls(
436
- type=StreamEventType.SUBAGENT_CHUNK,
437
- subagent_id=call_id,
438
- subagent_text=text,
439
- )
440
-
441
- @classmethod
442
- def subagent_thinking(cls, call_id: str, text: str) -> "StreamEvent":
443
- return cls(
444
- type=StreamEventType.SUBAGENT_THINKING,
445
- subagent_id=call_id,
446
- subagent_thinking_text=text,
447
- )
448
-
449
- @classmethod
450
- def subagent_end(
451
- cls, call_id: str, agent_type: str = "", status: str = "completed", error: str = ""
452
- ) -> "StreamEvent":
453
- return cls(
454
- type=StreamEventType.SUBAGENT_END,
455
- subagent_id=call_id,
456
- subagent_type=agent_type,
457
- subagent_status=status,
458
- subagent_error=error,
459
- )
460
-
461
- @classmethod
462
- def subagent_tool_call(
463
- cls,
464
- subagent_id: str,
465
- phase: str,
466
- tool_id: str,
467
- tool_name: str,
468
- tool_category: ToolCategory = ToolCategory.UNKNOWN,
469
- tool_args: dict[str, Any] | None = None,
470
- ) -> "StreamEvent":
471
- """A tool invocation *inside* a subagent.
472
-
473
- ``phase`` is ``"start"`` (model began the call) or ``"complete"``
474
- (args fully streamed). Carries the parent Spawn ``subagent_id`` so
475
- the ACP can tag the emitted ``tool_call`` sessionUpdate and the TUI
476
- can mount the card inside the owning SubAgent widget.
477
- """
478
- return cls(
479
- type=StreamEventType.SUBAGENT_TOOL_CALL,
480
- subagent_id=subagent_id,
481
- subagent_tool_phase=phase,
482
- tool_id=tool_id,
483
- tool_name=tool_name,
484
- tool_category=tool_category,
485
- tool_args=tool_args or {},
486
- )
487
-
488
- @classmethod
489
- def subagent_tool_result(
490
- cls,
491
- subagent_id: str,
492
- tool_id: str,
493
- tool_name: str,
494
- result_content: str,
495
- is_error: bool = False,
496
- category: ToolCategory = ToolCategory.UNKNOWN,
497
- ) -> "StreamEvent":
498
- """Result of a tool invoked *inside* a subagent."""
499
- return cls(
500
- type=StreamEventType.SUBAGENT_TOOL_RESULT,
501
- subagent_id=subagent_id,
502
- tool_id=tool_id,
503
- tool_name=tool_name,
504
- result_content=result_content,
505
- result_is_error=is_error,
506
- result_category=category,
507
- )
508
-
509
- @staticmethod
510
- def is_text(event: "StreamEvent") -> bool:
511
- return event.type in (StreamEventType.TEXT_DELTA, StreamEventType.THINKING)
512
-
513
- def to_block_dict(self) -> dict:
514
- """Convert this stream event to a block dict for TUI rendering."""
515
- if self.type == StreamEventType.TEXT_DELTA:
516
- return TextBlock(content=self.text).to_dict()
517
- elif self.type == StreamEventType.THINKING:
518
- return ThinkBlock(content=self.thinking).to_dict()
519
- elif self.type == StreamEventType.TOOL_CALL_START:
520
- return {
521
- "type": "tool_use_start",
522
- "tool_use": {
523
- "name": self.tool_name,
524
- "id": self.tool_id,
525
- "category": self.tool_category.value,
526
- }
527
- }
528
- elif self.type == StreamEventType.TOOL_CALL_COMPLETE:
529
- return ToolCall(
530
- id=self.tool_id,
531
- name=self.tool_name,
532
- arguments=self.tool_args,
533
- status=LifecycleStatus.COMPLETE,
534
- category=self.tool_category,
535
- ).to_dict()
536
- elif self.type == StreamEventType.TOOL_RESULT:
537
- return ToolResult(
538
- tool_use_id=self.tool_id,
539
- content=self.result_content,
540
- is_error=self.result_is_error,
541
- category=self.result_category,
542
- ).to_dict()
543
- elif self.type == StreamEventType.ASK_USER:
544
- result = {
545
- "type": "ask_user",
546
- "ask_user": {
547
- "tool_use_id": self.tool_id,
548
- "action": self.ask_action,
549
- "category": self.tool_category.value,
550
- "question": self.ask_question,
551
- "context": self.ask_context,
552
- "options": self.ask_options,
553
- "questions": self.ask_questions,
554
- "action_type": self.ask_action_type,
555
- "path": self.ask_path,
556
- "command": self.ask_command,
557
- }
558
- }
559
- return result
560
- elif self.type == StreamEventType.ERROR:
561
- return TextBlock(content=f"[Error: {self.error_message}]").to_dict()
562
- elif self.type == StreamEventType.SUBAGENT_START:
563
- return {
564
- "type": "subagent_start",
565
- "subagent": {
566
- "id": self.subagent_id,
567
- "agent_type": self.subagent_type,
568
- "status": "running",
569
- }
570
- }
571
- elif self.type == StreamEventType.SUBAGENT_CHUNK:
572
- return {
573
- "type": "subagent_chunk",
574
- "subagent": {
575
- "id": self.subagent_id,
576
- "text": self.subagent_text,
577
- }
578
- }
579
- elif self.type == StreamEventType.SUBAGENT_END:
580
- return {
581
- "type": "subagent_end",
582
- "subagent": {
583
- "id": self.subagent_id,
584
- "status": "completed",
585
- }
586
- }
587
- return TextBlock(content="").to_dict()
588
-
589
-
590
- # ── Unified block type ──
591
-
592
- if sys.version_info >= (3, 10):
593
- AgentBlock = ThinkBlock | ToolCall | ToolResult | SubAgentBlock | TextBlock
594
- else:
595
- from typing import Union
596
- AgentBlock = Union[ThinkBlock, ToolCall, ToolResult, SubAgentBlock, TextBlock]
597
- StreamEventOrStr = "StreamEvent | str" # Marker type for documentation
598
-
599
-
600
- def block_from_dict(d: dict) -> AgentBlock:
601
- """Parse a raw dict into a typed AgentBlock."""
602
- btype = d.get("type", "")
603
- if btype == "thinking":
604
- return ThinkBlock.from_dict(d)
605
- elif btype == "tool_use" or btype == "tool_call":
606
- if "tool_use" not in d:
607
- d = {"type": "tool_call", "tool_use": d.get("tool_use", {})}
608
- return ToolCall.from_dict(d)
609
- elif btype == "tool_result":
610
- return ToolResult.from_dict(d)
611
- elif btype == "subagent":
612
- return SubAgentBlock.from_dict(d)
613
- elif btype == "text":
614
- return TextBlock(content=d.get("text", ""))
615
- elif btype == "tool_use_start":
616
- tu = d.get("tool_use", {})
617
- return ToolCall(
618
- id=tu.get("id", ""),
619
- name=tu.get("name", ""),
620
- status=LifecycleStatus.RUNNING,
621
- category=get_tool_category(tu.get("name", "")),
622
- )
623
- return TextBlock(content=str(d))
624
-
625
-
626
- # ── AgentMessage ──
627
-
628
- @dataclass
629
- class AgentMessage:
630
- """A turn-level message with typed content blocks."""
631
- id: str = field(default_factory=_uid)
632
- role: MessageRole = MessageRole.ASSISTANT
633
- blocks: list[AgentBlock] = field(default_factory=list)
634
- timestamp: float = field(default_factory=_now)
635
-
636
- def add_text(self, text: str) -> None:
637
- self.blocks.append(TextBlock(content=text))
638
-
639
- def add_thinking(self, content: str) -> None:
640
- self.blocks.append(ThinkBlock(content=content))
641
-
642
- def add_tool_call(self, tc: ToolCall) -> None:
643
- self.blocks.append(tc)
644
-
645
- def add_tool_result(self, tr: ToolResult) -> None:
646
- self.blocks.append(tr)
647
-
648
- def add_subagent(self, sa: SubAgentBlock) -> None:
649
- self.blocks.append(sa)
650
-
651
- @property
652
- def text_blocks(self) -> list[TextBlock]:
653
- return [b for b in self.blocks if isinstance(b, TextBlock)]
654
-
655
- @property
656
- def think_blocks(self) -> list[ThinkBlock]:
657
- return [b for b in self.blocks if isinstance(b, ThinkBlock)]
658
-
659
- @property
660
- def tool_calls(self) -> list[ToolCall]:
661
- return [b for b in self.blocks if isinstance(b, ToolCall)]
662
-
663
- @property
664
- def tool_results(self) -> list[ToolResult]:
665
- return [b for b in self.blocks if isinstance(b, ToolResult)]
666
-
667
- @property
668
- def subagents(self) -> list[SubAgentBlock]:
669
- return [b for b in self.blocks if isinstance(b, SubAgentBlock)]
670
-
671
- @property
672
- def text(self) -> str:
673
- return "\n".join(b.content for b in self.text_blocks)
674
-
675
- @property
676
- def thinking(self) -> str:
677
- return "\n\n".join(b.content for b in self.think_blocks)
678
-
679
- def get_tool_result(self, tool_use_id: str) -> Optional[ToolResult]:
680
- for tr in self.tool_results:
681
- if tr.tool_use_id == tool_use_id:
682
- return tr
683
- return None
684
-
685
- def to_dict(self) -> dict:
686
- return {
687
- "id": self.id,
688
- "role": self.role.value,
689
- "blocks": [b.to_dict() for b in self.blocks],
690
- "timestamp": self.timestamp,
691
- }
692
-
693
- @classmethod
694
- def from_dict(cls, d: dict) -> "AgentMessage":
695
- return cls(
696
- id=d.get("id", ""),
697
- role=MessageRole(d.get("role", "assistant")),
698
- blocks=[block_from_dict(b) for b in d.get("blocks", [])],
699
- timestamp=d.get("timestamp", 0),
700
- )
701
-
702
-
703
- # ── Conversation ──
704
-
705
- @dataclass
706
- class Conversation:
707
- """Full conversation history with typed messages."""
708
- id: str = field(default_factory=lambda: uuid.uuid4().hex[:16])
709
- messages: list[AgentMessage] = field(default_factory=list)
710
- created_at: float = field(default_factory=_now)
711
-
712
- def add_message(self, msg: AgentMessage) -> None:
713
- self.messages.append(msg)
714
-
715
- def new_message(self, role: MessageRole = MessageRole.ASSISTANT) -> AgentMessage:
716
- msg = AgentMessage(role=role)
717
- self.messages.append(msg)
718
- return msg
719
-
720
- def get_last_assistant(self) -> Optional[AgentMessage]:
721
- for m in reversed(self.messages):
722
- if m.role == MessageRole.ASSISTANT:
723
- return m
724
- return None
725
-
726
- def to_dict(self) -> dict:
727
- return {
728
- "id": self.id,
729
- "messages": [m.to_dict() for m in self.messages],
730
- "created_at": self.created_at,
731
- }
732
-
733
- @classmethod
734
- def from_dict(cls, d: dict) -> "Conversation":
735
- return cls(
736
- id=d.get("id", ""),
737
- messages=[AgentMessage.from_dict(m) for m in d.get("messages", [])],
738
- created_at=d.get("created_at", 0),
739
- )