@scemoon/cdh 1.0.6 → 1.0.8

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 +2 -1
  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 -807
  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,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()