@scemoon/cdh 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (551) hide show
  1. package/package.json +2 -2
  2. package/run.js +68 -14
  3. package/ai-dlc-skill/SKILL.md +0 -77
  4. package/ai-dlc-skill/agents/deliver-agent.md +0 -24
  5. package/ai-dlc-skill/agents/master.md +0 -50
  6. package/ai-dlc-skill/agents/plan-agent.md +0 -23
  7. package/ai-dlc-skill/agents/understand-agent.md +0 -23
  8. package/ai-dlc-skill/agents/verify-agent.md +0 -27
  9. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  10. package/ai-dlc-skill/brownfield/README.md +0 -30
  11. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  12. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  13. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  14. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  15. package/ai-dlc-skill/components/backend.md +0 -34
  16. package/ai-dlc-skill/components/desktop.md +0 -30
  17. package/ai-dlc-skill/components/mya.md +0 -29
  18. package/ai-dlc-skill/components/native.md +0 -30
  19. package/ai-dlc-skill/components/tta.md +0 -29
  20. package/ai-dlc-skill/components/web.md +0 -31
  21. package/ai-dlc-skill/components/wxa.md +0 -29
  22. package/ai-dlc-skill/contracts/README.md +0 -25
  23. package/ai-dlc-skill/core/adaptive-flow.md +0 -36
  24. package/ai-dlc-skill/core/security.md +0 -29
  25. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -31
  26. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -47
  27. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -32
  28. package/ai-dlc-skill/cross-tool/export.sh +0 -22
  29. package/ai-dlc-skill/cross-tool/onecode/config.yaml.tpl +0 -17
  30. package/ai-dlc-skill/cross-tool/onecode/export-skills.sh +0 -35
  31. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -54
  32. package/ai-dlc-skill/phases/deliver/entry.md +0 -26
  33. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  34. package/ai-dlc-skill/phases/deliver/prompt.md +0 -40
  35. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  36. package/ai-dlc-skill/phases/plan/entry.md +0 -25
  37. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -204
  38. package/ai-dlc-skill/phases/plan/prompt.md +0 -38
  39. package/ai-dlc-skill/phases/plan/rules.md +0 -25
  40. package/ai-dlc-skill/phases/understand/entry.md +0 -26
  41. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  42. package/ai-dlc-skill/phases/understand/prompt.md +0 -41
  43. package/ai-dlc-skill/phases/understand/rules.md +0 -37
  44. package/ai-dlc-skill/phases/verify/entry.md +0 -26
  45. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -192
  46. package/ai-dlc-skill/phases/verify/prompt.md +0 -43
  47. package/ai-dlc-skill/phases/verify/rules.md +0 -73
  48. package/ai-dlc-skill/practices/bdd.md +0 -91
  49. package/ai-dlc-skill/practices/sdd.md +0 -84
  50. package/ai-dlc-skill/practices/tdd.md +0 -95
  51. package/ai-dlc-skill/providers/README.md +0 -114
  52. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  53. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  54. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  55. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -69
  56. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  57. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  58. package/ai-dlc-skill/requirements.md +0 -140
  59. package/ai-dlc-skill/skill.yaml +0 -147
  60. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  61. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  62. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  63. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  64. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  65. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  66. package/ai-dlc-skill/templates/plan/design.md +0 -49
  67. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  68. package/ai-dlc-skill/templates/project/README.md +0 -126
  69. package/ai-dlc-skill/templates/project/template.md +0 -119
  70. package/ai-dlc-skill/templates/understand/feature.feature +0 -23
  71. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  72. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  73. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  74. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  75. package/ai-dlc-skill/walkthrough/template.md +0 -54
  76. package/ai-dlc-skill/workflows/ai-dlc.yaml +0 -110
  77. package/ai-dlc-skill/workflows/deployment.yaml +0 -199
  78. package/cdh/__init__.py +0 -0
  79. package/cdh/__main__.py +0 -4
  80. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  81. package/cdh/__pycache__/cdh_mcp_injector.cpython-314.pyc +0 -0
  82. package/cdh/__pycache__/cdh_mcp_loader.cpython-314.pyc +0 -0
  83. package/cdh/__pycache__/cdh_mcp_manager.cpython-314.pyc +0 -0
  84. package/cdh/__pycache__/cdh_session_aggregator.cpython-314.pyc +0 -0
  85. package/cdh/__pycache__/cdh_skill_loader.cpython-314.pyc +0 -0
  86. package/cdh/__pycache__/cdh_skill_manager.cpython-314.pyc +0 -0
  87. package/cdh/__pycache__/cli.cpython-313.pyc +0 -0
  88. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  89. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  90. package/cdh/cdh_mcp_injector.py +0 -115
  91. package/cdh/cdh_mcp_loader.py +0 -67
  92. package/cdh/cdh_mcp_manager.py +0 -73
  93. package/cdh/cdh_session_aggregator.py +0 -258
  94. package/cdh/cdh_skill_manager.py +0 -105
  95. package/cdh/cli.py +0 -758
  96. package/cdh/scaffold.py +0 -728
  97. package/onecode/__init__.py +0 -1
  98. package/onecode/__main__.py +0 -4
  99. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  100. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  101. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  102. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  103. package/onecode/__pycache__/config_screen.cpython-314.pyc +0 -0
  104. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  105. package/onecode/agent/__init__.py +0 -0
  106. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  107. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  108. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  109. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  110. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  111. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  112. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  113. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  114. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  115. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  116. package/onecode/agent/agents/__init__.py +0 -29
  117. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  118. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  119. package/onecode/agent/agents/types.py +0 -589
  120. package/onecode/agent/attachments.py +0 -112
  121. package/onecode/agent/cdh_loader.py +0 -267
  122. package/onecode/agent/context.py +0 -343
  123. package/onecode/agent/engine.py +0 -2700
  124. package/onecode/agent/hooks.py +0 -86
  125. package/onecode/agent/onecode_agent_acp.py +0 -2743
  126. package/onecode/agent/onecode_agent_acp.py.bak +0 -2447
  127. package/onecode/agent/permissions.py +0 -150
  128. package/onecode/agent/permissions_store.py +0 -62
  129. package/onecode/agent/project_doc.py +0 -19
  130. package/onecode/agent/session.py +0 -195
  131. package/onecode/agent/snapshot.py +0 -144
  132. package/onecode/agent/tools/__init__.py +0 -17
  133. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  134. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  135. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  136. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  137. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  138. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  139. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  140. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  141. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  142. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  143. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  144. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  145. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  146. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  147. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  148. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  149. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  150. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  151. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  152. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  153. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  154. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  155. package/onecode/agent/tools/agent_tools.py +0 -132
  156. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  157. package/onecode/agent/tools/bash_tool.py +0 -111
  158. package/onecode/agent/tools/communication_tools.py +0 -148
  159. package/onecode/agent/tools/config_tool.py +0 -130
  160. package/onecode/agent/tools/cron_tools.py +0 -178
  161. package/onecode/agent/tools/errors.py +0 -17
  162. package/onecode/agent/tools/file_ops.py +0 -221
  163. package/onecode/agent/tools/file_tools.py +0 -225
  164. package/onecode/agent/tools/git_tools.py +0 -88
  165. package/onecode/agent/tools/lsp_tools.py +0 -404
  166. package/onecode/agent/tools/mcp_tools.py +0 -127
  167. package/onecode/agent/tools/permission_handler.py +0 -46
  168. package/onecode/agent/tools/permissions.py +0 -77
  169. package/onecode/agent/tools/protocol.py +0 -20
  170. package/onecode/agent/tools/registry.py +0 -201
  171. package/onecode/agent/tools/sandbox.py +0 -358
  172. package/onecode/agent/tools/schema_validation.py +0 -100
  173. package/onecode/agent/tools/skill_tools.py +0 -52
  174. package/onecode/agent/tools/todo_tools.py +0 -207
  175. package/onecode/agent/tools/web_tools.py +0 -169
  176. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  177. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  178. package/onecode/builtin_skills/git/SKILL.md +0 -64
  179. package/onecode/builtin_skills/git/skill.yaml +0 -7
  180. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  181. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  182. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  183. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  184. package/onecode/cli.py +0 -935
  185. package/onecode/cloud/__init__.py +0 -0
  186. package/onecode/cloud/base.py +0 -20
  187. package/onecode/codebase/__init__.py +0 -69
  188. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  190. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  191. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  192. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  193. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  194. package/onecode/codebase/chunker.py +0 -125
  195. package/onecode/codebase/indexer.py +0 -149
  196. package/onecode/codebase/retriever.py +0 -203
  197. package/onecode/codebase/storage.py +0 -131
  198. package/onecode/codebase/tools.py +0 -59
  199. package/onecode/commands.py +0 -596
  200. package/onecode/config.py +0 -314
  201. package/onecode/config_screen.py +0 -600
  202. package/onecode/cron/__init__.py +0 -3
  203. package/onecode/lsp/__init__.py +0 -3
  204. package/onecode/mcp/__init__.py +0 -4
  205. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  206. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  207. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  208. package/onecode/mcp/client.py +0 -193
  209. package/onecode/mcp/manager.py +0 -190
  210. package/onecode/memory/__init__.py +0 -49
  211. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  212. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  213. package/onecode/memory/__pycache__/offload.cpython-314.pyc +0 -0
  214. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  215. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  216. package/onecode/memory/__pycache__/symbolic.cpython-314.pyc +0 -0
  217. package/onecode/memory/backend.py +0 -159
  218. package/onecode/memory/pyramid.py +0 -133
  219. package/onecode/memory/recall.py +0 -203
  220. package/onecode/migrate.py +0 -122
  221. package/onecode/models/__init__.py +0 -4
  222. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  223. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  224. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  225. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  226. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  227. package/onecode/models/errors.py +0 -104
  228. package/onecode/models/messages.py +0 -739
  229. package/onecode/models/provider.py +0 -699
  230. package/onecode/models/providers/__init__.py +0 -17
  231. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  232. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  233. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  234. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  235. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  236. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  237. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  238. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  239. package/onecode/models/providers/anthropic_provider.py +0 -273
  240. package/onecode/models/providers/deepseek_provider.py +0 -212
  241. package/onecode/models/providers/glm_provider.py +0 -195
  242. package/onecode/models/providers/minimax_provider.py +0 -158
  243. package/onecode/models/providers/minimaxi_provider.py +0 -417
  244. package/onecode/models/providers/ollama_provider.py +0 -100
  245. package/onecode/models/providers/openai_provider.py +0 -237
  246. package/onecode/models/registry.py +0 -212
  247. package/onecode/server/__init__.py +0 -3
  248. package/onecode/server/app.py +0 -224
  249. package/onecode/skills/__init__.py +0 -11
  250. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  251. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  252. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  253. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  254. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  255. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  256. package/onecode/skills/__pycache__/manager.cpython-314.pyc +0 -0
  257. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  258. package/onecode/skills/argument_substitution.py +0 -38
  259. package/onecode/skills/bootstrap.py +0 -124
  260. package/onecode/skills/create.py +0 -56
  261. package/onecode/skills/frontmatter.py +0 -33
  262. package/onecode/skills/loader.py +0 -139
  263. package/onecode/skills/manager.py +0 -75
  264. package/onecode/skills/model.py +0 -43
  265. package/onecode/storage/__init__.py +0 -0
  266. package/onecode/storage/activity.py +0 -63
  267. package/onecode/storage/project.py +0 -54
  268. package/onecode/storage/session.py +0 -112
  269. package/onecode/tasks/__init__.py +0 -26
  270. package/onecode/tasks/manager.py +0 -232
  271. package/onecode/tasks/models.py +0 -240
  272. package/onecode/trace/__init__.py +0 -0
  273. package/onecode/trace/tracer.py +0 -173
  274. package/onecode/utils/__init__.py +0 -0
  275. package/onecode/utils/helpers.py +0 -20
  276. package/pyproject.toml +0 -74
  277. package/tui/__init__.py +0 -46
  278. package/tui/__main__.py +0 -4
  279. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  280. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  281. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  282. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  283. package/tui/__pycache__/about.cpython-314.pyc +0 -0
  284. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  285. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  286. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  287. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  288. package/tui/__pycache__/app.cpython-313.pyc +0 -0
  289. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  290. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  291. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  292. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  293. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  294. package/tui/__pycache__/danger.cpython-314.pyc +0 -0
  295. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  296. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  297. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  298. package/tui/__pycache__/directory_suggester.cpython-314.pyc +0 -0
  299. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  300. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  301. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  302. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  303. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  304. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  305. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  306. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  307. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  308. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  309. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  310. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  311. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  312. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  313. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  314. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  315. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  316. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  317. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  318. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  319. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  320. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  321. package/tui/_loop.py +0 -86
  322. package/tui/_path_fuzzy_search.py +0 -48
  323. package/tui/_path_match.py +0 -141
  324. package/tui/about.py +0 -95
  325. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  326. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  327. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  328. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  329. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  330. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  331. package/tui/acp/agent.py +0 -1002
  332. package/tui/acp/api.py +0 -73
  333. package/tui/acp/encode_tool_call_id.py +0 -12
  334. package/tui/acp/messages.py +0 -203
  335. package/tui/acp/prompt.py +0 -53
  336. package/tui/acp/protocol.py +0 -499
  337. package/tui/agent.py +0 -70
  338. package/tui/agent_schema.py +0 -76
  339. package/tui/agents.py +0 -46
  340. package/tui/ansi/__init__.py +0 -1
  341. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  342. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  343. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  344. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  345. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  346. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  347. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  348. package/tui/ansi/_ansi.py +0 -1689
  349. package/tui/ansi/_ansi_colors.py +0 -264
  350. package/tui/ansi/_control_codes.py +0 -37
  351. package/tui/ansi/_keys.py +0 -251
  352. package/tui/ansi/_sgr_styles.py +0 -64
  353. package/tui/ansi/_stream_parser.py +0 -418
  354. package/tui/answer.py +0 -12
  355. package/tui/app.py +0 -1266
  356. package/tui/atomic.py +0 -37
  357. package/tui/cli.py +0 -313
  358. package/tui/code_analyze.py +0 -27
  359. package/tui/complete.py +0 -38
  360. package/tui/constants.py +0 -61
  361. package/tui/conversation_markdown.py +0 -30
  362. package/tui/danger.py +0 -372
  363. package/tui/data/agents/ampcode.com.toml +0 -52
  364. package/tui/data/agents/augmentcode.com.toml +0 -41
  365. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  366. package/tui/data/agents/claude.com.toml +0 -41
  367. package/tui/data/agents/copilot.github.com.toml +0 -29
  368. package/tui/data/agents/crowai.dev.toml +0 -36
  369. package/tui/data/agents/cursor.com.toml +0 -38
  370. package/tui/data/agents/deepagents.langchain.com +0 -34
  371. package/tui/data/agents/docker.com.toml +0 -60
  372. package/tui/data/agents/geminicli.com.toml +0 -28
  373. package/tui/data/agents/goose.ai.toml +0 -52
  374. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  375. package/tui/data/agents/kimi.com.toml +0 -35
  376. package/tui/data/agents/kiro.dev.toml +0 -43
  377. package/tui/data/agents/onecode.dev.toml +0 -22
  378. package/tui/data/agents/openai.com.toml +0 -53
  379. package/tui/data/agents/openclaw.ai.toml +0 -37
  380. package/tui/data/agents/opencode.ai.toml +0 -39
  381. package/tui/data/agents/openhands.dev.toml +0 -46
  382. package/tui/data/agents/stakpak.dev.toml +0 -62
  383. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  384. package/tui/data/agents/vtcode.dev.toml +0 -63
  385. package/tui/data/images/frog.png +0 -0
  386. package/tui/data/sounds/question.wav +0 -0
  387. package/tui/data/sounds/turn-over.wav +0 -0
  388. package/tui/db.py +0 -213
  389. package/tui/dec.py +0 -332
  390. package/tui/directory.py +0 -234
  391. package/tui/directory_suggester.py +0 -93
  392. package/tui/directory_watcher.py +0 -231
  393. package/tui/format_path.py +0 -25
  394. package/tui/fuzzy.py +0 -140
  395. package/tui/fuzzy_index.py +0 -275
  396. package/tui/gist.py +0 -33
  397. package/tui/history.py +0 -138
  398. package/tui/jsonrpc.py +0 -578
  399. package/tui/menus.py +0 -14
  400. package/tui/message_log.py +0 -69
  401. package/tui/messages.py +0 -144
  402. package/tui/option_content.py +0 -51
  403. package/tui/os.py +0 -0
  404. package/tui/path_complete.py +0 -217
  405. package/tui/path_filter.py +0 -124
  406. package/tui/paths.py +0 -87
  407. package/tui/pill.py +0 -23
  408. package/tui/platform_commands.py +0 -52
  409. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  410. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  411. package/tui/prompt/extract.py +0 -19
  412. package/tui/prompt/resource.py +0 -68
  413. package/tui/protocol.py +0 -28
  414. package/tui/screens/__init__.py +0 -0
  415. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  416. package/tui/screens/__pycache__/agent_modal.cpython-314.pyc +0 -0
  417. package/tui/screens/__pycache__/component_picker.cpython-314.pyc +0 -0
  418. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  419. package/tui/screens/__pycache__/log.cpython-314.pyc +0 -0
  420. package/tui/screens/__pycache__/main.cpython-313.pyc +0 -0
  421. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  422. package/tui/screens/__pycache__/permissions.cpython-314.pyc +0 -0
  423. package/tui/screens/__pycache__/projects_app.cpython-314.pyc +0 -0
  424. package/tui/screens/__pycache__/projects_screen.cpython-314.pyc +0 -0
  425. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  426. package/tui/screens/__pycache__/store.cpython-314.pyc +0 -0
  427. package/tui/screens/__pycache__/tool_content_screen.cpython-314.pyc +0 -0
  428. package/tui/screens/action_modal.py +0 -94
  429. package/tui/screens/agent_modal.py +0 -175
  430. package/tui/screens/command_edit_modal.py +0 -74
  431. package/tui/screens/component_picker.py +0 -168
  432. package/tui/screens/diff_screen.py +0 -84
  433. package/tui/screens/log.py +0 -553
  434. package/tui/screens/main.py +0 -385
  435. package/tui/screens/main.tcss +0 -655
  436. package/tui/screens/permissions.py +0 -404
  437. package/tui/screens/permissions.tcss +0 -72
  438. package/tui/screens/projects.tcss +0 -80
  439. package/tui/screens/projects_app.py +0 -347
  440. package/tui/screens/projects_screen.py +0 -284
  441. package/tui/screens/session_resume_modal.py +0 -172
  442. package/tui/screens/session_resume_modal.tcss +0 -35
  443. package/tui/screens/sessions.py +0 -164
  444. package/tui/screens/sessions.tcss +0 -119
  445. package/tui/screens/settings.py +0 -254
  446. package/tui/screens/settings.tcss +0 -101
  447. package/tui/screens/store.py +0 -500
  448. package/tui/screens/store.tcss +0 -274
  449. package/tui/screens/tool_content_screen.py +0 -59
  450. package/tui/session_tracker.py +0 -123
  451. package/tui/settings.py +0 -353
  452. package/tui/settings_schema.py +0 -431
  453. package/tui/shell.py +0 -304
  454. package/tui/shell_read.py +0 -42
  455. package/tui/slash_command.py +0 -34
  456. package/tui/tui.tcss +0 -246
  457. package/tui/twitter.py +0 -38
  458. package/tui/version.py +0 -80
  459. package/tui/visuals/__init__.py +0 -0
  460. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  461. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  462. package/tui/visuals/columns.py +0 -272
  463. package/tui/widgets/__init__.py +0 -0
  464. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  465. package/tui/widgets/__pycache__/acp_content.cpython-314.pyc +0 -0
  466. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  467. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  468. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  469. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  470. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  471. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  472. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  473. package/tui/widgets/__pycache__/directory_input.cpython-314.pyc +0 -0
  474. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  475. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  476. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  477. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  478. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  479. package/tui/widgets/__pycache__/mandelbrot.cpython-314.pyc +0 -0
  480. package/tui/widgets/__pycache__/markdown_note.cpython-314.pyc +0 -0
  481. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  482. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  483. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  484. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  485. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  486. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  487. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  488. package/tui/widgets/__pycache__/project_grid_select.cpython-314.pyc +0 -0
  489. package/tui/widgets/__pycache__/project_summary.cpython-314.pyc +0 -0
  490. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  491. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  492. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  493. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  494. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  495. package/tui/widgets/__pycache__/shell_result.cpython-314.pyc +0 -0
  496. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  497. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  498. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  499. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  500. package/tui/widgets/__pycache__/subagent.cpython-314.pyc +0 -0
  501. package/tui/widgets/__pycache__/subagent_screen.cpython-314.pyc +0 -0
  502. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  503. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  504. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  505. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  506. package/tui/widgets/acp_content.py +0 -70
  507. package/tui/widgets/agent_response.py +0 -76
  508. package/tui/widgets/agent_thought.py +0 -167
  509. package/tui/widgets/ask_user.py +0 -264
  510. package/tui/widgets/command_pane.py +0 -223
  511. package/tui/widgets/condensed_path.py +0 -115
  512. package/tui/widgets/context_stats.py +0 -66
  513. package/tui/widgets/conversation.py +0 -2641
  514. package/tui/widgets/danger_warning.py +0 -65
  515. package/tui/widgets/diff_view.py +0 -69
  516. package/tui/widgets/directory_input.py +0 -8
  517. package/tui/widgets/flash.py +0 -81
  518. package/tui/widgets/future_text.py +0 -126
  519. package/tui/widgets/grid_select.py +0 -234
  520. package/tui/widgets/highlighted_textarea.py +0 -180
  521. package/tui/widgets/load_more.py +0 -24
  522. package/tui/widgets/mandelbrot.py +0 -294
  523. package/tui/widgets/markdown_note.py +0 -13
  524. package/tui/widgets/menu.py +0 -147
  525. package/tui/widgets/modified_files.py +0 -306
  526. package/tui/widgets/non_selectable_label.py +0 -5
  527. package/tui/widgets/note.py +0 -18
  528. package/tui/widgets/path_search.py +0 -492
  529. package/tui/widgets/plan.py +0 -285
  530. package/tui/widgets/project_directory_tree.py +0 -102
  531. package/tui/widgets/project_grid_select.py +0 -64
  532. package/tui/widgets/project_summary.py +0 -33
  533. package/tui/widgets/prompt.py +0 -795
  534. package/tui/widgets/question.py +0 -360
  535. package/tui/widgets/session_grid_select.py +0 -230
  536. package/tui/widgets/session_summary.py +0 -115
  537. package/tui/widgets/session_tabs.py +0 -188
  538. package/tui/widgets/shell_result.py +0 -35
  539. package/tui/widgets/shell_terminal.py +0 -40
  540. package/tui/widgets/side_bar.py +0 -124
  541. package/tui/widgets/slash_complete.py +0 -235
  542. package/tui/widgets/strike_text.py +0 -70
  543. package/tui/widgets/subagent.py +0 -287
  544. package/tui/widgets/subagent_screen.py +0 -709
  545. package/tui/widgets/terminal.py +0 -576
  546. package/tui/widgets/terminal_tool.py +0 -360
  547. package/tui/widgets/throbber.py +0 -100
  548. package/tui/widgets/tool_call.py +0 -398
  549. package/tui/widgets/user_input.py +0 -23
  550. package/tui/widgets/version.py +0 -5
  551. package/tui/widgets/welcome.py +0 -31
