@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/jsonrpc.py DELETED
@@ -1,578 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- import json
5
- from asyncio import Future, get_running_loop
6
- from dataclasses import dataclass
7
- from functools import wraps
8
- import inspect
9
- from inspect import signature
10
- from enum import IntEnum
11
- import logging
12
- from types import TracebackType
13
- import weakref
14
-
15
- import rich.repr
16
- from typing import Callable, ParamSpec, TypeVar
17
- from typeguard import check_type, CollectionCheckStrategy, TypeCheckError
18
-
19
-
20
- type MethodType = Callable
21
- type JSONValue = str | int | float | bool | None
22
- type JSONType = dict[str, JSONType] | list[JSONType] | str | int | float | bool | None
23
- type JSONObject = dict[str, JSONType]
24
- type JSONList = list[JSONType]
25
-
26
- log = logging.getLogger("jsonrpc")
27
-
28
-
29
- def expose(name: str = "", prefix: str = ""):
30
- """Expose a method."""
31
-
32
- def expose_method[T: Callable](callable: T) -> T:
33
- setattr(callable, "_jsonrpc_expose", f"{prefix}{name or callable.__name__}")
34
- return callable
35
-
36
- return expose_method
37
-
38
-
39
- class NoDefault:
40
- def __repr__(self) -> str:
41
- return "NO_DEFAULT"
42
-
43
-
44
- NO_DEFAULT = NoDefault()
45
-
46
-
47
- class ErrorCode(IntEnum):
48
- """JSONRPC error codes"""
49
-
50
- # https://www.jsonrpc.org/specification
51
- PARSE_ERROR = -32700
52
- INVALID_REQUEST = -32600
53
- METHOD_NOT_FOUND = -32601
54
- INVALID_PARAMS = -32602
55
- INTERNAL_ERROR = -32603
56
-
57
-
58
- @dataclass
59
- class Parameter:
60
- type: type
61
- default: JSONType | NoDefault
62
-
63
-
64
- @dataclass
65
- class Method:
66
- name: str
67
- callable: Callable
68
- parameters: dict[str, Parameter]
69
-
70
-
71
- @rich.repr.auto
72
- class JSONRPCError(Exception):
73
- """An error thrown by the JSONRPC system."""
74
-
75
- CODE: ErrorCode = ErrorCode.INTERNAL_ERROR
76
- """Default code to use (may be overridden in the constructor)."""
77
-
78
- def __init__(
79
- self, message: str, id: str | int | None = None, code: ErrorCode | None = None
80
- ) -> None:
81
- self.message = message
82
- self.id = id
83
- self.code = code if code is not None else self.CODE
84
- super().__init__(message)
85
-
86
- def __rich_repr__(self) -> rich.repr.Result:
87
- yield self.message
88
- yield "id", self.id
89
- yield "code", self.code
90
-
91
-
92
- class InvalidRequest(JSONRPCError):
93
- CODE = ErrorCode.INVALID_REQUEST
94
-
95
-
96
- class InvalidParams(JSONRPCError):
97
- CODE = ErrorCode.INVALID_PARAMS
98
-
99
-
100
- class MethodNotFound(JSONRPCError):
101
- CODE = ErrorCode.METHOD_NOT_FOUND
102
-
103
-
104
- class InternalError(JSONRPCError):
105
- CODE = ErrorCode.INTERNAL_ERROR
106
-
107
-
108
- @rich.repr.auto
109
- class APIError(Exception):
110
- def __init__(self, code: int, message: str, data: JSONType) -> None:
111
- self.code = code
112
- self.message = message
113
- self.data = data
114
- if data is None:
115
- super().__init__(f"{message} ({code})")
116
- else:
117
- super().__init__(f"{message} ({code}); data={data!r}")
118
-
119
-
120
- class Server:
121
- def __init__(self) -> None:
122
- self._methods: dict[str, Method] = {}
123
-
124
- async def call(self, json: JSONObject | JSONList) -> JSONType:
125
- if isinstance(json, dict):
126
- # Single call
127
- response = await self._dispatch_object(json)
128
- else:
129
- # Batch call
130
- response = await self._dispatch_batch(json)
131
- log.debug(f"OUT {response}")
132
- return response
133
-
134
- def expose_instance(self, instance: object) -> None:
135
- """Add methods from the given instance."""
136
- for method_name in dir(instance):
137
- try:
138
- method = getattr(instance, method_name)
139
- except AttributeError:
140
- continue
141
- if (jsonrpc_expose := getattr(method, "_jsonrpc_expose", None)) is not None:
142
- self.method(jsonrpc_expose)(method)
143
-
144
- async def _dispatch_object(self, json: JSONObject) -> JSONType | None:
145
- json_id = json.get("id")
146
- if isinstance(json_id, (int, str)):
147
- request_id = json_id
148
- else:
149
- request_id = None
150
- try:
151
- return await self._dispatch_object_call(request_id, json)
152
- except JSONRPCError as error:
153
- return {
154
- "jsonrpc": "2.0",
155
- "id": error.id,
156
- "error": {
157
- "code": int(error.code),
158
- "message": error.message,
159
- },
160
- }
161
- except Exception as error:
162
- log.exception("Error dispatching JSONRPC request")
163
- return {
164
- "jsonrpc": "2.0",
165
- "id": request_id,
166
- "error": {
167
- "code": int(ErrorCode.INTERNAL_ERROR),
168
- "message": f"An error occurred handling your request: {error!r}",
169
- },
170
- }
171
-
172
- async def _dispatch_object_call(
173
- self, request_id: int | str | None, json: JSONObject
174
- ) -> JSONType | None:
175
- """Dispatch a JSONRPC call.
176
-
177
- Args:
178
- request_id: The request ID.
179
- json: JSON object with the remote call information.
180
-
181
- Returns:
182
- Result encoding in a JSONRPC result object, or `None` if the call is a notification
183
- and doesn't require a result.
184
- """
185
- if (jsonrpc := json.get("jsonrpc")) != "2.0":
186
- raise InvalidRequest(
187
- f"jsonrpc attribute should be '2.0'; found {jsonrpc!r}", id=request_id
188
- )
189
- if (method_name := json.get("method")) is None:
190
- raise InvalidRequest(
191
- "Invalid request; no value for 'method' given", id=request_id
192
- )
193
-
194
- if not isinstance(method_name, str):
195
- raise InvalidRequest(
196
- "Invalid request; 'method' should be a string type", id=request_id
197
- )
198
-
199
- if (method := self._methods.get(method_name)) is None:
200
- raise MethodNotFound(
201
- f"Method not found; {method_name!r} is not an exposed method",
202
- id=request_id,
203
- )
204
-
205
- no_params: JSONList = []
206
- params = json.get("params", no_params)
207
-
208
- if not isinstance(params, (list, dict)):
209
- raise InvalidRequest(
210
- "Invalid request; 'params' attribute should be a list or an object"
211
- )
212
-
213
- arguments: dict[str, JSONType | Server | NoDefault] = {
214
- name: parameter.default for name, parameter in method.parameters.items()
215
- }
216
-
217
- def validate(value: JSONType, parameter_type: type) -> None:
218
- """Validate types."""
219
- try:
220
- check_type(
221
- value,
222
- parameter_type,
223
- collection_check_strategy=CollectionCheckStrategy.ALL_ITEMS,
224
- )
225
- except TypeCheckError as error:
226
- raise InvalidParams(
227
- f"Parameter is not the expected type ({parameter_type}); {error}",
228
- id=request_id,
229
- )
230
-
231
- if isinstance(params, list):
232
- parameter_items = [
233
- (name, parameter)
234
- for name, parameter in method.parameters.items()
235
- if not issubclass(parameter.type, Server)
236
- ]
237
- for (parameter_name, parameter), value in zip(parameter_items, params):
238
- if issubclass(parameter.type, Server):
239
- value = self
240
- else:
241
- validate(value, parameter.type)
242
- arguments[parameter_name] = value
243
- else:
244
- for parameter_name, value in params.items():
245
- if parameter := method.parameters.get(parameter_name):
246
- validate(value, parameter.type)
247
- arguments[parameter_name] = value
248
-
249
- for name, parameter in method.parameters.items():
250
- if inspect.isclass(parameter.type) and issubclass(parameter.type, Server):
251
- arguments[name] = self
252
-
253
- try:
254
- call_result = method.callable(**arguments)
255
- if inspect.isawaitable(call_result):
256
- result = await call_result
257
- else:
258
- result = call_result
259
- except JSONRPCError as error:
260
- error.id = request_id
261
- raise error
262
- except Exception as error:
263
- raise
264
- # print("JSON error", repr(error))
265
- # log.debug(f"Error in exposed JSONRPC method; {error}")
266
- print("INTERNAL ERROR", error)
267
- raise InternalError(str(error), id=request_id)
268
-
269
- if request_id is None:
270
- # Notification
271
- return None
272
-
273
- response_object = {"jsonrpc": "2.0", "result": result, "id": request_id}
274
- return response_object
275
-
276
- async def _dispatch_batch(self, json: JSONList) -> list[JSONType]:
277
- batch_results: list[JSONType] = []
278
- for request in json:
279
- if not isinstance(request, dict):
280
- continue
281
- result = await self._dispatch_object(request)
282
- if result is not None:
283
- batch_results.append(result)
284
- return batch_results
285
-
286
- def process_callable(
287
- self, callable: Callable[[MethodType], MethodType]
288
- ) -> Callable[[MethodType], MethodType]:
289
- return callable
290
-
291
- def method[MethodT: Callable](
292
- self,
293
- name: str = "",
294
- *,
295
- prefix: str = "",
296
- ) -> Callable[[MethodT], MethodT]:
297
- """Decorator to expose a method via JSONRPC.
298
-
299
- Args:
300
- name: The name of the exposed method. Leave blank to auto-detect.
301
- prefix: A prefix to be applied to the name.
302
-
303
- Returns:
304
- Decorator.
305
- """
306
-
307
- def expose_method[T: Callable](callable: T) -> T:
308
- nonlocal name
309
- if not name:
310
- name = callable.__name__
311
- name = f"{prefix}{name}"
312
-
313
- parameters = {
314
- name: Parameter(
315
- (
316
- eval(parameter.annotation)
317
- if isinstance(parameter.annotation, str)
318
- else parameter.annotation
319
- ),
320
- (
321
- NO_DEFAULT
322
- if parameter.default is inspect._empty
323
- else parameter.default
324
- ),
325
- )
326
- for name, parameter in signature(callable).parameters.items()
327
- }
328
- self._methods[name] = Method(name, callable, parameters)
329
- return callable
330
-
331
- return expose_method
332
-
333
-
334
- @rich.repr.auto
335
- class MethodCall[ReturnType]:
336
- def __init__(
337
- self, method: str, id: int | None, parameters: dict[str, JSONType]
338
- ) -> None:
339
- self.method = method
340
- self.id = id
341
- self.parameters = parameters
342
- self.notification = False
343
- self.future: Future[ReturnType] = get_running_loop().create_future()
344
-
345
- def __rich_repr__(self) -> rich.repr.Result:
346
- yield "method", self.method
347
- yield "id", self.id, None
348
- yield "parameters", self.parameters
349
- yield "notification", self.notification, False
350
-
351
- @property
352
- def as_json_object(self) -> JSONType:
353
- json: JSONType
354
- if self.id is None:
355
- json = {
356
- "jsonrpc": "2.0",
357
- "method": self.method,
358
- "params": self.parameters,
359
- }
360
- else:
361
- json = {
362
- "jsonrpc": "2.0",
363
- "method": self.method,
364
- "params": self.parameters,
365
- "id": self.id,
366
- }
367
- return json
368
-
369
- async def wait(self, timeout: float | None = None) -> ReturnType | None:
370
- if self.id is None:
371
- return None
372
- async with asyncio.timeout(timeout):
373
- return await self.future
374
-
375
-
376
- P = ParamSpec("P") # Captures parameter types
377
- T = TypeVar("T") # Original return type
378
-
379
-
380
- class Request:
381
- def __init__(self, api: API, callback: Callable[[Request], None] | None) -> None:
382
- self.api = api
383
- self._calls: list[MethodCall] = []
384
- self._callback = callback
385
-
386
- def add_call(self, call: MethodCall) -> None:
387
- self._calls.append(call)
388
-
389
- def __enter__(self) -> Request:
390
- self.api._requests.append(self)
391
- return self
392
-
393
- def __exit__(
394
- self,
395
- exc_type: type[BaseException] | None,
396
- exc_val: type[BaseException],
397
- exc_tb: TracebackType,
398
- ) -> None:
399
- self.api._requests.pop()
400
- if self._callback is not None:
401
- self._callback(self)
402
-
403
- @property
404
- def body(self) -> JSONType | None:
405
- """The un-encoded JSON.
406
-
407
- Returns:
408
- The body, or `None` if no calls present on the request.
409
- """
410
- if not self._calls:
411
- return None
412
- calls = self._calls
413
- if len(calls) == 1:
414
- method_call = calls[0]
415
- return method_call.as_json_object
416
- else:
417
- return [method_call.as_json_object for method_call in calls]
418
-
419
- @property
420
- def body_json(self) -> bytes:
421
- """Dump the body as encoded json."""
422
- body_json = json.dumps(self.body).encode("utf-8")
423
- return body_json
424
-
425
-
426
- class API:
427
- def __init__(self) -> None:
428
- self._request_id = 0
429
- self._requests: list[Request] = []
430
- self._calls: weakref.WeakValueDictionary[int, MethodCall] = (
431
- weakref.WeakValueDictionary()
432
- )
433
-
434
- def request(self, callback: Callable[[Request], None] | None = None) -> Request:
435
- """Create a Request context manager."""
436
- request = Request(self, callback)
437
- return request
438
-
439
- def _process_method_response(self, response: JSONObject) -> None:
440
- if (id := response.get("id")) is not None and isinstance(id, int):
441
- if (method_call := self._calls.get(id)) is not None:
442
- try:
443
- result = response["result"]
444
- except KeyError:
445
- if (error := response.get("error")) is not None:
446
- if isinstance(error, dict):
447
- code = error.get("error", -1)
448
- if not isinstance(code, int):
449
- code = -1
450
- message = str(error.get("message", "unknown error"))
451
- data = error.get("data", None)
452
- method_call.future.set_exception(
453
- APIError(code, message, data)
454
- )
455
- else:
456
- method_call.future.set_result(result)
457
-
458
- def process_response(self, response: JSONType) -> None:
459
- if isinstance(response, list):
460
- for response_object in response:
461
- if isinstance(response_object, dict):
462
- self._process_method_response(response_object)
463
- elif isinstance(response, dict):
464
- self._process_method_response(response)
465
-
466
- def method(
467
- self, name: str = "", *, prefix: str = "", notification: bool = False
468
- ) -> Callable[[Callable[P, T]], Callable[P, MethodCall[T]]]:
469
- """Decorator to define a method.
470
-
471
- Args:
472
- name: Name of the method, or "" to auto-detect.
473
- prefix: String to prefix the name.
474
-
475
- Returns:
476
- Decorator.
477
- """
478
-
479
- def decorator(func: Callable[P, T]) -> Callable[P, MethodCall[T]]:
480
- nonlocal name
481
- if not name:
482
- name = func.__name__
483
- name = f"{prefix}{name}"
484
-
485
- @wraps(func)
486
- def wrapper(*args: P.args, **kwargs: P.kwargs) -> MethodCall[T]:
487
- parameters = signature(func).parameters
488
- call_parameters = {}
489
- for arg, parameter_name in zip(args, parameters):
490
- call_parameters[parameter_name] = arg
491
- for parameter_name, arg in kwargs:
492
- call_parameters[parameter_name] = arg
493
- if notification:
494
- method_call = MethodCall(name, None, call_parameters)
495
- else:
496
- self._request_id += 1
497
- method_call = MethodCall(name, self._request_id, call_parameters)
498
- self._requests[-1].add_call(method_call)
499
- if method_call.id is not None:
500
- self._calls[method_call.id] = method_call
501
- return method_call
502
-
503
- return wrapper
504
-
505
- return decorator
506
-
507
- def notification(
508
- self,
509
- name: str = "",
510
- *,
511
- prefix: str = "",
512
- ) -> Callable[[Callable[P, T]], Callable[P, MethodCall[T]]]:
513
- return self.method(name, prefix=prefix, notification=True)
514
-
515
-
516
- if __name__ == "__main__":
517
- from rich import print
518
-
519
- server = Server()
520
-
521
- @server.method()
522
- def hello(name: str) -> str:
523
- return f"hello {name}"
524
-
525
- @server.method()
526
- def add(server: Server, a: int, b: int) -> int:
527
- print("SERVER", server)
528
- return a + b
529
-
530
- # print("!", add(1, 2))
531
- print(server._methods)
532
-
533
- # print(
534
- # server.call(
535
- # [
536
- # {
537
- # "jsonrpc": "2.0",
538
- # "method": "hello",
539
- # "params": {"name": "Will"},
540
- # "id": "1",
541
- # },
542
- # {
543
- # "jsonrpc": "2.0",
544
- # "method": "add",
545
- # "params": {"a": 10, "b": 20},
546
- # "id": "2",
547
- # },
548
- # {"jsonrpc": "2.0", "method": "alert", "params": {"message": "Alert!"}},
549
- # ]
550
- # )
551
- # )
552
-
553
- async def test_proxy():
554
- api = API()
555
-
556
- @api.method()
557
- def add(a: int, b: int) -> int: ...
558
-
559
- @api.method()
560
- def greet(name: str) -> str: ...
561
-
562
- @api.notification()
563
- def alert(text: str) -> None: ...
564
-
565
- with api.request() as request:
566
- add(2, 4)
567
- greeting = greet("Will")
568
- alert("test")
569
- # add(1, "not a number")
570
-
571
- # greeting = await greeting.wait()
572
- # print(greeting)
573
-
574
- print(greeting)
575
-
576
- print(request.body)
577
-
578
- asyncio.run(test_proxy())
package/tui/menus.py DELETED
@@ -1,14 +0,0 @@
1
- from typing import NamedTuple
2
-
3
-
4
- class MenuItem(NamedTuple):
5
- """An entry in a Menu."""
6
-
7
- description: str
8
- action: str | None
9
- key: str | None = None
10
-
11
-
12
- CONVERSATION_MENUS: dict[str, list[MenuItem]] = {
13
- "fence": [MenuItem("Run this code", "run", "r")]
14
- }
@@ -1,69 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import re
5
- from datetime import datetime, timezone
6
- from pathlib import Path
7
- from typing import Any
8
-
9
- from tui import paths
10
-
11
-
12
- def sanitize_filename(name: str) -> str:
13
- """Replace characters that are problematic in file names with underscores."""
14
- return re.sub(r'[<>:"/\\|?*]', "_", name)
15
-
16
-
17
- class MessageLog:
18
- """Structured JSON message log for recording user input and agent output.
19
-
20
- Writes one JSON line per event to a session-scoped log file for
21
- diagnostic analysis (e.g. why the agent returned no response).
22
- Logs are grouped by session_id — one file per session.
23
- """
24
-
25
- def __init__(self, session_id: str, agent_name: str, log_dir: Path | None = None) -> None:
26
- self._session_id = session_id
27
- self._agent_name = agent_name
28
- dir = (log_dir or paths.get_log()) / "messages"
29
- dir.mkdir(parents=True, exist_ok=True)
30
- self._path = dir / f"{sanitize_filename(agent_name)}_{sanitize_filename(session_id)}.jsonl"
31
- self._file: Any = None
32
-
33
- def _write(self, event: str, data: dict[str, Any]) -> None:
34
- record = {
35
- "ts": datetime.now(timezone.utc).isoformat(),
36
- "session_id": self._session_id,
37
- "agent": self._agent_name,
38
- "event": event,
39
- **data,
40
- }
41
- if self._file is None:
42
- self._file = self._path.open("at", buffering=1)
43
- self._file.write(json.dumps(record, ensure_ascii=False) + "\n")
44
-
45
- def user_input(self, text: str, turn: int) -> None:
46
- self._write("user_input", {"text": text, "turn": turn})
47
-
48
- def agent_output(self, text: str, turn: int) -> None:
49
- self._write("agent_output", {"text": text, "turn": turn})
50
-
51
- def agent_thought(self, text: str, turn: int) -> None:
52
- self._write("agent_thought", {"text": text, "turn": turn})
53
-
54
- def tool_call(self, name: str, tool_id: str, turn: int, **extra: Any) -> None:
55
- self._write("tool_call", {"tool_name": name, "tool_id": tool_id, "turn": turn, **extra})
56
-
57
- def tool_result(self, name: str, tool_id: str, turn: int, status: str = "success") -> None:
58
- self._write("tool_result", {"tool_name": name, "tool_id": tool_id, "turn": turn, "status": status})
59
-
60
- def turn_end(self, turn: int, stop_reason: str | None) -> None:
61
- self._write("turn_end", {"turn": turn, "stop_reason": stop_reason})
62
-
63
- def error(self, message: str, turn: int | None = None, **extra: Any) -> None:
64
- self._write("error", {"message": message, "turn": turn, **extra})
65
-
66
- def close(self) -> None:
67
- if self._file is not None:
68
- self._file.close()
69
- self._file = None