@scemoon/cdh 1.0.5 → 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 (551) hide show
  1. package/package.json +2 -2
  2. package/run.js +68 -14
  3. package/ai-dlc-skill/SKILL.md +0 -77
  4. package/ai-dlc-skill/agents/deliver-agent.md +0 -24
  5. package/ai-dlc-skill/agents/master.md +0 -50
  6. package/ai-dlc-skill/agents/plan-agent.md +0 -23
  7. package/ai-dlc-skill/agents/understand-agent.md +0 -23
  8. package/ai-dlc-skill/agents/verify-agent.md +0 -27
  9. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  10. package/ai-dlc-skill/brownfield/README.md +0 -30
  11. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  12. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  13. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  14. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  15. package/ai-dlc-skill/components/backend.md +0 -34
  16. package/ai-dlc-skill/components/desktop.md +0 -30
  17. package/ai-dlc-skill/components/mya.md +0 -29
  18. package/ai-dlc-skill/components/native.md +0 -30
  19. package/ai-dlc-skill/components/tta.md +0 -29
  20. package/ai-dlc-skill/components/web.md +0 -31
  21. package/ai-dlc-skill/components/wxa.md +0 -29
  22. package/ai-dlc-skill/contracts/README.md +0 -25
  23. package/ai-dlc-skill/core/adaptive-flow.md +0 -36
  24. package/ai-dlc-skill/core/security.md +0 -29
  25. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
  26. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
  27. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
  28. package/ai-dlc-skill/cross-tool/export.sh +0 -22
  29. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
  30. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
  31. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
  32. package/ai-dlc-skill/phases/deliver/entry.md +0 -26
  33. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  34. package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
  35. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  36. package/ai-dlc-skill/phases/plan/entry.md +0 -25
  37. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
  38. package/ai-dlc-skill/phases/plan/prompt.md +0 -38
  39. package/ai-dlc-skill/phases/plan/rules.md +0 -25
  40. package/ai-dlc-skill/phases/understand/entry.md +0 -26
  41. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  42. package/ai-dlc-skill/phases/understand/prompt.md +0 -41
  43. package/ai-dlc-skill/phases/understand/rules.md +0 -37
  44. package/ai-dlc-skill/phases/verify/entry.md +0 -26
  45. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
  46. package/ai-dlc-skill/phases/verify/prompt.md +0 -43
  47. package/ai-dlc-skill/phases/verify/rules.md +0 -73
  48. package/ai-dlc-skill/practices/bdd.md +0 -91
  49. package/ai-dlc-skill/practices/sdd.md +0 -84
  50. package/ai-dlc-skill/practices/tdd.md +0 -95
  51. package/ai-dlc-skill/providers/README.md +0 -114
  52. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  53. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  54. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  55. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
  56. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  57. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  58. package/ai-dlc-skill/requirements.md +0 -140
  59. package/ai-dlc-skill/skill.yaml +0 -147
  60. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  61. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  62. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  63. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  64. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  65. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  66. package/ai-dlc-skill/templates/plan/design.md +0 -49
  67. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  68. package/ai-dlc-skill/templates/project/README.md +0 -126
  69. package/ai-dlc-skill/templates/project/template.md +0 -119
  70. package/ai-dlc-skill/templates/understand/feature.feature +0 -23
  71. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  72. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  73. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  74. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  75. package/ai-dlc-skill/walkthrough/template.md +0 -54
  76. package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
  77. package/ai-dlc-skill/workflows/deployment.yaml +0 -199
  78. package/cdh/__init__.py +0 -0
  79. package/cdh/__main__.py +0 -4
  80. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
  82. package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
  83. package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
  84. package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
  85. package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
  86. package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
  87. package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
  88. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  89. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  90. package/cdh/cdh_mcp_injector.py +0 -115
  91. package/cdh/cdh_mcp_loader.py +0 -67
  92. package/cdh/cdh_mcp_manager.py +0 -73
  93. package/cdh/cdh_session_aggregator.py +0 -258
  94. package/cdh/cdh_skill_manager.py +0 -105
  95. package/cdh/cli.py +0 -758
  96. package/cdh/scaffold.py +0 -728
  97. package/onecode/__init__.py +0 -1
  98. package/onecode/__main__.py +0 -4
  99. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  100. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  101. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  102. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  103. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  104. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  105. package/onecode/agent/__init__.py +0 -0
  106. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  107. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  108. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  109. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  110. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  111. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  112. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  113. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  114. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  115. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  116. package/onecode/agent/agents/__init__.py +0 -29
  117. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  118. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  119. package/onecode/agent/agents/types.py +0 -589
  120. package/onecode/agent/attachments.py +0 -112
  121. package/onecode/agent/cdh_loader.py +0 -267
  122. package/onecode/agent/context.py +0 -343
  123. package/onecode/agent/engine.py +0 -2700
  124. package/onecode/agent/hooks.py +0 -86
  125. package/onecode/agent/onecode_agent_acp.py +0 -2743
  126. package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
  127. package/onecode/agent/permissions.py +0 -150
  128. package/onecode/agent/permissions_store.py +0 -62
  129. package/onecode/agent/project_doc.py +0 -19
  130. package/onecode/agent/session.py +0 -195
  131. package/onecode/agent/snapshot.py +0 -144
  132. package/onecode/agent/tools/__init__.py +0 -17
  133. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  145. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  146. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  147. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  148. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  149. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  150. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  151. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  152. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  153. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  154. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  155. package/onecode/agent/tools/agent_tools.py +0 -132
  156. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  157. package/onecode/agent/tools/bash_tool.py +0 -111
  158. package/onecode/agent/tools/communication_tools.py +0 -148
  159. package/onecode/agent/tools/config_tool.py +0 -130
  160. package/onecode/agent/tools/cron_tools.py +0 -178
  161. package/onecode/agent/tools/errors.py +0 -17
  162. package/onecode/agent/tools/file_ops.py +0 -221
  163. package/onecode/agent/tools/file_tools.py +0 -225
  164. package/onecode/agent/tools/git_tools.py +0 -88
  165. package/onecode/agent/tools/lsp_tools.py +0 -404
  166. package/onecode/agent/tools/mcp_tools.py +0 -127
  167. package/onecode/agent/tools/permission_handler.py +0 -46
  168. package/onecode/agent/tools/permissions.py +0 -77
  169. package/onecode/agent/tools/protocol.py +0 -20
  170. package/onecode/agent/tools/registry.py +0 -201
  171. package/onecode/agent/tools/sandbox.py +0 -358
  172. package/onecode/agent/tools/schema_validation.py +0 -100
  173. package/onecode/agent/tools/skill_tools.py +0 -52
  174. package/onecode/agent/tools/todo_tools.py +0 -207
  175. package/onecode/agent/tools/web_tools.py +0 -169
  176. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  177. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  178. package/onecode/builtin_skills/git/SKILL.md +0 -64
  179. package/onecode/builtin_skills/git/skill.yaml +0 -7
  180. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  181. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  182. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  183. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  184. package/onecode/cli.py +0 -935
  185. package/onecode/cloud/__init__.py +0 -0
  186. package/onecode/cloud/base.py +0 -20
  187. package/onecode/codebase/__init__.py +0 -69
  188. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  190. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  191. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  192. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  193. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  194. package/onecode/codebase/chunker.py +0 -125
  195. package/onecode/codebase/indexer.py +0 -149
  196. package/onecode/codebase/retriever.py +0 -203
  197. package/onecode/codebase/storage.py +0 -131
  198. package/onecode/codebase/tools.py +0 -59
  199. package/onecode/commands.py +0 -596
  200. package/onecode/config.py +0 -314
  201. package/onecode/config_screen.py +0 -600
  202. package/onecode/cron/__init__.py +0 -3
  203. package/onecode/lsp/__init__.py +0 -3
  204. package/onecode/mcp/__init__.py +0 -4
  205. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  206. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  207. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  208. package/onecode/mcp/client.py +0 -193
  209. package/onecode/mcp/manager.py +0 -190
  210. package/onecode/memory/__init__.py +0 -49
  211. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  212. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  213. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  214. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  215. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  216. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  217. package/onecode/memory/backend.py +0 -159
  218. package/onecode/memory/pyramid.py +0 -133
  219. package/onecode/memory/recall.py +0 -203
  220. package/onecode/migrate.py +0 -122
  221. package/onecode/models/__init__.py +0 -4
  222. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  223. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  224. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  225. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  226. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  227. package/onecode/models/errors.py +0 -104
  228. package/onecode/models/messages.py +0 -739
  229. package/onecode/models/provider.py +0 -699
  230. package/onecode/models/providers/__init__.py +0 -17
  231. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  232. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  233. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  234. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  235. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  236. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  237. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  238. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  239. package/onecode/models/providers/anthropic_provider.py +0 -273
  240. package/onecode/models/providers/deepseek_provider.py +0 -212
  241. package/onecode/models/providers/glm_provider.py +0 -195
  242. package/onecode/models/providers/minimax_provider.py +0 -158
  243. package/onecode/models/providers/minimaxi_provider.py +0 -417
  244. package/onecode/models/providers/ollama_provider.py +0 -100
  245. package/onecode/models/providers/openai_provider.py +0 -237
  246. package/onecode/models/registry.py +0 -212
  247. package/onecode/server/__init__.py +0 -3
  248. package/onecode/server/app.py +0 -224
  249. package/onecode/skills/__init__.py +0 -11
  250. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  251. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  252. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  253. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  254. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  255. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  256. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  257. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  258. package/onecode/skills/argument_substitution.py +0 -38
  259. package/onecode/skills/bootstrap.py +0 -124
  260. package/onecode/skills/create.py +0 -56
  261. package/onecode/skills/frontmatter.py +0 -33
  262. package/onecode/skills/loader.py +0 -139
  263. package/onecode/skills/manager.py +0 -75
  264. package/onecode/skills/model.py +0 -43
  265. package/onecode/storage/__init__.py +0 -0
  266. package/onecode/storage/activity.py +0 -63
  267. package/onecode/storage/project.py +0 -54
  268. package/onecode/storage/session.py +0 -112
  269. package/onecode/tasks/__init__.py +0 -26
  270. package/onecode/tasks/manager.py +0 -232
  271. package/onecode/tasks/models.py +0 -240
  272. package/onecode/trace/__init__.py +0 -0
  273. package/onecode/trace/tracer.py +0 -173
  274. package/onecode/utils/__init__.py +0 -0
  275. package/onecode/utils/helpers.py +0 -20
  276. package/pyproject.toml +0 -74
  277. package/tui/__init__.py +0 -46
  278. package/tui/__main__.py +0 -4
  279. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/about.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  288. package/tui/__pycache__/app.cpython-313.pyc +0 -0
  289. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  308. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  309. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  310. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  311. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  312. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  313. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  314. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  315. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  316. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  317. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  318. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  319. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  320. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  321. package/tui/_loop.py +0 -86
  322. package/tui/_path_fuzzy_search.py +0 -48
  323. package/tui/_path_match.py +0 -141
  324. package/tui/about.py +0 -95
  325. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  326. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  327. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  328. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  329. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  330. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  331. package/tui/acp/agent.py +0 -1002
  332. package/tui/acp/api.py +0 -73
  333. package/tui/acp/encode_tool_call_id.py +0 -12
  334. package/tui/acp/messages.py +0 -203
  335. package/tui/acp/prompt.py +0 -53
  336. package/tui/acp/protocol.py +0 -499
  337. package/tui/agent.py +0 -70
  338. package/tui/agent_schema.py +0 -76
  339. package/tui/agents.py +0 -46
  340. package/tui/ansi/__init__.py +0 -1
  341. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  342. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  343. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  344. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  345. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  346. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  347. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  348. package/tui/ansi/_ansi.py +0 -1689
  349. package/tui/ansi/_ansi_colors.py +0 -264
  350. package/tui/ansi/_control_codes.py +0 -37
  351. package/tui/ansi/_keys.py +0 -251
  352. package/tui/ansi/_sgr_styles.py +0 -64
  353. package/tui/ansi/_stream_parser.py +0 -418
  354. package/tui/answer.py +0 -12
  355. package/tui/app.py +0 -1266
  356. package/tui/atomic.py +0 -37
  357. package/tui/cli.py +0 -313
  358. package/tui/code_analyze.py +0 -27
  359. package/tui/complete.py +0 -38
  360. package/tui/constants.py +0 -61
  361. package/tui/conversation_markdown.py +0 -30
  362. package/tui/danger.py +0 -372
  363. package/tui/data/agents/ampcode.com.toml +0 -52
  364. package/tui/data/agents/augmentcode.com.toml +0 -41
  365. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  366. package/tui/data/agents/claude.com.toml +0 -41
  367. package/tui/data/agents/copilot.github.com.toml +0 -29
  368. package/tui/data/agents/crowai.dev.toml +0 -36
  369. package/tui/data/agents/cursor.com.toml +0 -38
  370. package/tui/data/agents/deepagents.langchain.com +0 -34
  371. package/tui/data/agents/docker.com.toml +0 -60
  372. package/tui/data/agents/geminicli.com.toml +0 -28
  373. package/tui/data/agents/goose.ai.toml +0 -52
  374. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  375. package/tui/data/agents/kimi.com.toml +0 -35
  376. package/tui/data/agents/kiro.dev.toml +0 -43
  377. package/tui/data/agents/onecode.dev.toml +0 -22
  378. package/tui/data/agents/openai.com.toml +0 -53
  379. package/tui/data/agents/openclaw.ai.toml +0 -37
  380. package/tui/data/agents/opencode.ai.toml +0 -39
  381. package/tui/data/agents/openhands.dev.toml +0 -46
  382. package/tui/data/agents/stakpak.dev.toml +0 -62
  383. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  384. package/tui/data/agents/vtcode.dev.toml +0 -63
  385. package/tui/data/images/frog.png +0 -0
  386. package/tui/data/sounds/question.wav +0 -0
  387. package/tui/data/sounds/turn-over.wav +0 -0
  388. package/tui/db.py +0 -213
  389. package/tui/dec.py +0 -332
  390. package/tui/directory.py +0 -234
  391. package/tui/directory_suggester.py +0 -93
  392. package/tui/directory_watcher.py +0 -231
  393. package/tui/format_path.py +0 -25
  394. package/tui/fuzzy.py +0 -140
  395. package/tui/fuzzy_index.py +0 -275
  396. package/tui/gist.py +0 -33
  397. package/tui/history.py +0 -138
  398. package/tui/jsonrpc.py +0 -578
  399. package/tui/menus.py +0 -14
  400. package/tui/message_log.py +0 -69
  401. package/tui/messages.py +0 -144
  402. package/tui/option_content.py +0 -51
  403. package/tui/os.py +0 -0
  404. package/tui/path_complete.py +0 -217
  405. package/tui/path_filter.py +0 -124
  406. package/tui/paths.py +0 -87
  407. package/tui/pill.py +0 -23
  408. package/tui/platform_commands.py +0 -52
  409. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  410. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  411. package/tui/prompt/extract.py +0 -19
  412. package/tui/prompt/resource.py +0 -68
  413. package/tui/protocol.py +0 -28
  414. package/tui/screens/__init__.py +0 -0
  415. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  416. package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
  417. package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
  418. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  419. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  420. package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
  421. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  422. package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
  423. package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
  424. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  425. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  426. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  427. package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
  428. package/tui/screens/action_modal.py +0 -94
  429. package/tui/screens/agent_modal.py +0 -175
  430. package/tui/screens/command_edit_modal.py +0 -74
  431. package/tui/screens/component_picker.py +0 -168
  432. package/tui/screens/diff_screen.py +0 -84
  433. package/tui/screens/log.py +0 -553
  434. package/tui/screens/main.py +0 -385
  435. package/tui/screens/main.tcss +0 -655
  436. package/tui/screens/permissions.py +0 -404
  437. package/tui/screens/permissions.tcss +0 -72
  438. package/tui/screens/projects.tcss +0 -80
  439. package/tui/screens/projects_app.py +0 -347
  440. package/tui/screens/projects_screen.py +0 -284
  441. package/tui/screens/session_resume_modal.py +0 -172
  442. package/tui/screens/session_resume_modal.tcss +0 -35
  443. package/tui/screens/sessions.py +0 -164
  444. package/tui/screens/sessions.tcss +0 -119
  445. package/tui/screens/settings.py +0 -254
  446. package/tui/screens/settings.tcss +0 -101
  447. package/tui/screens/store.py +0 -500
  448. package/tui/screens/store.tcss +0 -274
  449. package/tui/screens/tool_content_screen.py +0 -59
  450. package/tui/session_tracker.py +0 -123
  451. package/tui/settings.py +0 -353
  452. package/tui/settings_schema.py +0 -431
  453. package/tui/shell.py +0 -304
  454. package/tui/shell_read.py +0 -42
  455. package/tui/slash_command.py +0 -34
  456. package/tui/tui.tcss +0 -246
  457. package/tui/twitter.py +0 -38
  458. package/tui/version.py +0 -80
  459. package/tui/visuals/__init__.py +0 -0
  460. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  461. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  462. package/tui/visuals/columns.py +0 -272
  463. package/tui/widgets/__init__.py +0 -0
  464. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  480. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  483. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  485. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  486. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  487. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  488. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  489. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  490. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  491. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  492. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  493. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  494. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  495. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  496. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  497. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  498. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  499. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  500. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  501. package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
  502. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  503. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  504. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  505. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  506. package/tui/widgets/acp_content.py +0 -70
  507. package/tui/widgets/agent_response.py +0 -76
  508. package/tui/widgets/agent_thought.py +0 -167
  509. package/tui/widgets/ask_user.py +0 -264
  510. package/tui/widgets/command_pane.py +0 -223
  511. package/tui/widgets/condensed_path.py +0 -115
  512. package/tui/widgets/context_stats.py +0 -66
  513. package/tui/widgets/conversation.py +0 -2641
  514. package/tui/widgets/danger_warning.py +0 -65
  515. package/tui/widgets/diff_view.py +0 -69
  516. package/tui/widgets/directory_input.py +0 -8
  517. package/tui/widgets/flash.py +0 -81
  518. package/tui/widgets/future_text.py +0 -126
  519. package/tui/widgets/grid_select.py +0 -234
  520. package/tui/widgets/highlighted_textarea.py +0 -180
  521. package/tui/widgets/load_more.py +0 -24
  522. package/tui/widgets/mandelbrot.py +0 -294
  523. package/tui/widgets/markdown_note.py +0 -13
  524. package/tui/widgets/menu.py +0 -147
  525. package/tui/widgets/modified_files.py +0 -306
  526. package/tui/widgets/non_selectable_label.py +0 -5
  527. package/tui/widgets/note.py +0 -18
  528. package/tui/widgets/path_search.py +0 -492
  529. package/tui/widgets/plan.py +0 -285
  530. package/tui/widgets/project_directory_tree.py +0 -102
  531. package/tui/widgets/project_grid_select.py +0 -64
  532. package/tui/widgets/project_summary.py +0 -33
  533. package/tui/widgets/prompt.py +0 -795
  534. package/tui/widgets/question.py +0 -360
  535. package/tui/widgets/session_grid_select.py +0 -230
  536. package/tui/widgets/session_summary.py +0 -115
  537. package/tui/widgets/session_tabs.py +0 -188
  538. package/tui/widgets/shell_result.py +0 -35
  539. package/tui/widgets/shell_terminal.py +0 -40
  540. package/tui/widgets/side_bar.py +0 -124
  541. package/tui/widgets/slash_complete.py +0 -235
  542. package/tui/widgets/strike_text.py +0 -70
  543. package/tui/widgets/subagent.py +0 -287
  544. package/tui/widgets/subagent_screen.py +0 -709
  545. package/tui/widgets/terminal.py +0 -576
  546. package/tui/widgets/terminal_tool.py +0 -360
  547. package/tui/widgets/throbber.py +0 -100
  548. package/tui/widgets/tool_call.py +0 -398
  549. package/tui/widgets/user_input.py +0 -23
  550. package/tui/widgets/version.py +0 -5
  551. 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
- )