@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,576 +0,0 @@
1
- from dataclasses import dataclass
2
-
3
- from time import monotonic
4
- from typing import Awaitable, Callable
5
-
6
- from textual.cache import LRUCache
7
-
8
- from textual import on
9
- from textual import events
10
- from textual.css.query import NoMatches
11
- from textual.message import Message
12
- from textual.reactive import reactive
13
- from textual.selection import Selection
14
- from textual.style import Style
15
- from textual.geometry import Region, Size
16
- from textual.scroll_view import ScrollView
17
- from textual.strip import Strip
18
- from textual.timer import Timer
19
-
20
- from tui import ansi
21
-
22
-
23
- # Time required to double tab escape
24
- ESCAPE_TAP_DURATION = 400 / 1000
25
-
26
-
27
- class Terminal(ScrollView, can_focus=True):
28
- BINDING_GROUP_TITLE = "Terminal"
29
- HELP = """\
30
- ## Terminal
31
-
32
- An embedded terminal running within A2TUI.
33
- When the terminal has focus, it will take over the handling of keys.
34
-
35
- Tap escape *twice* to exit.
36
-
37
- """
38
-
39
- CURSOR_STYLE = Style.parse("reverse")
40
-
41
- hide_cursor = reactive(False)
42
-
43
- @dataclass
44
- class Finalized(Message):
45
- """Terminal was finalized."""
46
-
47
- terminal: Terminal
48
-
49
- @property
50
- def control(self) -> Terminal:
51
- return self.terminal
52
-
53
- @dataclass
54
- class AlternateScreenChanged(Message):
55
- """Terminal enabled or disabled alternate screen."""
56
-
57
- terminal: Terminal
58
- enabled: bool
59
-
60
- @property
61
- def control(self) -> Terminal:
62
- return self.terminal
63
-
64
- @dataclass
65
- class LongRunning(Message):
66
- """Terminal enabled or disabled alternate screen."""
67
-
68
- terminal: Terminal
69
-
70
- @property
71
- def control(self) -> Terminal:
72
- return self.terminal
73
-
74
- @dataclass
75
- class CancelRequested(Message):
76
- """User double-pressed escape to cancel the agent."""
77
-
78
- terminal: Terminal
79
-
80
- @property
81
- def control(self) -> Terminal:
82
- return self.terminal
83
-
84
- def __init__(
85
- self,
86
- name: str | None = None,
87
- id: str | None = None,
88
- classes: str | None = None,
89
- disabled: bool = False,
90
- minimum_terminal_width: int = 0,
91
- size: tuple[int, int] | None = None,
92
- get_terminal_dimensions: Callable[[], tuple[int, int]] | None = None,
93
- ):
94
- super().__init__(
95
- name=name,
96
- id=id,
97
- classes=classes,
98
- disabled=disabled,
99
- )
100
- self.set_reactive(Terminal.auto_links, False)
101
- self.minimum_terminal_width = minimum_terminal_width
102
- self._get_terminal_dimensions = get_terminal_dimensions
103
-
104
- self.state = ansi.TerminalState(self.write_process_stdin)
105
-
106
- if size is None:
107
- self._width = minimum_terminal_width or 80
108
- self._height: int = 24
109
- else:
110
- width, height = size
111
- self._width = width
112
- self._height = height
113
-
114
- self.minimum_terminal_width = self._width
115
-
116
- self.max_window_width = 0
117
- self._escape_time = monotonic()
118
- self._escaping = False
119
- self._escape_reset_timer: Timer | None = None
120
- self._finalized: bool = False
121
- self.current_directory: str | None = None
122
- self._alternate_screen: bool = False
123
- self._terminal_render_cache: LRUCache[tuple, Strip] = LRUCache(1024)
124
- self._write_to_stdin: Callable[[str], Awaitable] | None = None
125
- self._write_count = 0
126
- self._long_running_timer: Timer | None = None
127
-
128
- @property
129
- def is_finalized(self) -> bool:
130
- """Finalized terminals will not accept writes or receive input."""
131
- return self._finalized
132
-
133
- @property
134
- def width(self) -> int:
135
- """Width of the terminal."""
136
- return self._width
137
-
138
- @property
139
- def height(self) -> int:
140
- """Height of the terminal."""
141
- height = self._height
142
- return height
143
-
144
- @property
145
- def size(self) -> Size:
146
- return Size(self.width, self.height)
147
-
148
- @property
149
- def alternate_screen(self) -> bool:
150
- return self._alternate_screen
151
-
152
- def notify_style_update(self) -> None:
153
- """Clear cache when theme chages."""
154
- self._terminal_render_cache.clear()
155
- super().notify_style_update()
156
-
157
- def set_state(self, state: ansi.TerminalState) -> None:
158
- """Set the terminal state, if this terminal is to inherit an existing state.
159
-
160
- Args:
161
- state: Terminal state object.
162
- """
163
- self.state = state
164
-
165
- def set_write_to_stdin(self, write_to_stdin: Callable[[str], Awaitable]) -> None:
166
- """Set a callable which is invoked with input, to be sent to stdin.
167
-
168
- Args:
169
- write_to_stdin: Callable which takes a string.
170
- """
171
- self._write_to_stdin = write_to_stdin
172
-
173
- def finalize(self) -> None:
174
- """FInalize the terminal.
175
-
176
- The finalized terminal will reject new writes.
177
- Adds the TCSS class `-finalize`
178
- """
179
- if not self._finalized:
180
- if self._long_running_timer is not None:
181
- self._long_running_timer.stop()
182
- self._finalized = True
183
- self.state.show_cursor = False
184
- self.add_class("-finalized")
185
- self._terminal_render_cache.clear()
186
- self.refresh()
187
- self.blur()
188
- self.post_message(self.Finalized(self))
189
- if not self.state.buffer.height:
190
- self.display = False
191
-
192
- def allow_focus(self) -> bool:
193
- """Prohibit focus when the terminal is finalized and couldn't accept input."""
194
- return not self.is_finalized
195
-
196
- def get_selection(self, selection: Selection) -> tuple[str, str] | None:
197
- """Get the text under the selection.
198
-
199
- Args:
200
- selection: Selection information.
201
-
202
- Returns:
203
- Tuple of extracted text and ending (typically "\n" or " "), or `None` if no text could be extracted.
204
- """
205
- text = "\n".join(
206
- line_record.content.plain for line_record in self.state.buffer.lines
207
- )
208
- return selection.extract(text), "\n"
209
-
210
- def _on_resize(self, event: events.Resize) -> None:
211
- if self._get_terminal_dimensions is None:
212
- width, height = self.scrollable_content_region.size
213
- else:
214
- width, height = self._get_terminal_dimensions()
215
- self.update_size(width, height)
216
-
217
- def update_size(self, width: int, height: int) -> None:
218
- old_width = self._width
219
- old_height = self._height
220
-
221
- self._terminal_render_cache.grow(height * 2)
222
- self._width = width or 80
223
- self._height = height or 24
224
- self._width = max(self._width, self.minimum_terminal_width)
225
-
226
- if (
227
- old_width != self._width
228
- or old_height != self._height
229
- and not self.is_finalized
230
- ):
231
- from tui.widgets.conversation import Conversation
232
-
233
- try:
234
- conversation = self.query_ancestor(Conversation)
235
- except NoMatches:
236
- pass
237
- else:
238
- conversation.shell.update_size(self._width, self._height)
239
-
240
- self.state.update_size(self._width, height)
241
- self._terminal_render_cache.clear()
242
- self.refresh()
243
-
244
- def on_mount(self) -> None:
245
- self.anchor()
246
- if self._get_terminal_dimensions is None:
247
- width, height = self.scrollable_content_region.size
248
- else:
249
- width, height = self._get_terminal_dimensions()
250
- self.update_size(width, height)
251
-
252
- async def write(self, text: str, hide_output: bool = False) -> bool:
253
- """Write sequences to the terminal.
254
-
255
- Args:
256
- text: Text with ANSI escape sequences.
257
- hide_output: Do not update the buffers with visible text.
258
-
259
- Returns:
260
- `True` if the state visuals changed, `False` if no visual change.
261
- """
262
- if self._write_count and self._long_running_timer is None:
263
-
264
- def warn_long_run():
265
- """Warn about a long running command."""
266
- self.post_message(self.LongRunning(self))
267
-
268
- self._long_running_timer = self.set_timer(2, warn_long_run)
269
- self._write_count += 1
270
-
271
- scrollback_delta, alternate_delta = await self.state.write(
272
- text, hide_output=hide_output
273
- )
274
- self._update_from_state(scrollback_delta, alternate_delta)
275
- scrollback_changed = bool(scrollback_delta is None or scrollback_delta)
276
- alternate_changed = bool(alternate_delta is None or alternate_delta)
277
-
278
- if self._alternate_screen != self.state.alternate_screen:
279
- self.post_message(
280
- self.AlternateScreenChanged(self, enabled=self.state.alternate_screen)
281
- )
282
- self._alternate_screen = self.state.alternate_screen
283
- return scrollback_changed or alternate_changed
284
-
285
- def on_click(self, event: events.Click) -> None:
286
- self.focus()
287
- event.stop()
288
-
289
- def _update_from_state(
290
- self, scrollback_delta: set[int] | None, alternate_delta: set[int] | None
291
- ) -> None:
292
- if self.state.current_directory:
293
- self.current_directory = self.state.current_directory
294
- self.finalize()
295
- width = self.state.width
296
- height = self.state.scrollback_buffer.height
297
-
298
- if self.state.alternate_screen:
299
- height += self.state.alternate_buffer.height
300
- self.virtual_size = Size(min(self.state.buffer.max_line_width, width), height)
301
- was_at_bottom = self.scroll_y >= self.max_scroll_y
302
- if was_at_bottom:
303
- self.anchor()
304
- self.scroll_y = self.max_scroll_y
305
- elif self._anchored:
306
- self.scroll_y = self.max_scroll_y
307
-
308
- scroll_y = int(self.scroll_y)
309
- visible_lines = frozenset(range(scroll_y, scroll_y + height))
310
-
311
- if scrollback_delta is None and alternate_delta is None:
312
- self.refresh()
313
- else:
314
- window_width = self.region.width
315
- scrollback_height = self.state.scrollback_buffer.height
316
- if scrollback_delta is None:
317
- self.refresh(Region(0, 0, window_width, scrollback_height))
318
- else:
319
- refresh_lines = [
320
- Region(0, y - scroll_y, window_width, 1)
321
- for y in sorted(scrollback_delta & visible_lines)
322
- ]
323
- if refresh_lines:
324
- self.refresh(*refresh_lines)
325
- if alternate_delta is None:
326
- self.refresh()
327
- else:
328
- alternate_delta = {
329
- line_no + scrollback_height for line_no in alternate_delta
330
- }
331
- refresh_lines = [
332
- Region(0, y - scroll_y, window_width, 1)
333
- for y in sorted(alternate_delta & visible_lines)
334
- ]
335
- if refresh_lines:
336
- self.refresh(*refresh_lines)
337
-
338
- def render_line(self, y: int) -> Strip:
339
- scroll_x, scroll_y = self.scroll_offset
340
- strip = self._render_line(scroll_x, scroll_y + y, self._width)
341
- return strip
342
-
343
- def on_focus(self) -> None:
344
- self.border_subtitle = "Tap [b]esc[/b] [i]twice[/i] to exit"
345
-
346
- def on_blur(self) -> None:
347
- self.border_subtitle = "Click to focus"
348
-
349
- def _render_line(self, x: int, y: int, width: int) -> Strip:
350
- selection = self.text_selection
351
- visual_style = self.visual_style
352
- rich_style = visual_style.rich_style
353
-
354
- state = self.state
355
- buffer = state.scrollback_buffer
356
- buffer_offset = 0
357
- # If alternate screen is active place it (virtually) at the end
358
- if y >= buffer.height and state.alternate_screen:
359
- buffer_offset = buffer.height
360
- buffer = state.alternate_buffer
361
- # Get the folded line, which as a one to one relationship with y
362
- try:
363
- folded_line_ = buffer.folded_lines[y - buffer_offset]
364
- line_no, line_offset, offset, line, updates = folded_line_
365
- except IndexError:
366
- return Strip.blank(width, rich_style)
367
-
368
- line_record = buffer.lines[line_no]
369
- cache_key: tuple | None = (
370
- self.state.alternate_screen,
371
- y,
372
- line_record.updates,
373
- updates,
374
- )
375
-
376
- # Add in cursor
377
- if (
378
- not self.hide_cursor
379
- and state.show_cursor
380
- and buffer.cursor_line == y - buffer_offset
381
- ):
382
- if buffer.cursor_offset >= len(line):
383
- line = line.pad_right(buffer.cursor_offset - len(line) + 1)
384
- line_cursor_offset = buffer.cursor_offset
385
- line = line.stylize(
386
- self.CURSOR_STYLE, line_cursor_offset, line_cursor_offset + 1
387
- )
388
- cache_key = None
389
-
390
- # get cached strip if there is no selection
391
- if (
392
- not selection
393
- and cache_key is not None
394
- and (strip := self._terminal_render_cache.get(cache_key))
395
- ):
396
- strip = strip.crop(x, x + width)
397
- strip = strip.adjust_cell_length(
398
- width, (visual_style + line_record.style).rich_style
399
- )
400
- strip = strip.apply_offsets(x + offset, line_no)
401
- return strip
402
-
403
- # Apply selection
404
- if selection is not None and (select_span := selection.get_span(line_no)):
405
- unfolded_content = line_record.content.expand_tabs(8)
406
- start, end = select_span
407
- if end == -1:
408
- end = len(unfolded_content)
409
- selection_style = self.screen.get_visual_style("screen--selection")
410
- unfolded_content = unfolded_content.stylize(selection_style, start, end)
411
- try:
412
- folded_lines = self.state._fold_line(line_no, unfolded_content, width)
413
- line = folded_lines[line_offset].content
414
- cache_key = None
415
- except IndexError:
416
- pass
417
-
418
- try:
419
- strip = Strip(
420
- line.render_segments(visual_style), cell_length=line.cell_length
421
- )
422
- except Exception:
423
- # TODO: Is this neccesary?
424
- strip = Strip.blank(line.cell_length)
425
-
426
- if cache_key is not None:
427
- self._terminal_render_cache[cache_key] = strip
428
-
429
- strip = strip.crop(x, x + width)
430
- strip = strip.adjust_cell_length(
431
- width, (visual_style + line_record.style).rich_style
432
- )
433
- strip = strip.apply_offsets(x + offset, line_no)
434
-
435
- return strip
436
-
437
- async def _reset_escaping(self) -> None:
438
- if self._escaping:
439
- await self.write_process_stdin(self.state.key_escape())
440
- self._escaping = False
441
-
442
- async def on_key(self, event: events.Key):
443
- event.prevent_default()
444
- event.stop()
445
-
446
- if event.key == "escape":
447
- if self._alternate_screen:
448
- await self.write_process_stdin("\x1b")
449
- return
450
- if self._escaping:
451
- if monotonic() < self._escape_time + ESCAPE_TAP_DURATION:
452
- self.blur()
453
- self._escaping = False
454
- self.post_message(self.CancelRequested(self))
455
- return
456
- else:
457
- await self.write_process_stdin(self.state.key_escape())
458
- else:
459
- self._escaping = True
460
- self._escape_time = monotonic()
461
- self._escape_reset_timer = self.set_timer(
462
- ESCAPE_TAP_DURATION, self._reset_escaping
463
- )
464
- return
465
- else:
466
- await self._reset_escaping()
467
- if self._escape_reset_timer is not None:
468
- self._escape_reset_timer.stop()
469
-
470
- if (stdin := self.state.key_event_to_stdin(event)) is not None:
471
- await self.write_process_stdin(stdin)
472
-
473
- @property
474
- def allow_select(self) -> bool:
475
- return self.is_finalized or not self._alternate_screen
476
-
477
- def _encode_mouse_event_sgr(self, event: events.MouseEvent) -> str:
478
- x = int(event.x)
479
- y = int(event.y)
480
-
481
- if isinstance(event, events.MouseMove):
482
- button = event.button + 32 if event.button else 35
483
- else:
484
- button = event.button - 1
485
- if button >= 4:
486
- button = button - 4 + 128
487
- if event.shift:
488
- button += 4
489
- if event.meta:
490
- button += 8
491
- if event.ctrl:
492
- button += 16
493
-
494
- if isinstance(event, events.MouseDown):
495
- final_character = "M"
496
- elif isinstance(event, events.MouseUp):
497
- button = 0
498
- final_character = "m"
499
- else:
500
- final_character = "M"
501
- mouse_stdin = f"\x1b[<{button};{x + 1};{y + 1}{final_character}"
502
- return mouse_stdin
503
-
504
- @on(events.MouseMove)
505
- async def on_mouse_move(self, event: events.MouseMove) -> None:
506
- if self.is_finalized:
507
- return
508
- if (mouse_tracking := self.state.mouse_tracking) is None:
509
- return
510
- if mouse_tracking.tracking == "all" or (
511
- event.button and mouse_tracking.tracking == "drag"
512
- ):
513
- await self._handle_mouse_event(event)
514
- event.prevent_default()
515
- event.stop()
516
-
517
- @on(events.MouseDown)
518
- @on(events.MouseUp)
519
- async def on_mouse_button(self, event: events.MouseUp | events.MouseDown) -> None:
520
- if self.is_finalized:
521
- return
522
- if self.state.mouse_tracking is None:
523
- return
524
- await self._handle_mouse_event(event)
525
- event.prevent_default()
526
- event.stop()
527
-
528
- async def _handle_mouse_event(self, event: events.MouseEvent) -> None:
529
- if (mouse_tracking := self.state.mouse_tracking) is None:
530
- return
531
- # TODO: Other mouse tracking formats
532
- match mouse_tracking.format:
533
- case "sgr":
534
- await self.write_process_stdin(self._encode_mouse_event_sgr(event))
535
-
536
- async def on_paste(self, event: events.Paste) -> None:
537
- await self.paste(event.text)
538
-
539
- async def paste(self, text: str) -> None:
540
- if self.state.bracketed_paste:
541
- await self.write_process_stdin(f"\x1b[200~{text}\x1b[201~")
542
- else:
543
- await self.write_process_stdin(text)
544
-
545
- async def write_process_stdin(self, input: str) -> None:
546
- if self._write_to_stdin is not None:
547
- await self._write_to_stdin(input)
548
-
549
-
550
- if __name__ == "__main__":
551
- from textual.app import App, ComposeResult
552
-
553
- TEST = (
554
- "\033[31mThis is red text\033[0m\n"
555
- "\033[32mThis is green text\033[0m\n"
556
- "\033[33mThis is yellow text\033[0m\n"
557
- "\033[34mThis is blue text\033[0m\n"
558
- "\033[35mThis is magenta text\033[0m\n"
559
- "\033[36mThis is cyan text\033[0m\n"
560
- "\033[1mThis is bold text\033[0m\n"
561
- "\033[4mThis is underlined text\033[0m\n"
562
- "\033[1;31mThis is bold red text\033[0m\n"
563
- "\033[42mThis has a green background\033[0m\n"
564
- "\033[97;44mWhite text on blue background\033[0m"
565
- )
566
-
567
- class TApp(App):
568
- def compose(self) -> ComposeResult:
569
- yield Terminal()
570
-
571
- def on_mount(self) -> None:
572
- terminal = self.query_one(Terminal)
573
- terminal.write(TEST)
574
-
575
- app = TApp()
576
- app.run()