@scemoon/cdh 1.0.6 → 1.0.7

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