package/tui/fuzzy.py DELETED
@@ -1,140 +0,0 @@
1
- """
2
- Fuzzy matcher.
3
-
4
- This class is used by the [command palette](/guide/command_palette) to match search terms.
5
-
6
- """
7
-
8
- from __future__ import annotations
9
-
10
- from functools import lru_cache
11
- from operator import itemgetter
12
- from re import finditer
13
- from typing import Iterable, Sequence
14
-
15
-
16
- from textual.cache import LRUCache
17
-
18
-
19
- class FuzzySearch:
20
- """Performs a fuzzy search.
21
-
22
- Unlike a regex solution, this will finds all possible matches.
23
- """
24
-
25
- def __init__(
26
- self, case_sensitive: bool = False, *, cache_size: int = 1024 * 4
27
- ) -> None:
28
- """Initialize fuzzy search.
29
-
30
- Args:
31
- case_sensitive: Is the match case sensitive?
32
- cache_size: Number of queries to cache.
33
- """
34
-
35
- self.case_sensitive = case_sensitive
36
- self.cache: LRUCache[tuple[str, str], tuple[float, Sequence[int]]] = LRUCache(
37
- cache_size
38
- )
39
-
40
- def match(self, query: str, candidate: str) -> tuple[float, Sequence[int]]:
41
- """Match against a query.
42
-
43
- Args:
44
- query: The fuzzy query.
45
- candidate: A candidate to check,.
46
-
47
- Returns:
48
- A pair of (score, tuple of offsets). `(0, ())` for no result.
49
- """
50
-
51
- cache_key = (query, candidate)
52
- if cache_key in self.cache:
53
- return self.cache[cache_key]
54
- default: tuple[float, Sequence[int]] = (0.0, [])
55
- result = max(self._match(query, candidate), key=itemgetter(0), default=default)
56
- self.cache[cache_key] = result
57
- return result
58
-
59
- @classmethod
60
- @lru_cache(maxsize=1024)
61
- def get_first_letters(cls, candidate: str) -> frozenset[int]:
62
- return frozenset({match.start() for match in finditer(r"\w+", candidate)})
63
-
64
- def score(self, candidate: str, positions: Sequence[int]) -> float:
65
- """Score a search.
66
-
67
- Args:
68
- search: Search object.
69
-
70
- Returns:
71
- Score.
72
- """
73
-
74
- first_letters = self.get_first_letters(candidate)
75
- # This is a heuristic, and can be tweaked for better results
76
- # Boost first letter matches
77
- offset_count = len(positions)
78
- score: float = offset_count + len(first_letters.intersection(positions))
79
-
80
- groups = 1
81
- last_offset, *offsets = positions
82
- for offset in offsets:
83
- if offset != last_offset + 1:
84
- groups += 1
85
- last_offset = offset
86
-
87
- # Boost to favor less groups
88
- normalized_groups = (offset_count - (groups - 1)) / offset_count
89
- score *= 1 + (normalized_groups * normalized_groups)
90
- return score
91
-
92
- def _match(
93
- self, query: str, candidate: str
94
- ) -> Iterable[tuple[float, Sequence[int]]]:
95
- letter_positions: list[list[int]] = []
96
- position = 0
97
-
98
- if not self.case_sensitive:
99
- candidate = candidate.casefold()
100
- query = query.casefold()
101
-
102
- score = self.score
103
-
104
- for offset, letter in enumerate(query):
105
- last_index = len(candidate) - offset
106
- positions: list[int] = []
107
- letter_positions.append(positions)
108
- index = position
109
- while (location := candidate.find(letter, index)) != -1:
110
- positions.append(location)
111
- index = location + 1
112
- if index >= last_index:
113
- break
114
- if not positions:
115
- yield (0.0, ())
116
- return
117
- position = positions[0] + 1
118
-
119
- possible_offsets: list[list[int]] = []
120
- query_length = len(query)
121
-
122
- def get_offsets(offsets: list[int], positions_index: int) -> None:
123
- """Recursively match offsets.
124
-
125
- Args:
126
- offsets: A list of offsets.
127
- positions_index: Index of query letter.
128
-
129
- """
130
- for offset in letter_positions[positions_index]:
131
- if not offsets or offset > offsets[-1]:
132
- new_offsets = [*offsets, offset]
133
- if len(new_offsets) == query_length:
134
- possible_offsets.append(new_offsets)
135
- else:
136
- get_offsets(new_offsets, positions_index + 1)
137
-
138
- get_offsets([], 0)
139
- for offsets in possible_offsets:
140
- yield score(candidate, offsets), offsets
@@ -1,275 +0,0 @@
1
- import asyncio
2
-
3
- from collections import Counter, defaultdict
4
- from asyncio import Lock
5
- from itertools import islice
6
- from operator import itemgetter
7
-
8
-
9
- class FuzzyIndex:
10
- """An index for path searching.
11
-
12
- This reduces the number of paths that need to be considered by the relativley expensive scoring function.
13
-
14
- """
15
-
16
- def __init__(self) -> None:
17
- self._paths: list[str] = []
18
- self._normalized_paths: list[str] = []
19
- self._index: dict[str, set[int]] = {}
20
- self._weights_cache: dict[str, dict[int, float]] = {}
21
- self._path_counter_cache: dict[str, Counter[str]] = {}
22
- self._lock = Lock()
23
-
24
- async def update_paths(self, paths: list[str]) -> None:
25
- """Update the paths and rebuild the index.
26
-
27
- Args:
28
- paths: New paths.
29
- """
30
- async with self._lock:
31
- self._paths = paths
32
- self._normalized_paths = await asyncio.to_thread(
33
- self._normalize_paths, paths
34
- )
35
- self._index = await asyncio.to_thread(
36
- self._build_trigram_index, self._normalized_paths
37
- )
38
-
39
- @classmethod
40
- def _normalize_paths(cls, paths: list[str]) -> list[str]:
41
- """Normalize the paths for searching.
42
-
43
- Args:
44
- paths: List of paths as strings.
45
-
46
- """
47
- normalized_paths = list(map(str.casefold, paths))
48
- return normalized_paths
49
-
50
- @classmethod
51
- def _extract_trigrams(cls, text: str) -> set[str]:
52
- """Return the set of all 3-character substrings (trigrams) in text.
53
-
54
- Padding with spaces ensures the start and end of the string are
55
- represented, so short strings and prefixes still produce trigrams.
56
-
57
- Args:
58
- text: candidate text (path).
59
-
60
- Returns:
61
- A set of 3 character strings.
62
- """
63
- padded = f" {text} "
64
- return {padded[index : index + 3] for index in range(len(padded) - 2)}
65
-
66
- @classmethod
67
- def _build_trigram_index(cls, paths: list[str]) -> dict[str, set[int]]:
68
- """Build an inverted index mapping each trigram to the indices of paths containing it."""
69
- index: dict[str, set[int]] = defaultdict(set)
70
- for path_index, path in enumerate(paths):
71
- for trigram in cls._extract_trigrams(path):
72
- index[trigram].add(path_index)
73
- return index
74
-
75
- def _find_candidates(
76
- self,
77
- query: str,
78
- min_trigram_overlap: float = 0.3,
79
- ) -> list[tuple[str, str]]:
80
- """Return the indices of paths that share enough trigrams with the query.
81
-
82
-
83
- Args:
84
- query: The query to apply to the candidates.
85
- min_trigram_overlap: The overlap threshold (default 30%) controls the trade-off between
86
- recall (not missing real matches) and how many candidates get passed
87
- on to the slower detailed scoring stage.
88
-
89
- """
90
- # An upper limit to the number of candidates
91
- # If there are this many matches, the user will need to type an additional character or two
92
- MAX_CANDIDATES = 2000
93
-
94
- query = query.casefold()
95
- query_length = len(query)
96
- if query_length == 1:
97
- # One character
98
- # Find paths which have the query on the first component
99
- slash_query = f"/{query}"
100
- candidates = list(
101
- islice(
102
- (
103
- (path, normalized_path)
104
- for path, normalized_path in zip(
105
- self._paths, self._normalized_paths
106
- )
107
- if (
108
- normalized_path.startswith(query)
109
- or slash_query in normalized_path
110
- )
111
- ),
112
- None,
113
- MAX_CANDIDATES,
114
- )
115
- )
116
- return candidates
117
-
118
- if query_length <= 3:
119
- # Find paths which have all the characters
120
- query_set = set(query)
121
- candidates = list(
122
- islice(
123
- (
124
- (path, normalized_path)
125
- for path, normalized_path in zip(
126
- self._paths, self._normalized_paths
127
- )
128
- if query_set.issubset(normalized_path)
129
- ),
130
- None,
131
- MAX_CANDIDATES,
132
- )
133
- )
134
- return candidates
135
-
136
- index = self._index
137
- query_trigrams = self._extract_trigrams(query)
138
- matching_buckets = [
139
- index[trigram] for trigram in query_trigrams if trigram in index
140
- ]
141
-
142
- trigram_match_counts = Counter(
143
- sorted(path_index for bucket in matching_buckets for path_index in bucket)
144
- )
145
- minimum_shared_trigrams = len(query_trigrams) * min_trigram_overlap
146
- unique_candidates = dict.fromkeys(
147
- islice(
148
- (
149
- (self._paths[path_index], self._normalized_paths[path_index])
150
- for path_index, count in trigram_match_counts.items()
151
- if count >= minimum_shared_trigrams
152
- ),
153
- None,
154
- MAX_CANDIDATES,
155
- )
156
- )
157
- candidates = list(unique_candidates.keys())
158
- return candidates
159
-
160
- @classmethod
161
- def make_weights(cls, path: str) -> dict[int, float]:
162
- """Assign relative weights to positions with a path.
163
-
164
- Initial characters are weighted more highly, and the last component
165
- is weighted higher still.
166
-
167
- Args:
168
- path: A path string.
169
-
170
- Returns:
171
- A mapping of string indices to relative weights.
172
- """
173
- weights: dict[int, float] = dict.fromkeys(
174
- range(path.rfind("/") + 1, len(path)), 1.0
175
- ) | {0: 1.0}
176
-
177
- index = path.find("/", None, -1)
178
- while index != -1:
179
- weights[index + 1] = weights.setdefault(index + 1, 1.0) + 1.0
180
- index = path.find("/", index + 1, -1)
181
- return weights
182
-
183
- async def search(self, query: str) -> list[str]:
184
-
185
- normalized_query = query.casefold()
186
- query_counter = Counter(normalized_query)
187
-
188
- scores: list[tuple[float, str]] = []
189
-
190
- TOP_COUNT = 1000
191
-
192
- async with self._lock:
193
- for path, normalized_path in self._find_candidates(normalized_query):
194
- if (
195
- path_counter := self._path_counter_cache.get(normalized_path)
196
- ) is None:
197
- path_counter = self._path_counter_cache[normalized_path] = Counter(
198
- normalized_path
199
- )
200
- if query_counter - path_counter:
201
- # Not all query characters are matched in the path
202
- continue
203
-
204
- if (weights := self._weights_cache.get(normalized_path)) is None:
205
- weights = self._weights_cache[normalized_path] = self.make_weights(
206
- normalized_path
207
- )
208
-
209
- score = sum(
210
- [
211
- weights.get(normalized_query.rfind(character), 0.0)
212
- for character in normalized_path
213
- ]
214
- )
215
- if normalized_path.endswith(normalized_query):
216
- score *= 2
217
- if normalized_path.endswith(f"/{normalized_query}"):
218
- score *= 2
219
- scores.append((score, path))
220
-
221
- scores.sort(reverse=True)
222
- top_scores = scores[:TOP_COUNT]
223
-
224
- return list(map(itemgetter(1), top_scores))
225
-
226
-
227
- if __name__ == "__main__":
228
-
229
- # from textual._profile import timer
230
-
231
- from time import perf_counter
232
- import contextlib
233
- from typing import Generator
234
-
235
- @contextlib.contextmanager
236
- def timer(
237
- subject: str = "time", threshold: float = 0
238
- ) -> Generator[None, None, None]:
239
- """print the elapsed time. (only used in debugging).
240
-
241
- Args:
242
- subject: Text shown in log.
243
- threshold: Time in second after which the log is written.
244
-
245
- """
246
- start = perf_counter()
247
- yield
248
- elapsed = perf_counter() - start
249
- if elapsed >= threshold:
250
- elapsed_ms = elapsed * 1000
251
- print(f"{subject} elapsed {elapsed_ms:.4f}ms")
252
-
253
- async def run():
254
- with open("paths.txt") as f:
255
- PATHS = [line.rstrip() for line in f.readlines()]
256
- print(len(PATHS))
257
- # PATHS = [
258
- # "~/foo/",
259
- # "~/foo/bar/",
260
- # "~/foo/bar/baz",
261
- # "~/worldhello/foo",
262
- # "~/Hello/world",
263
- # ]
264
- fuzzy = FuzzyIndex()
265
- with timer("update"):
266
- await fuzzy.update_paths(PATHS)
267
- with timer("search"):
268
- scores = await fuzzy.search("LICE")
269
- import rich
270
-
271
- rich.print(scores)
272
-
273
- import asyncio
274
-
275
- asyncio.run(run())
package/tui/gist.py DELETED
@@ -1,33 +0,0 @@
1
- import httpx
2
-
3
-
4
- # This doesn't work anonymously
5
- # TODO: Implement login
6
- def create_gist(
7
- files: dict[str, str],
8
- description: str = "",
9
- public: bool = True,
10
- ) -> str:
11
- """Create a GitHub Gist and return its URL.
12
-
13
- Args:
14
- files: A mapping of filename to file content.
15
- description: An optional description for the gist.
16
- public: Whether the gist should be public.
17
-
18
- Returns:
19
- The URL of the created gist.
20
- """
21
- payload = {
22
- "description": description,
23
- "public": public,
24
- "files": {name: {"content": content} for name, content in files.items()},
25
- }
26
-
27
- response = httpx.post(
28
- "https://api.github.com/gists",
29
- json=payload,
30
- headers={"Accept": "application/vnd.github+json"},
31
- )
32
- response.raise_for_status()
33
- return response.json()["html_url"]
package/tui/history.py DELETED
@@ -1,138 +0,0 @@
1
- from typing import TypedDict
2
- import asyncio
3
- import json
4
- from pathlib import Path
5
- from time import time
6
-
7
- import rich.repr
8
-
9
- from tui.complete import Complete
10
-
11
-
12
- class HistoryEntry(TypedDict):
13
- """An entry in the history file."""
14
-
15
- input: str
16
- timestamp: float
17
-
18
-
19
- @rich.repr.auto
20
- class History:
21
- """Manages a history file."""
22
-
23
- def __init__(self, path: Path) -> None:
24
- self.path = path
25
- self._lines: list[str] = []
26
- self._opened: bool = False
27
- self._current: str | None = None
28
- self.complete = Complete()
29
-
30
- def __rich_repr__(self) -> rich.repr.Result:
31
- yield self.path
32
-
33
- @property
34
- def current(self) -> str | None:
35
- return self._current
36
-
37
- @current.setter
38
- def current(self, current: str) -> None:
39
- self._current = current
40
-
41
- @property
42
- def size(self) -> int:
43
- return len(self._lines)
44
-
45
- async def open(self) -> bool:
46
- """Open the history file, read initial lines.
47
-
48
- Returns:
49
- `True` if lines were read, otherwise `False`.
50
- """
51
- if self._opened:
52
- return True
53
-
54
- def read_history() -> bool:
55
- """Read the history file (in a thread).
56
-
57
- Returns:
58
- `True` on success.
59
- """
60
- try:
61
- self.path.touch(exist_ok=True)
62
- with self.path.open("r") as history_file:
63
- self._lines = history_file.readlines()
64
-
65
- inputs: list[str] = []
66
- for line in self._lines:
67
- if (input := json.loads(line).get("input")) is not None:
68
- inputs.append(input.split(" ", 1)[0])
69
- self.complete.add_words(inputs)
70
- except Exception:
71
- return False
72
- return True
73
-
74
- self._opened = await asyncio.to_thread(read_history)
75
- return self._opened
76
-
77
- async def append(self, input: str) -> bool:
78
- """Append a history entry.
79
-
80
- Args:
81
- text: Text in the history.
82
- shell: Boolean that indicates if the text is shell (`True`) or prompt (`False`).
83
-
84
- Returns:
85
- `True` on success.
86
- """
87
-
88
- if not input:
89
- return True
90
- self.complete.add_words([input.split(" ")[0]])
91
-
92
- def write_line() -> bool:
93
- """Append a line to the history.
94
-
95
- Returns:
96
- `True` on success, `False` if write failed.
97
- """
98
- history_entry: HistoryEntry = {
99
- "input": input,
100
- "timestamp": time(),
101
- }
102
- line = json.dumps(history_entry)
103
- self._lines.append(line)
104
- try:
105
- with self.path.open("a") as history_file:
106
- history_file.write(f"{line}\n")
107
- except Exception:
108
- return False
109
- self._current = None
110
- return True
111
-
112
- if not self._opened:
113
- await self.open()
114
-
115
- return await asyncio.to_thread(write_line)
116
-
117
- async def get_entry(self, index: int) -> HistoryEntry:
118
- """Get a history entry via its index.
119
-
120
- Args:
121
- index: Index of entry. 0 for the last entry, negative indexes for previous entries.
122
-
123
- Returns:
124
- A history entry dict.
125
- """
126
- if index > 0:
127
- raise IndexError("History indices must be 0 or negative.")
128
- if not self._opened:
129
- await self.open()
130
-
131
- if index == 0:
132
- return {"input": self.current or "", "timestamp": time()}
133
- try:
134
- entry_line = self._lines[index]
135
- except IndexError:
136
- raise IndexError(f"No history entry at index {index}")
137
- history_entry: HistoryEntry = json.loads(entry_line)
138
- return history_entry