@scemoon/cdh 1.0.9 → 1.0.10-beta.1

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 (786) hide show
  1. package/package.json +9 -2
  2. package/ai-dlc-skill/SKILL.md +0 -106
  3. package/ai-dlc-skill/architecture/project-structure.md +0 -78
  4. package/ai-dlc-skill/brownfield/README.md +0 -36
  5. package/ai-dlc-skill/brownfield/entry.md +0 -45
  6. package/ai-dlc-skill/brownfield/generate-context.sh +0 -64
  7. package/ai-dlc-skill/brownfield/scripts/deps.sh +0 -27
  8. package/ai-dlc-skill/brownfield/scripts/discover.sh +0 -34
  9. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +0 -45
  10. package/ai-dlc-skill/components/backend.md +0 -47
  11. package/ai-dlc-skill/components/desktop.md +0 -63
  12. package/ai-dlc-skill/components/mya.md +0 -219
  13. package/ai-dlc-skill/components/native.md +0 -73
  14. package/ai-dlc-skill/components/tta.md +0 -235
  15. package/ai-dlc-skill/components/web.md +0 -77
  16. package/ai-dlc-skill/components/wxa.md +0 -219
  17. package/ai-dlc-skill/contracts/README.md +0 -25
  18. package/ai-dlc-skill/core/adaptive-flow.md +0 -107
  19. package/ai-dlc-skill/core/security.md +0 -29
  20. package/ai-dlc-skill/core/task-registry.md +0 -153
  21. package/ai-dlc-skill/cross-tool/README.md +0 -20
  22. package/ai-dlc-skill/cross-tool/cline/export.sh +0 -38
  23. package/ai-dlc-skill/cross-tool/copilot/export.sh +0 -41
  24. package/ai-dlc-skill/cross-tool/cursor/export.sh +0 -53
  25. package/ai-dlc-skill/cross-tool/onecode/export.sh +0 -27
  26. package/ai-dlc-skill/cross-tool/opencode/export.sh +0 -38
  27. package/ai-dlc-skill/phases/debug/entry.md +0 -48
  28. package/ai-dlc-skill/phases/debug/lifecycle.md +0 -284
  29. package/ai-dlc-skill/phases/deliver/entry.md +0 -35
  30. package/ai-dlc-skill/phases/deliver/lifecycle.md +0 -185
  31. package/ai-dlc-skill/phases/deliver/prompt.md +0 -54
  32. package/ai-dlc-skill/phases/deliver/rules.md +0 -61
  33. package/ai-dlc-skill/phases/plan/design_system/accessibility.md +0 -268
  34. package/ai-dlc-skill/phases/plan/design_system/atomic_design.md +0 -341
  35. package/ai-dlc-skill/phases/plan/design_system/component_spec.md +0 -398
  36. package/ai-dlc-skill/phases/plan/design_system/design_tokens.md +0 -190
  37. package/ai-dlc-skill/phases/plan/design_system/iconography.md +0 -299
  38. package/ai-dlc-skill/phases/plan/design_system/platform_ui/desktop.md +0 -318
  39. package/ai-dlc-skill/phases/plan/design_system/platform_ui/mya.md +0 -354
  40. package/ai-dlc-skill/phases/plan/design_system/platform_ui/native.md +0 -328
  41. package/ai-dlc-skill/phases/plan/design_system/platform_ui/tta.md +0 -394
  42. package/ai-dlc-skill/phases/plan/design_system/platform_ui/web.md +0 -287
  43. package/ai-dlc-skill/phases/plan/design_system/platform_ui/wxa.md +0 -374
  44. package/ai-dlc-skill/phases/plan/design_system/theme_system.md +0 -318
  45. package/ai-dlc-skill/phases/plan/entry.md +0 -33
  46. package/ai-dlc-skill/phases/plan/lifecycle.md +0 -260
  47. package/ai-dlc-skill/phases/plan/prompt.md +0 -75
  48. package/ai-dlc-skill/phases/plan/rules.md +0 -60
  49. package/ai-dlc-skill/phases/understand/entry.md +0 -36
  50. package/ai-dlc-skill/phases/understand/lifecycle.md +0 -184
  51. package/ai-dlc-skill/phases/understand/prompt.md +0 -58
  52. package/ai-dlc-skill/phases/understand/rules.md +0 -49
  53. package/ai-dlc-skill/phases/verify/config/base_url.md +0 -65
  54. package/ai-dlc-skill/phases/verify/entry.md +0 -59
  55. package/ai-dlc-skill/phases/verify/gates/browser_e2e.md +0 -96
  56. package/ai-dlc-skill/phases/verify/lifecycle.md +0 -217
  57. package/ai-dlc-skill/phases/verify/prompt.md +0 -73
  58. package/ai-dlc-skill/phases/verify/rules.md +0 -91
  59. package/ai-dlc-skill/phases/verify/runners/playwright_local.md +0 -103
  60. package/ai-dlc-skill/practices/bdd.md +0 -119
  61. package/ai-dlc-skill/practices/sdd.md +0 -84
  62. package/ai-dlc-skill/practices/tdd.md +0 -128
  63. package/ai-dlc-skill/providers/README.md +0 -114
  64. package/ai-dlc-skill/providers/aliyun/SKILL.md +0 -204
  65. package/ai-dlc-skill/providers/aliyun/api/rest-api.md +0 -214
  66. package/ai-dlc-skill/providers/aliyun/api/sdk.md +0 -307
  67. package/ai-dlc-skill/providers/aliyun/best-practices/database-design.md +0 -363
  68. package/ai-dlc-skill/providers/aliyun/best-practices/function-design.md +0 -424
  69. package/ai-dlc-skill/providers/aliyun/best-practices/troubleshooting.md +0 -258
  70. package/ai-dlc-skill/providers/aliyun/cli/database.md +0 -263
  71. package/ai-dlc-skill/providers/aliyun/cli/functions.md +0 -263
  72. package/ai-dlc-skill/providers/aliyun/cli/hosting.md +0 -226
  73. package/ai-dlc-skill/providers/aliyun/cli/setup.md +0 -235
  74. package/ai-dlc-skill/providers/aliyun/cli/storage.md +0 -315
  75. package/ai-dlc-skill/providers/aliyun/deployment.yaml +0 -66
  76. package/ai-dlc-skill/providers/aliyun/integration/ci-cd.md +0 -288
  77. package/ai-dlc-skill/providers/aliyun/preview.yaml +0 -84
  78. package/ai-dlc-skill/providers/aliyun/provider.yaml +0 -160
  79. package/ai-dlc-skill/providers/aliyun/security/authentication.md +0 -254
  80. package/ai-dlc-skill/providers/aliyun/services/cdn-hosting.md +0 -220
  81. package/ai-dlc-skill/providers/aliyun/services/database.md +0 -319
  82. package/ai-dlc-skill/providers/aliyun/services/function-compute.md +0 -273
  83. package/ai-dlc-skill/providers/aliyun/services/overview.md +0 -163
  84. package/ai-dlc-skill/providers/aliyun/services/serverless-app-engine.md +0 -266
  85. package/ai-dlc-skill/providers/aliyun/services/storage.md +0 -269
  86. package/ai-dlc-skill/providers/tcb/SKILL.md +0 -208
  87. package/ai-dlc-skill/providers/tcb/api/rest-api.md +0 -338
  88. package/ai-dlc-skill/providers/tcb/api/sdk.md +0 -288
  89. package/ai-dlc-skill/providers/tcb/best-practices/database-design.md +0 -452
  90. package/ai-dlc-skill/providers/tcb/best-practices/function-design.md +0 -502
  91. package/ai-dlc-skill/providers/tcb/best-practices/troubleshooting.md +0 -462
  92. package/ai-dlc-skill/providers/tcb/cli/cls.md +0 -133
  93. package/ai-dlc-skill/providers/tcb/cli/database.md +0 -230
  94. package/ai-dlc-skill/providers/tcb/cli/env.md +0 -207
  95. package/ai-dlc-skill/providers/tcb/cli/functions.md +0 -276
  96. package/ai-dlc-skill/providers/tcb/cli/hosting.md +0 -219
  97. package/ai-dlc-skill/providers/tcb/cli/setup.md +0 -218
  98. package/ai-dlc-skill/providers/tcb/cli/storage.md +0 -233
  99. package/ai-dlc-skill/providers/tcb/deployment.yaml +0 -111
  100. package/ai-dlc-skill/providers/tcb/integration/ci-cd.md +0 -309
  101. package/ai-dlc-skill/providers/tcb/integration/mcp-server.md +0 -371
  102. package/ai-dlc-skill/providers/tcb/preview.yaml +0 -83
  103. package/ai-dlc-skill/providers/tcb/provider.yaml +0 -172
  104. package/ai-dlc-skill/providers/tcb/security/authentication.md +0 -241
  105. package/ai-dlc-skill/providers/tcb/services/cloud-database.md +0 -299
  106. package/ai-dlc-skill/providers/tcb/services/cloud-functions.md +0 -265
  107. package/ai-dlc-skill/providers/tcb/services/cloud-hosting.md +0 -264
  108. package/ai-dlc-skill/providers/tcb/services/cloud-run.md +0 -285
  109. package/ai-dlc-skill/providers/tcb/services/cloud-storage.md +0 -245
  110. package/ai-dlc-skill/providers/tcb/services/overview.md +0 -174
  111. package/ai-dlc-skill/pybdd/README.md +0 -41
  112. package/ai-dlc-skill/pybdd/conftest.py +0 -17
  113. package/ai-dlc-skill/pybdd/example/auth/login.feature +0 -32
  114. package/ai-dlc-skill/pybdd/pytest.ini +0 -5
  115. package/ai-dlc-skill/pybdd/steps/.gitkeep +0 -1
  116. package/ai-dlc-skill/pybdd/steps/test_example_steps.py +0 -65
  117. package/ai-dlc-skill/requirements.md +0 -140
  118. package/ai-dlc-skill/skill.yaml +0 -135
  119. package/ai-dlc-skill/templates/brownfield/context.md +0 -78
  120. package/ai-dlc-skill/templates/integration/CHANGELOG.md +0 -41
  121. package/ai-dlc-skill/templates/integration/asyncapi.yaml +0 -43
  122. package/ai-dlc-skill/templates/integration/contract-diff.md +0 -63
  123. package/ai-dlc-skill/templates/integration/contract-spec.md +0 -49
  124. package/ai-dlc-skill/templates/integration/openapi.yaml +0 -18
  125. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +0 -36
  126. package/ai-dlc-skill/templates/plan/design.md +0 -49
  127. package/ai-dlc-skill/templates/plan/task-list.md +0 -32
  128. package/ai-dlc-skill/templates/project/README.md +0 -126
  129. package/ai-dlc-skill/templates/project/template.md +0 -119
  130. package/ai-dlc-skill/templates/understand/feature.feature +0 -30
  131. package/ai-dlc-skill/templates/understand/intent.md +0 -29
  132. package/ai-dlc-skill/templates/understand/spec-delta.md +0 -47
  133. package/ai-dlc-skill/templates/verify/test-unit.py +0 -27
  134. package/ai-dlc-skill/walkthrough/collect.sh +0 -50
  135. package/ai-dlc-skill/walkthrough/template.md +0 -54
  136. package/cdh/__init__.py +0 -0
  137. package/cdh/__main__.py +0 -4
  138. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  139. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  140. package/cdh/__pycache__/cli_logging.cpython-314.pyc +0 -0
  141. package/cdh/__pycache__/config.cpython-314.pyc +0 -0
  142. package/cdh/__pycache__/project_loader.cpython-314.pyc +0 -0
  143. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  144. package/cdh/__pycache__/session_store.cpython-314.pyc +0 -0
  145. package/cdh/cdh_session_aggregator.py +0 -258
  146. package/cdh/cli.py +0 -3000
  147. package/cdh/cli_logging.py +0 -45
  148. package/cdh/config.py +0 -28
  149. package/cdh/event_loop/__init__.py +0 -7
  150. package/cdh/event_loop/bus.py +0 -123
  151. package/cdh/event_loop/events.py +0 -25
  152. package/cdh/event_loop/runner.py +0 -28
  153. package/cdh/event_loop/scheduler.py +0 -158
  154. package/cdh/generators/__init__.py +0 -35
  155. package/cdh/generators/_runtime.py +0 -176
  156. package/cdh/generators/ada/MANIFEST.toml +0 -14
  157. package/cdh/generators/ada/template.ads.tmpl +0 -7
  158. package/cdh/generators/bash/MANIFEST.toml +0 -14
  159. package/cdh/generators/bash/template.sh.tmpl +0 -16
  160. package/cdh/generators/builtin_index.json +0 -590
  161. package/cdh/generators/c/MANIFEST.toml +0 -14
  162. package/cdh/generators/c/template.h.tmpl +0 -20
  163. package/cdh/generators/cli.py +0 -379
  164. package/cdh/generators/clojure/MANIFEST.toml +0 -14
  165. package/cdh/generators/clojure/template.clj.tmpl +0 -13
  166. package/cdh/generators/cobol/MANIFEST.toml +0 -14
  167. package/cdh/generators/cobol/template.cbl.tmpl +0 -14
  168. package/cdh/generators/cpp/MANIFEST.toml +0 -14
  169. package/cdh/generators/cpp/template.hpp.tmpl +0 -32
  170. package/cdh/generators/crystal/MANIFEST.toml +0 -14
  171. package/cdh/generators/crystal/template.cr.tmpl +0 -11
  172. package/cdh/generators/csharp/MANIFEST.toml +0 -23
  173. package/cdh/generators/csharp/template.cs.tmpl +0 -14
  174. package/cdh/generators/cython/MANIFEST.toml +0 -14
  175. package/cdh/generators/cython/template.pyx.tmpl +0 -17
  176. package/cdh/generators/d/MANIFEST.toml +0 -14
  177. package/cdh/generators/d/template.d.tmpl +0 -24
  178. package/cdh/generators/dart/MANIFEST.toml +0 -17
  179. package/cdh/generators/dart/template.dart.tmpl +0 -27
  180. package/cdh/generators/elixir/MANIFEST.toml +0 -17
  181. package/cdh/generators/elixir/template.ex.tmpl +0 -27
  182. package/cdh/generators/elm/MANIFEST.toml +0 -14
  183. package/cdh/generators/elm/template.elm.tmpl +0 -20
  184. package/cdh/generators/erlang/MANIFEST.toml +0 -14
  185. package/cdh/generators/erlang/template.erl.tmpl +0 -18
  186. package/cdh/generators/fortran/MANIFEST.toml +0 -14
  187. package/cdh/generators/fortran/template.f90.tmpl +0 -24
  188. package/cdh/generators/fsharp/MANIFEST.toml +0 -14
  189. package/cdh/generators/fsharp/template.fs.tmpl +0 -17
  190. package/cdh/generators/go/MANIFEST.toml +0 -18
  191. package/cdh/generators/go/imports.go.tmpl +0 -3
  192. package/cdh/generators/go/template.go.tmpl +0 -9
  193. package/cdh/generators/graphql-schema/MANIFEST.toml +0 -18
  194. package/cdh/generators/graphql-schema/template.graphqls.tmpl +0 -12
  195. package/cdh/generators/groovy/MANIFEST.toml +0 -14
  196. package/cdh/generators/groovy/template.groovy.tmpl +0 -28
  197. package/cdh/generators/hack/MANIFEST.toml +0 -14
  198. package/cdh/generators/hack/template.hh.tmpl +0 -24
  199. package/cdh/generators/haskell/MANIFEST.toml +0 -14
  200. package/cdh/generators/haskell/template.hs.tmpl +0 -20
  201. package/cdh/generators/haxe/MANIFEST.toml +0 -14
  202. package/cdh/generators/haxe/template.hx.tmpl +0 -20
  203. package/cdh/generators/idris/MANIFEST.toml +0 -14
  204. package/cdh/generators/idris/template.idr.tmpl +0 -22
  205. package/cdh/generators/java/MANIFEST.toml +0 -18
  206. package/cdh/generators/java/template.java.tmpl +0 -13
  207. package/cdh/generators/julia/MANIFEST.toml +0 -14
  208. package/cdh/generators/julia/template.jl.tmpl +0 -27
  209. package/cdh/generators/kotlin/MANIFEST.toml +0 -18
  210. package/cdh/generators/kotlin/template.kt.tmpl +0 -12
  211. package/cdh/generators/lua/MANIFEST.toml +0 -14
  212. package/cdh/generators/lua/template.lua.tmpl +0 -27
  213. package/cdh/generators/matlab/MANIFEST.toml +0 -14
  214. package/cdh/generators/matlab/template.m.tmpl +0 -26
  215. package/cdh/generators/nim/MANIFEST.toml +0 -14
  216. package/cdh/generators/nim/template.nim.tmpl +0 -12
  217. package/cdh/generators/nix/MANIFEST.toml +0 -14
  218. package/cdh/generators/nix/template.nix.tmpl +0 -8
  219. package/cdh/generators/objective-c/MANIFEST.toml +0 -14
  220. package/cdh/generators/objective-c/template.m.tmpl +0 -31
  221. package/cdh/generators/ocaml/MANIFEST.toml +0 -14
  222. package/cdh/generators/ocaml/template.ml.tmpl +0 -13
  223. package/cdh/generators/pascal/MANIFEST.toml +0 -14
  224. package/cdh/generators/pascal/template.pas.tmpl +0 -5
  225. package/cdh/generators/perl/MANIFEST.toml +0 -14
  226. package/cdh/generators/perl/template.pm.tmpl +0 -27
  227. package/cdh/generators/php/MANIFEST.toml +0 -17
  228. package/cdh/generators/php/template.php.tmpl +0 -31
  229. package/cdh/generators/powershell/MANIFEST.toml +0 -14
  230. package/cdh/generators/powershell/template.ps1.tmpl +0 -20
  231. package/cdh/generators/protobuf/MANIFEST.toml +0 -18
  232. package/cdh/generators/protobuf/template.proto.tmpl +0 -13
  233. package/cdh/generators/python/MANIFEST.toml +0 -18
  234. package/cdh/generators/python/template.py.tmpl +0 -12
  235. package/cdh/generators/r/MANIFEST.toml +0 -14
  236. package/cdh/generators/r/template.R.tmpl +0 -29
  237. package/cdh/generators/racket/MANIFEST.toml +0 -14
  238. package/cdh/generators/racket/template.rkt.tmpl +0 -15
  239. package/cdh/generators/registry.py +0 -211
  240. package/cdh/generators/ruby/MANIFEST.toml +0 -17
  241. package/cdh/generators/ruby/template.rb.tmpl +0 -27
  242. package/cdh/generators/rust/MANIFEST.toml +0 -18
  243. package/cdh/generators/rust/template.rs.tmpl +0 -16
  244. package/cdh/generators/scala/MANIFEST.toml +0 -20
  245. package/cdh/generators/scala/template.scala.tmpl +0 -13
  246. package/cdh/generators/scheme/MANIFEST.toml +0 -14
  247. package/cdh/generators/scheme/template.scm.tmpl +0 -16
  248. package/cdh/generators/solidity/MANIFEST.toml +0 -14
  249. package/cdh/generators/solidity/template.sol.tmpl +0 -24
  250. package/cdh/generators/swift/MANIFEST.toml +0 -18
  251. package/cdh/generators/swift/template.swift.tmpl +0 -10
  252. package/cdh/generators/typescript/MANIFEST.toml +0 -18
  253. package/cdh/generators/typescript/template.ts.tmpl +0 -7
  254. package/cdh/generators/version.py +0 -214
  255. package/cdh/generators/zig/MANIFEST.toml +0 -14
  256. package/cdh/generators/zig/template.zig.tmpl +0 -20
  257. package/cdh/logging.py +0 -314
  258. package/cdh/optimizer/__init__.py +0 -7
  259. package/cdh/optimizer/loop.py +0 -201
  260. package/cdh/optimizer/mutation.py +0 -85
  261. package/cdh/optimizer/reward.py +0 -51
  262. package/cdh/optimizer/tracker.py +0 -118
  263. package/cdh/project_loader.py +0 -1022
  264. package/cdh/rules/patterns.yaml +0 -132
  265. package/cdh/rules/spectral.yaml +0 -301
  266. package/cdh/scaffold.py +0 -1436
  267. package/cdh/session_store.py +0 -221
  268. package/cdh/state_schema.py +0 -127
  269. package/cdh/tools/__init__.py +0 -57
  270. package/cdh/tools/cls_search.py +0 -406
  271. package/cdh/tools/contract_diff.py +0 -644
  272. package/cdh/tools/deploy_stack.py +0 -590
  273. package/cdh/tools/generate_shared.py +0 -300
  274. package/cdh/tools/iac_gen.py +0 -224
  275. package/cdh/tools/otel_export.py +0 -125
  276. package/cdh/tools/pattern_detect.py +0 -451
  277. package/cdh/tools/retrofit_labels.py +0 -505
  278. package/cdh/trace/__init__.py +0 -101
  279. package/cdh/trace/__pycache__/__init__.cpython-314.pyc +0 -0
  280. package/cdh/trace/dashboard/__init__.py +0 -61
  281. package/cdh/trace/dashboard/api.py +0 -1032
  282. package/cdh/trace/dashboard/app.html +0 -1321
  283. package/cdh/trace/dashboard/server.py +0 -310
  284. package/cdh/trace/otel_exporter.py +0 -462
  285. package/cdh/trace/otel_tracer.py +0 -281
  286. package/cdh/tui.py +0 -1084
  287. package/cdh/validators/__init__.py +0 -16
  288. package/cdh/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  289. package/cdh/validators/__pycache__/bdd.cpython-314.pyc +0 -0
  290. package/cdh/validators/__pycache__/dag.cpython-314.pyc +0 -0
  291. package/cdh/validators/__pycache__/ears.cpython-314.pyc +0 -0
  292. package/cdh/validators/__pycache__/fr_namespace.cpython-314.pyc +0 -0
  293. package/cdh/validators/bdd.py +0 -144
  294. package/cdh/validators/dag.py +0 -179
  295. package/cdh/validators/ears.py +0 -452
  296. package/cdh/validators/fr_namespace.py +0 -143
  297. package/cdh/validators/spectral.py +0 -475
  298. package/cdh/verification/__init__.py +0 -3
  299. package/cdh/verification/aggregation.py +0 -53
  300. package/cdh/verification/gates/__init__.py +0 -5
  301. package/cdh/verification/gates/base.py +0 -18
  302. package/cdh/verification/gates/lint_gate.py +0 -37
  303. package/cdh/verification/gates/test_gate.py +0 -41
  304. package/cdh/verification/loop.py +0 -93
  305. package/cdh/verification/policy.py +0 -24
  306. package/onecode/__init__.py +0 -1
  307. package/onecode/__main__.py +0 -4
  308. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  309. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  310. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  311. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  312. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  313. package/onecode/agent/__init__.py +0 -0
  314. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  315. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  316. package/onecode/agent/__pycache__/checkpoint.cpython-314.pyc +0 -0
  317. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  318. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  319. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  320. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  321. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  322. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  323. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  324. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  325. package/onecode/agent/__pycache__/turn_record.cpython-314.pyc +0 -0
  326. package/onecode/agent/agents/__init__.py +0 -29
  327. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  328. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  329. package/onecode/agent/agents/prompts/build-agent.md +0 -50
  330. package/onecode/agent/agents/prompts/compaction-instructions.md +0 -12
  331. package/onecode/agent/agents/prompts/explore-agent.md +0 -42
  332. package/onecode/agent/agents/prompts/plan-agent.md +0 -44
  333. package/onecode/agent/agents/prompts/plan-gate-hard.md +0 -4
  334. package/onecode/agent/agents/prompts/plan-gate-soft.md +0 -3
  335. package/onecode/agent/agents/prompts/solo-agent.md +0 -57
  336. package/onecode/agent/agents/prompts/subagent-constraints.md +0 -10
  337. package/onecode/agent/agents/prompts/summary-instructions.md +0 -7
  338. package/onecode/agent/agents/prompts/title-instructions.md +0 -3
  339. package/onecode/agent/agents/prompts/tool-descriptions.md +0 -129
  340. package/onecode/agent/agents/types.py +0 -786
  341. package/onecode/agent/attachments.py +0 -112
  342. package/onecode/agent/cdh_loader.py +0 -3
  343. package/onecode/agent/checkpoint.py +0 -285
  344. package/onecode/agent/context.py +0 -465
  345. package/onecode/agent/engine.py +0 -3547
  346. package/onecode/agent/event_bridge.py +0 -75
  347. package/onecode/agent/hooks.py +0 -86
  348. package/onecode/agent/onecode_agent_acp.py +0 -2993
  349. package/onecode/agent/permissions.py +0 -150
  350. package/onecode/agent/permissions_store.py +0 -73
  351. package/onecode/agent/project_doc.py +0 -19
  352. package/onecode/agent/question_detect.py +0 -230
  353. package/onecode/agent/session.py +0 -3
  354. package/onecode/agent/snapshot.py +0 -144
  355. package/onecode/agent/tools/__init__.py +0 -17
  356. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  357. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  358. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  359. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  360. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  361. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  362. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  363. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  364. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  365. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  366. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  367. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  368. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  369. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  370. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  371. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  372. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  373. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  374. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  375. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  376. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  377. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  378. package/onecode/agent/tools/agent_tools.py +0 -128
  379. package/onecode/agent/tools/apply_patch_tool.py +0 -138
  380. package/onecode/agent/tools/bash_tool.py +0 -121
  381. package/onecode/agent/tools/communication_tools.py +0 -154
  382. package/onecode/agent/tools/config_tool.py +0 -130
  383. package/onecode/agent/tools/cron_tools.py +0 -178
  384. package/onecode/agent/tools/errors.py +0 -17
  385. package/onecode/agent/tools/file_ops.py +0 -221
  386. package/onecode/agent/tools/file_tools.py +0 -225
  387. package/onecode/agent/tools/git_tools.py +0 -88
  388. package/onecode/agent/tools/lsp_tools.py +0 -404
  389. package/onecode/agent/tools/mcp_tools.py +0 -211
  390. package/onecode/agent/tools/permission_handler.py +0 -46
  391. package/onecode/agent/tools/permissions.py +0 -77
  392. package/onecode/agent/tools/protocol.py +0 -20
  393. package/onecode/agent/tools/registry.py +0 -210
  394. package/onecode/agent/tools/sandbox.py +0 -460
  395. package/onecode/agent/tools/schema_validation.py +0 -100
  396. package/onecode/agent/tools/skill_tools.py +0 -52
  397. package/onecode/agent/tools/todo_tools.py +0 -208
  398. package/onecode/agent/tools/web_tools.py +0 -530
  399. package/onecode/agent/turn_record.py +0 -28
  400. package/onecode/builtin_skills/agent-browser/SKILL.md +0 -212
  401. package/onecode/builtin_skills/agent-browser/skill.yaml +0 -8
  402. package/onecode/builtin_skills/cloudbase/SKILL.md +0 -162
  403. package/onecode/builtin_skills/cloudbase/skill.yaml +0 -7
  404. package/onecode/builtin_skills/git/SKILL.md +0 -64
  405. package/onecode/builtin_skills/git/skill.yaml +0 -7
  406. package/onecode/builtin_skills/shell/SKILL.md +0 -58
  407. package/onecode/builtin_skills/shell/skill.yaml +0 -8
  408. package/onecode/builtin_skills/skill-creator/SKILL.md +0 -106
  409. package/onecode/builtin_skills/skill-creator/skill.yaml +0 -8
  410. package/onecode/cli.py +0 -1325
  411. package/onecode/codebase/__init__.py +0 -69
  412. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  413. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  414. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  415. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  416. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  417. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  418. package/onecode/codebase/chunker.py +0 -125
  419. package/onecode/codebase/indexer.py +0 -154
  420. package/onecode/codebase/retriever.py +0 -240
  421. package/onecode/codebase/storage.py +0 -153
  422. package/onecode/codebase/tools.py +0 -59
  423. package/onecode/commands.py +0 -673
  424. package/onecode/config.py +0 -539
  425. package/onecode/config_screen.py +0 -486
  426. package/onecode/cron/__init__.py +0 -3
  427. package/onecode/lsp/__init__.py +0 -3
  428. package/onecode/mcp/__init__.py +0 -11
  429. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  430. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  431. package/onecode/mcp/__pycache__/cloudbase.cpython-314.pyc +0 -0
  432. package/onecode/mcp/__pycache__/config.cpython-314.pyc +0 -0
  433. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  434. package/onecode/mcp/__pycache__/oauth.cpython-314.pyc +0 -0
  435. package/onecode/mcp/client.py +0 -305
  436. package/onecode/mcp/cloudbase.py +0 -188
  437. package/onecode/mcp/config.py +0 -363
  438. package/onecode/mcp/manager.py +0 -603
  439. package/onecode/mcp/oauth.py +0 -199
  440. package/onecode/memory/__init__.py +0 -106
  441. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  442. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  443. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  444. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  445. package/onecode/memory/backend.py +0 -179
  446. package/onecode/memory/pyramid.py +0 -145
  447. package/onecode/memory/recall.py +0 -322
  448. package/onecode/migrate.py +0 -122
  449. package/onecode/models/__init__.py +0 -4
  450. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  451. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  452. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  453. package/onecode/models/__pycache__/ollama_manager.cpython-314.pyc +0 -0
  454. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  455. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  456. package/onecode/models/errors.py +0 -104
  457. package/onecode/models/messages.py +0 -750
  458. package/onecode/models/ollama_manager.py +0 -167
  459. package/onecode/models/provider.py +0 -730
  460. package/onecode/models/providers/__init__.py +0 -17
  461. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  462. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  463. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  464. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  465. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  466. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  467. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  468. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  469. package/onecode/models/providers/anthropic_provider.py +0 -286
  470. package/onecode/models/providers/deepseek_provider.py +0 -221
  471. package/onecode/models/providers/glm_provider.py +0 -219
  472. package/onecode/models/providers/minimax_provider.py +0 -182
  473. package/onecode/models/providers/minimaxi_provider.py +0 -426
  474. package/onecode/models/providers/ollama_provider.py +0 -183
  475. package/onecode/models/providers/openai_provider.py +0 -234
  476. package/onecode/models/registry.py +0 -349
  477. package/onecode/server/__init__.py +0 -3
  478. package/onecode/server/app.py +0 -251
  479. package/onecode/skills/__init__.py +0 -11
  480. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  481. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  482. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  483. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  484. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  485. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  486. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  487. package/onecode/skills/argument_substitution.py +0 -38
  488. package/onecode/skills/bootstrap.py +0 -37
  489. package/onecode/skills/create.py +0 -56
  490. package/onecode/skills/frontmatter.py +0 -33
  491. package/onecode/skills/loader.py +0 -215
  492. package/onecode/skills/manager.py +0 -75
  493. package/onecode/skills/model.py +0 -43
  494. package/onecode/storage/__init__.py +0 -0
  495. package/onecode/storage/activity.py +0 -63
  496. package/onecode/storage/project.py +0 -54
  497. package/onecode/storage/session.py +0 -112
  498. package/onecode/tasks/__init__.py +0 -26
  499. package/onecode/tasks/manager.py +0 -232
  500. package/onecode/tasks/models.py +0 -240
  501. package/onecode/trace/__init__.py +0 -0
  502. package/onecode/trace/tracer.py +0 -173
  503. package/onecode/utils/__init__.py +0 -0
  504. package/onecode/utils/helpers.py +0 -20
  505. package/onecode/verification/__init__.py +0 -5
  506. package/onecode/verification/__pycache__/__init__.cpython-314.pyc +0 -0
  507. package/onecode/verification/__pycache__/aggregation.cpython-314.pyc +0 -0
  508. package/onecode/verification/__pycache__/loop.cpython-314.pyc +0 -0
  509. package/onecode/verification/__pycache__/policy.cpython-314.pyc +0 -0
  510. package/onecode/verification/aggregation.py +0 -53
  511. package/onecode/verification/gates/__init__.py +0 -6
  512. package/onecode/verification/gates/__pycache__/__init__.cpython-314.pyc +0 -0
  513. package/onecode/verification/gates/__pycache__/base.cpython-314.pyc +0 -0
  514. package/onecode/verification/gates/__pycache__/lint_gate.cpython-314.pyc +0 -0
  515. package/onecode/verification/gates/__pycache__/test_gate.cpython-314.pyc +0 -0
  516. package/onecode/verification/gates/__pycache__/type_gate.cpython-314.pyc +0 -0
  517. package/onecode/verification/gates/base.py +0 -20
  518. package/onecode/verification/gates/lint_gate.py +0 -45
  519. package/onecode/verification/gates/test_gate.py +0 -62
  520. package/onecode/verification/gates/type_gate.py +0 -46
  521. package/onecode/verification/loop.py +0 -95
  522. package/onecode/verification/policy.py +0 -29
  523. package/pyproject.toml +0 -84
  524. package/tui/__init__.py +0 -46
  525. package/tui/__main__.py +0 -4
  526. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  527. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  528. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  529. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  530. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  531. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  532. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  533. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  534. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  535. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  536. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  537. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  538. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  539. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  540. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  541. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  542. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  543. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  544. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  545. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  546. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  547. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  548. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  549. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  550. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  551. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  552. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  553. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  554. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  555. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  556. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  557. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  558. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  559. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  560. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  561. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  562. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  563. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  564. package/tui/_loop.py +0 -86
  565. package/tui/_path_fuzzy_search.py +0 -48
  566. package/tui/_path_match.py +0 -141
  567. package/tui/about.py +0 -95
  568. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  569. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  570. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  571. package/tui/acp/__pycache__/event_tap.cpython-314.pyc +0 -0
  572. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  573. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  574. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  575. package/tui/acp/agent.py +0 -1212
  576. package/tui/acp/api.py +0 -79
  577. package/tui/acp/encode_tool_call_id.py +0 -12
  578. package/tui/acp/event_tap.py +0 -107
  579. package/tui/acp/messages.py +0 -222
  580. package/tui/acp/prompt.py +0 -53
  581. package/tui/acp/protocol.py +0 -551
  582. package/tui/agent.py +0 -70
  583. package/tui/agent_schema.py +0 -76
  584. package/tui/agents.py +0 -46
  585. package/tui/ansi/__init__.py +0 -1
  586. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  587. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  588. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  589. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  590. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  591. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  592. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  593. package/tui/ansi/_ansi.py +0 -1689
  594. package/tui/ansi/_ansi_colors.py +0 -264
  595. package/tui/ansi/_control_codes.py +0 -37
  596. package/tui/ansi/_keys.py +0 -251
  597. package/tui/ansi/_sgr_styles.py +0 -64
  598. package/tui/ansi/_stream_parser.py +0 -418
  599. package/tui/answer.py +0 -12
  600. package/tui/app.py +0 -1195
  601. package/tui/atomic.py +0 -37
  602. package/tui/cli.py +0 -208
  603. package/tui/code_analyze.py +0 -27
  604. package/tui/complete.py +0 -38
  605. package/tui/constants.py +0 -61
  606. package/tui/conversation_markdown.py +0 -30
  607. package/tui/danger.py +0 -372
  608. package/tui/data/agents/ampcode.com.toml +0 -52
  609. package/tui/data/agents/augmentcode.com.toml +0 -41
  610. package/tui/data/agents/cdh.cloud-dev-harness.toml +0 -23
  611. package/tui/data/agents/claude.com.toml +0 -42
  612. package/tui/data/agents/copilot.github.com.toml +0 -29
  613. package/tui/data/agents/crowai.dev.toml +0 -36
  614. package/tui/data/agents/cursor.com.toml +0 -38
  615. package/tui/data/agents/deepagents.langchain.com +0 -34
  616. package/tui/data/agents/docker.com.toml +0 -60
  617. package/tui/data/agents/geminicli.com.toml +0 -28
  618. package/tui/data/agents/goose.ai.toml +0 -52
  619. package/tui/data/agents/inference.huggingface.co.toml +0 -41
  620. package/tui/data/agents/kimi.com.toml +0 -35
  621. package/tui/data/agents/kiro.dev.toml +0 -43
  622. package/tui/data/agents/onecode.dev.toml +0 -22
  623. package/tui/data/agents/openai.com.toml +0 -53
  624. package/tui/data/agents/openclaw.ai.toml +0 -37
  625. package/tui/data/agents/opencode.ai.toml +0 -39
  626. package/tui/data/agents/openhands.dev.toml +0 -46
  627. package/tui/data/agents/stakpak.dev.toml +0 -62
  628. package/tui/data/agents/vibe.mistral.ai.toml +0 -31
  629. package/tui/data/agents/vtcode.dev.toml +0 -63
  630. package/tui/data/images/frog.png +0 -0
  631. package/tui/data/sounds/question.wav +0 -0
  632. package/tui/data/sounds/turn-over.wav +0 -0
  633. package/tui/db.py +0 -213
  634. package/tui/dec.py +0 -332
  635. package/tui/diff_utils.py +0 -131
  636. package/tui/directory.py +0 -234
  637. package/tui/directory_suggester.py +0 -93
  638. package/tui/directory_watcher.py +0 -231
  639. package/tui/format_path.py +0 -25
  640. package/tui/fuzzy.py +0 -140
  641. package/tui/fuzzy_index.py +0 -275
  642. package/tui/gist.py +0 -33
  643. package/tui/history.py +0 -138
  644. package/tui/jsonrpc.py +0 -599
  645. package/tui/menus.py +0 -14
  646. package/tui/message_log.py +0 -69
  647. package/tui/messages.py +0 -144
  648. package/tui/option_content.py +0 -51
  649. package/tui/os.py +0 -0
  650. package/tui/path_complete.py +0 -217
  651. package/tui/path_filter.py +0 -124
  652. package/tui/paths.py +0 -87
  653. package/tui/pill.py +0 -23
  654. package/tui/platform_commands.py +0 -52
  655. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  656. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  657. package/tui/prompt/extract.py +0 -19
  658. package/tui/prompt/resource.py +0 -68
  659. package/tui/protocol.py +0 -28
  660. package/tui/screens/__init__.py +0 -0
  661. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  662. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  663. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  664. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  665. package/tui/screens/action_modal.py +0 -94
  666. package/tui/screens/agent_modal.py +0 -175
  667. package/tui/screens/command_edit_modal.py +0 -74
  668. package/tui/screens/diff_explorer_screen.py +0 -419
  669. package/tui/screens/diff_screen.py +0 -84
  670. package/tui/screens/ide_screen.py +0 -461
  671. package/tui/screens/main.py +0 -397
  672. package/tui/screens/main.tcss +0 -662
  673. package/tui/screens/permissions.py +0 -404
  674. package/tui/screens/permissions.tcss +0 -72
  675. package/tui/screens/projects.tcss +0 -84
  676. package/tui/screens/projects_app.py +0 -341
  677. package/tui/screens/projects_screen.py +0 -277
  678. package/tui/screens/session_resume_modal.py +0 -172
  679. package/tui/screens/session_resume_modal.tcss +0 -35
  680. package/tui/screens/sessions.py +0 -171
  681. package/tui/screens/sessions.tcss +0 -119
  682. package/tui/screens/settings.py +0 -293
  683. package/tui/screens/settings.tcss +0 -113
  684. package/tui/screens/store.py +0 -502
  685. package/tui/screens/store.tcss +0 -274
  686. package/tui/screens/tool_content_screen.py +0 -59
  687. package/tui/screens/trace.py +0 -317
  688. package/tui/session_tracker.py +0 -123
  689. package/tui/settings.py +0 -353
  690. package/tui/settings_schema.py +0 -467
  691. package/tui/shell.py +0 -304
  692. package/tui/shell_read.py +0 -42
  693. package/tui/slash_command.py +0 -34
  694. package/tui/tui.tcss +0 -246
  695. package/tui/twitter.py +0 -38
  696. package/tui/version.py +0 -80
  697. package/tui/visuals/__init__.py +0 -0
  698. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  699. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  700. package/tui/visuals/columns.py +0 -272
  701. package/tui/widgets/__init__.py +0 -0
  702. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  703. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  704. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  705. package/tui/widgets/__pycache__/aidlc.cpython-314.pyc +0 -0
  706. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  707. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  708. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  709. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  710. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  711. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  712. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  713. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  714. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  715. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  716. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  717. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  718. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  719. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  720. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  721. package/tui/widgets/__pycache__/pending_prompts.cpython-314.pyc +0 -0
  722. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  723. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  724. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  725. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  726. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  727. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  728. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  729. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  730. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  731. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  732. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  733. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  734. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  735. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  736. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  737. package/tui/widgets/acp_content.py +0 -70
  738. package/tui/widgets/agent_response.py +0 -76
  739. package/tui/widgets/agent_thought.py +0 -167
  740. package/tui/widgets/aidlc.py +0 -334
  741. package/tui/widgets/ask_user.py +0 -604
  742. package/tui/widgets/command_pane.py +0 -223
  743. package/tui/widgets/condensed_path.py +0 -115
  744. package/tui/widgets/context_stats.py +0 -66
  745. package/tui/widgets/conversation.py +0 -3235
  746. package/tui/widgets/danger_warning.py +0 -65
  747. package/tui/widgets/diff_view.py +0 -69
  748. package/tui/widgets/directory_input.py +0 -8
  749. package/tui/widgets/edit_field.py +0 -206
  750. package/tui/widgets/flash.py +0 -81
  751. package/tui/widgets/future_text.py +0 -126
  752. package/tui/widgets/grid_select.py +0 -234
  753. package/tui/widgets/highlighted_textarea.py +0 -183
  754. package/tui/widgets/load_more.py +0 -24
  755. package/tui/widgets/mandelbrot.py +0 -294
  756. package/tui/widgets/markdown_note.py +0 -13
  757. package/tui/widgets/menu.py +0 -147
  758. package/tui/widgets/model_status.py +0 -230
  759. package/tui/widgets/modified_files.py +0 -315
  760. package/tui/widgets/non_selectable_label.py +0 -5
  761. package/tui/widgets/note.py +0 -18
  762. package/tui/widgets/path_search.py +0 -492
  763. package/tui/widgets/pending_prompts.py +0 -36
  764. package/tui/widgets/plan.py +0 -285
  765. package/tui/widgets/project_directory_tree.py +0 -102
  766. package/tui/widgets/project_grid_select.py +0 -68
  767. package/tui/widgets/project_summary.py +0 -33
  768. package/tui/widgets/prompt.py +0 -935
  769. package/tui/widgets/question.py +0 -360
  770. package/tui/widgets/session_grid_select.py +0 -230
  771. package/tui/widgets/session_summary.py +0 -115
  772. package/tui/widgets/session_tabs.py +0 -194
  773. package/tui/widgets/shell_result.py +0 -35
  774. package/tui/widgets/shell_terminal.py +0 -40
  775. package/tui/widgets/side_bar.py +0 -124
  776. package/tui/widgets/slash_complete.py +0 -235
  777. package/tui/widgets/strike_text.py +0 -70
  778. package/tui/widgets/subagent.py +0 -287
  779. package/tui/widgets/subagent_screen.py +0 -715
  780. package/tui/widgets/terminal.py +0 -576
  781. package/tui/widgets/terminal_tool.py +0 -360
  782. package/tui/widgets/throbber.py +0 -100
  783. package/tui/widgets/tool_call.py +0 -432
  784. package/tui/widgets/user_input.py +0 -23
  785. package/tui/widgets/version.py +0 -5
  786. package/tui/widgets/welcome.py +0 -31
package/tui/acp/agent.py DELETED
@@ -1,1212 +0,0 @@
1
- import asyncio
2
- import logging
3
- import sys
4
- import time
5
-
6
- logger = logging.getLogger("tui.acp.agent")
7
-
8
- import json
9
- import os
10
- from pathlib import Path
11
- from typing import Any, cast, NamedTuple
12
- from copy import deepcopy
13
-
14
- import rich.repr
15
-
16
- from textual.content import Content
17
- from textual.message import Message
18
- from textual.message_pump import MessagePump
19
-
20
-
21
- from tui import jsonrpc
22
- import tui
23
- from tui.agent_schema import Agent as AgentData
24
- from tui.agent import AgentBase, AgentReady, AgentFail
25
- from tui.acp import protocol
26
- from tui.acp import api
27
- from tui.acp.api import API
28
- from tui.acp import messages
29
- from tui.acp.event_tap import AcpEventTap
30
- from cdh.trace import add_trace as _add_trace
31
- from tui.acp.prompt import build as build_prompt
32
- from tui import messages as tui_messages
33
- from tui.db import DB
34
- from tui import constants
35
- from tui.answer import Answer
36
-
37
- PROTOCOL_VERSION = 1
38
-
39
- # Tool names that add/modify file contents and therefore contribute to
40
- # "lines of code added" accounting.
41
- _LOC_TOOLS = ("Edit", "Write", "MultiEdit", "NotebookEdit", "NotebookWrite")
42
-
43
-
44
- def _extract_lines_added(update: dict) -> int | None:
45
- """Estimate lines of code added for a file-writing tool call.
46
-
47
- Returns the number of newlines (+1) found in the new content of an
48
- ``Edit``/``Write`` tool call, or ``None`` if the update is not a
49
- recognised file-writing tool or no content is available.
50
-
51
- The ACP ``_tool_args`` payload carries the new content under
52
- ``new_string`` (Edit) or ``content`` (Write). A fallback scans any
53
- attached content blocks for text.
54
- """
55
- tool = str(update.get("title") or update.get("kind") or "")
56
- base = tool.split(":", 1)[0].strip()
57
- if base not in _LOC_TOOLS:
58
- return None
59
- args = (
60
- update.get("_tool_args")
61
- or update.get("input")
62
- or update.get("arguments")
63
- or {}
64
- )
65
- if not isinstance(args, dict):
66
- args = {}
67
- text = args.get("new_string") or args.get("newText") or args.get("content")
68
- if not text:
69
- for blk in update.get("content") or []:
70
- if not isinstance(blk, dict):
71
- continue
72
- c = blk.get("content")
73
- if isinstance(c, dict):
74
- text = c.get("text", "")
75
- elif isinstance(c, str):
76
- text = c
77
- if text:
78
- break
79
- if not isinstance(text, str) or not text:
80
- return None
81
- return text.count("\n") + 1
82
-
83
-
84
- class Mode(NamedTuple):
85
- """An agent mode."""
86
-
87
- id: str
88
- name: str
89
- description: str | None
90
-
91
-
92
- @rich.repr.auto
93
- class Agent(AgentBase):
94
- """An agent that speaks the APC (https://agentclientprotocol.com/overview/introduction) protocol."""
95
-
96
- def __init__(
97
- self,
98
- project_root: Path,
99
- agent: AgentData,
100
- session_id: str | None,
101
- session_pk: int | None = None,
102
- default_model: str | None = None,
103
- ) -> None:
104
- """
105
-
106
- Args:
107
- project_root: Project root path.
108
- agent: Agent data.
109
- session_id: Session ID.
110
- session_pk: Session primary key.
111
- default_model: Default model to use when _current_model is not set.
112
- """
113
- super().__init__(project_root)
114
-
115
- self._agent_data = agent
116
- self._default_model = default_model
117
- self.session_id = session_id
118
-
119
- self.server = jsonrpc.Server()
120
- self.server.expose_instance(self)
121
-
122
- self._agent_task: asyncio.Task | None = None
123
- self._task: asyncio.Task | None = None
124
- self._process: asyncio.subprocess.Process | None = None
125
- self.done_event = asyncio.Event()
126
-
127
- self.agent_capabilities: protocol.AgentCapabilities = {
128
- "loadSession": False,
129
- "promptCapabilities": {
130
- "audio": False,
131
- "embeddedContent": True,
132
- "image": True,
133
- },
134
- }
135
- self.auth_methods: list[protocol.AuthMethod] = []
136
- self.session_pk: int | None = session_pk
137
- self._pending_session_data: dict | None = None
138
- self.tool_calls: dict[str, protocol.ToolCall] = {}
139
- self._message_target: MessagePump | None = None
140
-
141
- self._terminal_count: int = 0
142
- self.session_load_info: dict = {}
143
-
144
- self.event_tap = AcpEventTap()
145
- self._current_model: str | None = None
146
- self._tool_call_start: dict[str, float] = {}
147
-
148
- @property
149
- def _effective_model(self) -> str | None:
150
- """Return current model or fallback to default model."""
151
- return self._current_model or self._default_model
152
-
153
- @property
154
- def command(self) -> str | None:
155
- """The command used to launch the agent, or `None` if there isn't one."""
156
- acp_command = tui.get_os_matrix(self._agent_data["run_command"])
157
- if acp_command and acp_command.startswith("python3 "):
158
- acp_command = f"{sys.executable} {acp_command[7:]}"
159
- return acp_command
160
-
161
- @property
162
- def supports_load_session(self) -> bool:
163
- """Does the agent support loading sessions?"""
164
- return self.agent_capabilities.get("loadSession", False)
165
-
166
- def __rich_repr__(self) -> rich.repr.Result:
167
- yield self.project_root_path
168
- yield self.command
169
-
170
- def get_info(self) -> Content:
171
- agent_name = self._agent_data["name"]
172
- return Content(agent_name)
173
-
174
- async def start(self, message_target: MessagePump | None = None) -> None:
175
- """Start the agent."""
176
- self._message_target = message_target
177
- self._agent_task = asyncio.create_task(self._run_agent())
178
-
179
- def send(self, request: jsonrpc.Request) -> None:
180
- """Send a request to the agent.
181
-
182
- This is called automatically, if you go through `self.request`.
183
-
184
- Args:
185
- request: JSONRPC request object.
186
-
187
- """
188
- if self._process is None:
189
- logger.warning(
190
- "Cannot send request %s: agent process is not running",
191
- request.body,
192
- )
193
- return
194
-
195
- logger.info("[client] send: %s", request.body)
196
- if (stdin := self._process.stdin) is not None:
197
- stdin.write(b"%s\n" % request.body_json)
198
-
199
- def request(self) -> jsonrpc.Request:
200
- """Create a request object."""
201
- return API.request(self.send)
202
-
203
- def post_message(self, message: Message) -> bool:
204
- """Post a message to the message target (the Conversation).
205
-
206
- Args:
207
- message: Message object.
208
-
209
- Returns:
210
- `True` if the message was posted successfully, or `False` if it wasn't.
211
- """
212
- if (message_target := self._message_target) is None:
213
- return False
214
- return message_target.post_message(message)
215
-
216
- @jsonrpc.expose("session/update")
217
- def rpc_session_update(
218
- self,
219
- sessionId: str,
220
- update: protocol.SessionUpdate,
221
- _meta: dict[str, Any] | None = None,
222
- ):
223
- """Agent requests an update.
224
-
225
- https://agentclientprotocol.com/protocol/schema
226
- """
227
- status_line: str | None = None
228
- if _meta and (field_meta := _meta.get("field_meta")) is not None:
229
- if (
230
- open_hands_metrics := field_meta.get("openhands.dev/metrics")
231
- ) is not None:
232
- status_line = open_hands_metrics.get("status_line")
233
-
234
- match update:
235
- case {
236
- "sessionUpdate": "user_message_chunk",
237
- "content": {"type": type, "text": text},
238
- }:
239
- if text:
240
- self.post_message(messages.UserMessage(type, text))
241
-
242
- case {
243
- "sessionUpdate": "agent_message_chunk",
244
- "content": {"type": type, "text": text},
245
- }:
246
- self.post_message(messages.Update(type, text))
247
-
248
- case {
249
- "sessionUpdate": "agent_thought_chunk",
250
- "content": {"type": type, "text": text},
251
- }:
252
- self.post_message(messages.Thinking(type, text))
253
-
254
- case {
255
- "sessionUpdate": "tool_call",
256
- "toolCallId": tool_call_id,
257
- }:
258
- logger.debug(
259
- "session/update: tool_call id=%s title=%s kind=%s status=%s content_blocks=%d",
260
- tool_call_id,
261
- update.get('title','?'), update.get('kind','?'),
262
- update.get('status','?'), len(update.get('content',[]) or []),
263
- )
264
- self.tool_calls[tool_call_id] = deepcopy(update)
265
- self.post_message(messages.ToolCall(deepcopy(update)))
266
-
267
- case {"sessionUpdate": "plan", "entries": entries}:
268
- self.post_message(messages.Plan(entries))
269
-
270
- case {"sessionUpdate": "aidlc_state", **state}:
271
- self.post_message(messages.AIDLCState(
272
- current_phase=state.get("current_phase", ""),
273
- completed_phases=state.get("completed_phases", []),
274
- gate_results=state.get("gate_results", {}),
275
- ))
276
-
277
- case {
278
- "sessionUpdate": "tool_call_update",
279
- "toolCallId": tool_call_id,
280
- }:
281
- if tool_call_id in self.tool_calls:
282
- current_tool_call = self.tool_calls[tool_call_id]
283
- for key, value in update.items():
284
- if value is not None:
285
- current_tool_call[key] = value
286
-
287
- logger.debug(
288
- "session/update: tool_call_update id=%s status=%s content_blocks=%d",
289
- tool_call_id,
290
- update.get('status','?'),
291
- len(update.get('content',[]) or []),
292
- )
293
-
294
- self.post_message(
295
- messages.ToolCallUpdate(deepcopy(current_tool_call), update)
296
- )
297
- else:
298
- logger.debug(
299
- "session/update: tool_call_update ORPHAN id=%s "
300
- "(no prior tool_call, creating widget from update)",
301
- tool_call_id,
302
- )
303
- current_tool_call: protocol.ToolCall = {
304
- "sessionUpdate": "tool_call",
305
- "toolCallId": tool_call_id,
306
- "title": "Tool call",
307
- }
308
- for key, value in update.items():
309
- if value is not None:
310
- current_tool_call[key] = value
311
-
312
- self.tool_calls[tool_call_id] = current_tool_call
313
- self.post_message(messages.ToolCall(deepcopy(current_tool_call)))
314
-
315
- case {
316
- "sessionUpdate": "usage_update",
317
- }:
318
- self.post_message(messages.ContextUpdate(
319
- used=update.get("used", 0),
320
- size=update.get("size", 0),
321
- ))
322
-
323
- case {
324
- "sessionUpdate": "ask_user",
325
- "question": question,
326
- }:
327
- self.post_message(messages.AskUser(
328
- question=question,
329
- context=update.get("context", ""),
330
- options=update.get("options", []),
331
- questions=update.get("questions", []),
332
- tool_id=update.get("toolId", ""),
333
- checkpoint_id=update.get("checkpointId", ""),
334
- ))
335
-
336
- case {
337
- "sessionUpdate": "ask_user",
338
- "questions": questions,
339
- } if questions:
340
- self.post_message(messages.AskUser(
341
- questions=questions,
342
- context=update.get("context", ""),
343
- tool_id=update.get("toolId", ""),
344
- checkpoint_id=update.get("checkpointId", ""),
345
- ))
346
-
347
- case {
348
- "sessionUpdate": "available_commands_update",
349
- "availableCommands": available_commands,
350
- }:
351
- self.post_message(messages.AvailableCommandsUpdate(available_commands))
352
-
353
- case {
354
- "sessionUpdate": "awaiting_user_input",
355
- }:
356
- self.post_message(messages.AwaitingUserInput(
357
- prompt_preview=update.get("promptPreview", ""),
358
- ))
359
-
360
- case {
361
- "sessionUpdate": "subagent_start",
362
- "subagentId": subagent_id,
363
- "agentType": agent_type,
364
- **rest,
365
- }:
366
- self.post_message(messages.SubAgentStart(
367
- subagent_id, agent_type,
368
- prompt=rest.get("prompt", ""),
369
- ))
370
-
371
- case {
372
- "sessionUpdate": "subagent_chunk",
373
- "subagentId": subagent_id,
374
- "text": text,
375
- }:
376
- self.post_message(messages.SubAgentChunk(subagent_id, text))
377
-
378
- case {
379
- "sessionUpdate": "subagent_thinking",
380
- "subagentId": subagent_id,
381
- "text": text,
382
- }:
383
- self.post_message(messages.SubAgentThinking(subagent_id, text))
384
-
385
- case {
386
- "sessionUpdate": "subagent_end",
387
- "subagentId": subagent_id,
388
- "agentType": agent_type,
389
- **rest,
390
- }:
391
- self.post_message(messages.SubAgentEnd(
392
- subagent_id, agent_type,
393
- status=rest.get("status", "completed"),
394
- error=rest.get("error", ""),
395
- ))
396
-
397
- self.event_tap.on_session_update(update)
398
-
399
- update_type = update.get("sessionUpdate", "")
400
- agent_name = self._agent_data.get("name", "") if self._agent_data else ""
401
- tags = {"agent": agent_name, "update_type": update_type}
402
-
403
- trace_kw: dict[str, Any] = {
404
- "session_id": sessionId,
405
- "tags": tags,
406
- }
407
- if self._effective_model:
408
- trace_kw["model"] = self._effective_model
409
-
410
- tool_call_id = update.get("toolCallId")
411
- subagent_id = update.get("subagentId")
412
-
413
- if update_type == "tool_call" and tool_call_id:
414
- self._tool_call_start[tool_call_id] = time.time()
415
- trace_kw["tool_name"] = update.get("title", "")
416
- trace_kw["tool_kind"] = update.get("kind")
417
- trace_kw["parent_span_id"] = "session_root"
418
- loc = _extract_lines_added(update)
419
- if loc is not None:
420
- trace_kw["lines_added"] = loc
421
-
422
- elif update_type == "tool_call_update" and tool_call_id:
423
- status = update.get("status", "")
424
- trace_kw["tool_name"] = update.get("title")
425
- trace_kw["status"] = "error" if status in ("error", "failed") else "success"
426
- if tool_call_id in self._tool_call_start:
427
- trace_kw["duration"] = time.time() - self._tool_call_start[tool_call_id]
428
-
429
- elif update_type == "usage_update":
430
- trace_kw["token_count"] = update.get("used", 0)
431
- cost = update.get("cost")
432
- if cost:
433
- trace_kw["cost_amount"] = cost.get("amount")
434
- trace_kw["cost_currency"] = cost.get("currency")
435
-
436
- elif update_type == "subagent_start":
437
- trace_kw["agent_type"] = update.get("agentType")
438
- if subagent_id:
439
- trace_kw["subagent_id"] = subagent_id
440
- trace_kw["parent_span_id"] = "session_root"
441
-
442
- elif update_type in ("subagent_chunk", "subagent_thinking"):
443
- trace_kw["parent_span_id"] = f"subagent:{subagent_id}" if subagent_id else "session_root"
444
-
445
- elif update_type == "subagent_end":
446
- trace_kw["parent_span_id"] = f"subagent:{subagent_id}" if subagent_id else "session_root"
447
- trace_kw["status"] = update.get("status", "completed")
448
- trace_kw["error"] = update.get("error", "")
449
- trace_kw["agent_type"] = update.get("agentType")
450
-
451
- elif update_type in ("agent_message_chunk", "agent_thought_chunk", "user_message_chunk", "ask_user"):
452
- trace_kw["parent_span_id"] = "session_root"
453
-
454
- _add_trace("ACP", update_type, **trace_kw)
455
-
456
- if status_line is not None:
457
- self.post_message(messages.UpdateStatusLine(status_line))
458
-
459
- @jsonrpc.expose("session/event")
460
- def rpc_session_event(
461
- self,
462
- sessionId: str,
463
- event: dict,
464
- metrics: dict | None = None,
465
- _meta: dict[str, Any] | None = None,
466
- ):
467
- """Handle structured session/event notification (onecode enhancement).
468
-
469
- See docs/loop.md §9.2 for protocol spec.
470
- """
471
- self.event_tap.on_session_event(event)
472
- event_type = event.get("type", "")
473
- agent_name = self._agent_data.get("name", "") if self._agent_data else ""
474
- tags = {"agent": agent_name, "event_type": event_type}
475
- trace_kw: dict[str, Any] = {
476
- "session_id": sessionId,
477
- "tags": tags,
478
- }
479
- if self._effective_model:
480
- trace_kw["model"] = self._effective_model
481
- if "status" in event:
482
- trace_kw["status"] = event["status"]
483
- if "error" in event:
484
- trace_kw["error"] = event["error"]
485
- _add_trace("ACP_EVENT", event_type, **trace_kw)
486
-
487
- @jsonrpc.expose("session/request_permission")
488
- async def rpc_request_permission(
489
- self,
490
- sessionId: str,
491
- options: list[protocol.PermissionOption],
492
- toolCall: protocol.ToolCallUpdatePermissionRequest,
493
- _meta: dict | None = None,
494
- ) -> protocol.RequestPermissionResponse:
495
- """Agent requests permission to make a tool call.
496
-
497
- Args:
498
- sessionId: The session ID.
499
- options: A list of permission options (potential replies).
500
- toolCall: The tool or tools the agent is requesting permission to call.
501
- _meta: Optional meta information.
502
-
503
- Returns:
504
- The response to the permission request.
505
- """
506
- result_future: asyncio.Future[Answer] = asyncio.Future()
507
- tool_call_id = toolCall["toolCallId"]
508
-
509
- permission_tool_call = toolCall.copy()
510
- permission_tool_call.pop("sessionUpdate", None)
511
- tool_call = cast(protocol.ToolCall, permission_tool_call)
512
- if tool_call_id in self.tool_calls:
513
- self.tool_calls[tool_call_id] |= tool_call
514
- else:
515
- self.tool_calls[tool_call_id] = deepcopy(tool_call)
516
-
517
- # Forward content to the ToolCall widget so the user can see what
518
- # the agent is requesting permission for (e.g. the bash command).
519
- merged = deepcopy(self.tool_calls[tool_call_id])
520
- self.post_message(messages.ToolCallUpdate(merged, tool_call))
521
-
522
- message = messages.RequestPermission(options, merged, result_future)
523
- self.post_message(message)
524
- await result_future
525
- ask_result = result_future.result()
526
-
527
- request_permission_outcome: protocol.OutcomeSelected = {
528
- "optionId": ask_result.id,
529
- "outcome": "selected",
530
- }
531
- result: protocol.RequestPermissionResponse = {
532
- "outcome": request_permission_outcome
533
- }
534
- return result
535
-
536
- def send_ask_user_answer(self, answer: str, cancelled: bool, rollback: bool = False) -> None:
537
- """Send the user's answer back to the CDHA agent."""
538
- import uuid
539
-
540
- request = {
541
- "jsonrpc": "2.0",
542
- "method": "session/ask_user_answer",
543
- "params": {"answer": answer, "cancelled": cancelled, "rollback": rollback},
544
- "id": str(uuid.uuid4()),
545
- }
546
- if self._process is not None and self._process.stdin is not None:
547
- self._process.stdin.write(b"%s\n" % json.dumps(request).encode("utf-8"))
548
-
549
- @jsonrpc.expose("fs/read_text_file")
550
- def rpc_read_text_file(
551
- self,
552
- sessionId: str,
553
- path: str,
554
- line: int | None = None,
555
- limit: int | None = None,
556
- ) -> dict[str, str]:
557
- """Read a file in the project."""
558
- # TODO: what if the read is outside of the project path?
559
- # https://agentclientprotocol.com/protocol/file-system#reading-files
560
- read_path = self.project_root_path / path
561
- try:
562
- text = read_path.read_text(encoding="utf-8", errors="ignore")
563
- except IOError:
564
- text = ""
565
- if line is not None:
566
- line = max(0, line - 1)
567
- if limit is None:
568
- text = "\n".join(text.splitlines()[line:])
569
- else:
570
- text = "\n".join(text.splitlines()[line : line + limit])
571
- return {"content": text}
572
-
573
- @jsonrpc.expose("fs/write_text_file")
574
- def rpc_write_text_file(self, sessionId: str, path: str, content: str) -> None:
575
- # TODO: What if the agent wants to write outside of the project path?
576
- # https://agentclientprotocol.com/protocol/file-system#writing-files
577
-
578
- write_path = self.project_root_path / path
579
- write_path.write_text(content, encoding="utf-8", errors="ignore")
580
-
581
- # https://agentclientprotocol.com/protocol/schema#createterminalrequest
582
- @jsonrpc.expose("terminal/create")
583
- async def rpc_terminal_create(
584
- self,
585
- command: str,
586
- _meta: dict | None = None,
587
- args: list[str] | None = None,
588
- cwd: str | None = None,
589
- env: list[protocol.EnvVariable] | None = None,
590
- outputByteLimit: int | None = None,
591
- sessionId: str | None = None,
592
- ) -> protocol.CreateTerminalResponse:
593
- # Assign a terminal id
594
- self._terminal_count = self._terminal_count + 1
595
- terminal_id = f"terminal-{self._terminal_count}"
596
-
597
- terminal_env = (
598
- {variable["name"]: variable["value"] for variable in env} if env else {}
599
- )
600
- result_future: asyncio.Future[bool] = asyncio.Future()
601
- self.post_message(
602
- messages.CreateTerminal(
603
- terminal_id,
604
- command=command,
605
- args=args,
606
- cwd=cwd,
607
- env=terminal_env,
608
- output_byte_limit=outputByteLimit,
609
- result_future=result_future,
610
- )
611
- )
612
- await result_future
613
- if not result_future.result():
614
- raise jsonrpc.JSONRPCError("Failed to create a terminal.")
615
- return {"terminalId": terminal_id}
616
-
617
- # https://agentclientprotocol.com/protocol/schema#killterminalcommandrequest
618
- @jsonrpc.expose("terminal/kill")
619
- def rpc_terminal_kill(
620
- self, sessionID: str, terminalId: str, _meta: dict | None = None
621
- ) -> protocol.KillTerminalCommandResponse:
622
- self.post_message(messages.KillTerminal(terminalId))
623
- return {}
624
-
625
- # https://agentclientprotocol.com/protocol/schema#terminal%2Foutput
626
- @jsonrpc.expose("terminal/output")
627
- async def rpc_terminal_output(
628
- self, sessionId: str, terminalId: str, _meta: dict | None = None
629
- ) -> protocol.TerminalOutputResponse:
630
- from tui.widgets.terminal_tool import ToolState
631
-
632
- result_future: asyncio.Future[ToolState] = asyncio.Future()
633
-
634
- if not self.post_message(messages.GetTerminalState(terminalId, result_future)):
635
- raise RuntimeError("Unable to get terminal output")
636
-
637
- await result_future
638
- terminal_state = result_future.result()
639
-
640
- result: protocol.TerminalOutputResponse = {
641
- "output": terminal_state.output,
642
- "truncated": terminal_state.truncated,
643
- }
644
- if (return_code := terminal_state.return_code) is not None:
645
- result["exitStatus"] = {"exitCode": return_code}
646
- return result
647
-
648
- # https://agentclientprotocol.com/protocol/schema#terminal%2Frelease
649
- @jsonrpc.expose("terminal/release")
650
- def rpc_terminal_release(
651
- self, sessionId: str, terminalId: str, _meta: dict | None = None
652
- ) -> protocol.ReleaseTerminalResponse:
653
- self.post_message(messages.ReleaseTerminal(terminalId))
654
- return {}
655
-
656
- # https://agentclientprotocol.com/protocol/schema#terminal%2Fwait-for-exit
657
- @jsonrpc.expose("terminal/wait_for_exit")
658
- async def rpc_terminal_wait_for_exit(
659
- self, sessionId: str, terminalId: str, _meta: dict | None = None
660
- ) -> protocol.WaitForTerminalExitResponse:
661
- result_future: asyncio.Future[tuple[int, str | None]] = asyncio.Future()
662
- if not self.post_message(
663
- messages.WaitForTerminalExit(terminalId, result_future)
664
- ):
665
- raise RuntimeError("Unable to wait for terminal exit; no terminal found")
666
-
667
- await result_future
668
- return_code, signal = result_future.result()
669
- return {"exitCode": return_code, "signal": signal}
670
-
671
- async def _run_agent(self) -> None:
672
- """Task to communicate with the agent subprocess."""
673
-
674
- PIPE = asyncio.subprocess.PIPE
675
- env = os.environ.copy()
676
- env["TOAD_CWD"] = str(self.project_root_path)
677
- python_bin = str(Path(sys.executable).parent)
678
- env["PATH"] = f"{python_bin}:{env.get('PATH', '')}"
679
-
680
- if (command := self.command) is None:
681
- self.post_message(
682
- AgentFail("Failed to start agent; no run command for this OS")
683
- )
684
- return
685
- try:
686
- process = self._process = await asyncio.create_subprocess_shell(
687
- command,
688
- stdin=PIPE,
689
- stdout=PIPE,
690
- stderr=PIPE,
691
- env=env,
692
- cwd=str(self.project_root_path),
693
- limit=10 * 1024 * 1024,
694
- )
695
- except Exception as error:
696
- self.post_message(AgentFail("Failed to start agent", details=str(error)))
697
- return
698
-
699
- self._task = asyncio.create_task(self.run())
700
-
701
- assert process.stdout is not None
702
- assert process.stdin is not None
703
-
704
- tasks: set[asyncio.Task] = set()
705
-
706
- async def call_jsonrpc(request: jsonrpc.JSONObject | jsonrpc.JSONList) -> None:
707
- try:
708
- if (result := await self.server.call(request)) is not None:
709
- result_json = json.dumps(result).encode("utf-8")
710
- if process.stdin is not None:
711
- process.stdin.write(b"%s\n" % result_json)
712
- finally:
713
- if (task := asyncio.current_task()) is not None:
714
- tasks.discard(task)
715
-
716
- try:
717
- while line := await process.stdout.readline():
718
- # This line should contain JSON, which may be:
719
- # A) a JSONRPC request
720
- # B) a JSONRPC response to a previous request
721
- if not line.strip():
722
- continue
723
-
724
- try:
725
- line_str = line.decode("utf-8")
726
- except Exception as error:
727
- logger.error("Unable to decode utf-8 from agent: %s", error)
728
- continue
729
-
730
- logger.debug("[agent] %s", line_str.rstrip())
731
- try:
732
- agent_data: jsonrpc.JSONType = json.loads(line_str)
733
- except Exception as error:
734
- logger.error("Failed to decode JSON from agent: %s", error)
735
- continue
736
-
737
- if isinstance(agent_data, dict):
738
- if "result" in agent_data or "error" in agent_data:
739
- # Wait for pending notification dispatch tasks so all ACP
740
- # messages are queued before the response future resolves.
741
- if tasks:
742
- await asyncio.gather(*tasks, return_exceptions=True)
743
- tasks.clear()
744
- API.process_response(agent_data)
745
- continue
746
-
747
- elif isinstance(agent_data, list):
748
- if not all(isinstance(datum, dict) for datum in agent_data):
749
- logger.error("Agent sent invalid data: %r", agent_data)
750
- continue
751
-
752
- if not isinstance(agent_data, dict):
753
- logger.error("Invalid JSON from agent: %r", agent_data)
754
- continue
755
-
756
- # By this point we know it is a JSON RPC call
757
- assert isinstance(agent_data, dict)
758
- tasks.add(asyncio.create_task(call_jsonrpc(agent_data)))
759
- await asyncio.sleep(0)
760
- except Exception as e:
761
- logger.exception("Agent read loop failed: %s", e)
762
- finally:
763
- # Cancel all remaining tasks and wait for them to finish
764
- for task in tasks:
765
- task.cancel()
766
-
767
- # Wait for all tasks to complete cancellation
768
- if tasks:
769
- await asyncio.gather(*tasks, return_exceptions=True)
770
-
771
- if process.returncode:
772
- assert process.stderr is not None
773
- fail_details = (await process.stderr.read()).decode("utf-8", "replace")
774
- self.post_message(
775
- AgentFail(
776
- f"Agent returned a failure code: [b]{process.returncode}",
777
- details=fail_details,
778
- )
779
- )
780
-
781
- self._process = None
782
-
783
- async def stop(self) -> None:
784
- """Gracefully stop the process."""
785
- if self.session_pk is not None:
786
- db = DB()
787
- await db.session_update_last_used(self.session_pk)
788
-
789
- # Save session before terminating
790
- if self.session_id is not None:
791
- try:
792
- with self.request():
793
- response = api.session_save(self.session_id)
794
- await asyncio.wait_for(response.wait(), timeout=3)
795
- except Exception:
796
- pass
797
-
798
- if self._process is not None:
799
- try:
800
- self._process.terminate()
801
- try:
802
- await asyncio.wait_for(self._process.wait(), timeout=3.0)
803
- except asyncio.TimeoutError:
804
- try:
805
- self._process.kill()
806
- await asyncio.wait_for(self._process.wait(), timeout=2.0)
807
- except (OSError, asyncio.TimeoutError):
808
- pass
809
- except OSError:
810
- pass
811
-
812
- async def run(self) -> None:
813
- """The main logic of the Agent."""
814
- if constants.ACP_INITIALIZE:
815
- try:
816
- await self.acp_initialize()
817
-
818
- if self.session_id is None:
819
- await self.acp_new_session()
820
- else:
821
- if not self.agent_capabilities.get("loadSession", False):
822
- self.post_message(
823
- AgentFail(
824
- "Resume not supported",
825
- f"{self._agent_data['name']} does not currently support resuming sessions.",
826
- help="no_resume",
827
- )
828
- )
829
- return
830
- await self.acp_load_session()
831
- if self.session_pk is not None:
832
- db = DB()
833
- await db.session_update_last_used(self.session_pk)
834
- except jsonrpc.APIError as error:
835
- if isinstance(error.data, dict):
836
- reason = str(
837
- error.data.get("reason") or "Failed to initialize agent"
838
- )
839
- details = str(
840
- error.data.get("details") or error.data.get("error") or ""
841
- )
842
- else:
843
- reason = "Failed to initialize agent"
844
- details = str(error)
845
- self.post_message(AgentFail(reason, details))
846
- elif self.session_id is None:
847
- await self.acp_new_session()
848
- if self.session_pk is not None:
849
- db = DB()
850
- await db.session_update_last_used(self.session_pk)
851
-
852
- self.post_message(AgentReady())
853
-
854
- async def _ensure_db_session(self) -> None:
855
- if self.session_pk is not None:
856
- return
857
- if not self.supports_load_session:
858
- return
859
- data = getattr(self, "_pending_session_data", None)
860
- if data is None:
861
- return
862
-
863
- db = DB()
864
- self.session_pk = await db.session_new(
865
- data["session_name"],
866
- data["agent_name"],
867
- data["agent_identity"],
868
- data["session_id"],
869
- protocol=data["protocol"],
870
- meta=data["meta"],
871
- )
872
- self.post_message(tui_messages.SessionUpdate(session_pk=self.session_pk))
873
- self._pending_session_data = None
874
- await self._save_last_session_to_cdh()
875
-
876
- async def _save_last_session_to_cdh(self) -> None:
877
- if self.session_id is None:
878
- return
879
- try:
880
- from cdh.project_loader import CdhProjectLoader
881
-
882
- cdh_dir = CdhProjectLoader.find_cdh_dir(self.project_root_path)
883
- if cdh_dir is None:
884
- return
885
- data: dict = {
886
- "agent_session_id": self.session_id,
887
- "agent_identity": self._agent_data["identity"],
888
- }
889
- if self.session_pk is not None:
890
- data["session_pk"] = self.session_pk
891
- CdhProjectLoader.save_last_session(cdh_dir, data)
892
- except Exception:
893
- pass
894
-
895
- async def send_prompt(self, prompt: str) -> str | None:
896
- """Send a prompt to the agent.
897
-
898
- !!! note
899
- This method blocks as it may defer to a thread to read resources.
900
-
901
- Args:
902
- prompt: Prompt text.
903
- """
904
- await self._ensure_db_session()
905
- prompt_content_blocks = await asyncio.to_thread(
906
- build_prompt, self.project_root_path, prompt
907
- )
908
- return await self.acp_session_prompt(prompt_content_blocks)
909
-
910
- async def acp_initialize(self):
911
- """Initialize agent."""
912
- with self.request():
913
- initialize_response = api.initialize(
914
- PROTOCOL_VERSION,
915
- {
916
- "fs": {
917
- "readTextFile": True,
918
- "writeTextFile": True,
919
- },
920
- "terminal": True,
921
- },
922
- {
923
- "name": tui.NAME,
924
- "title": tui.TITLE,
925
- "version": tui.get_version(),
926
- },
927
- )
928
-
929
- response = await initialize_response.wait()
930
- assert response is not None
931
-
932
- # Store agents capabilities
933
- if agent_capabilities := response.get("agentCapabilities"):
934
- self.agent_capabilities = agent_capabilities
935
- if auth_methods := response.get("authMethods"):
936
- self.auth_methods = auth_methods
937
-
938
- async def acp_new_session(self) -> None:
939
- """Create a new session."""
940
- with self.request():
941
- session_new_response = api.session_new(
942
- str(self.project_root_path),
943
- [],
944
- )
945
- response = await session_new_response.wait()
946
- assert response is not None
947
- print(f"[DEBUG acp_new_session] response keys={list(response.keys())!r}, modes={response.get('modes')!r}", flush=True)
948
- self.session_id = response["sessionId"]
949
-
950
- if self.supports_load_session:
951
- self._pending_session_data = {
952
- "session_name": "New Session",
953
- "agent_name": self._agent_data["name"],
954
- "agent_identity": self._agent_data["identity"],
955
- "session_id": self.session_id,
956
- "protocol": "acp",
957
- "meta": {
958
- "cwd": str(self.project_root_path),
959
- "agent_data": self._agent_data,
960
- },
961
- }
962
-
963
- if (modes := response.get("modes", None)) is not None:
964
- current_mode = modes["currentModeId"]
965
- available_modes = modes["availableModes"]
966
- modes_update = {
967
- mode["id"]: Mode(
968
- mode["id"], mode["name"], mode.get("description", None)
969
- )
970
- for mode in available_modes
971
- }
972
- self.post_message(messages.SetModes(current_mode, modes_update))
973
-
974
- models_state = response.get("models")
975
- if models_state and (current_model_id := models_state.get("currentModelId")):
976
- self._current_model = current_model_id
977
- elif models_state and (available := models_state.get("availableModels")):
978
- self._current_model = available[0].get("modelId") if available else None
979
-
980
- async def acp_load_session(self) -> None:
981
- assert self.session_id is not None, "Session id must be set"
982
- cwd = str(self.project_root_path)
983
- session_title = None
984
- if self.session_pk is not None:
985
- db = DB()
986
- if (session := await db.session_get(self.session_pk)) is not None:
987
- session_title = session.get("title") or "Untitled"
988
- if session["meta_json"]:
989
- meta = json.loads(session["meta_json"])
990
- if session_cwd := meta.get("cwd", None):
991
- cwd = session_cwd
992
- if agent_data := meta.get("agent_data"):
993
- self._agent_data = agent_data
994
- else:
995
- db = DB()
996
- if (session := await db.session_get_by_agent_session_id(self.session_id)) is not None:
997
- self.session_pk = session["id"]
998
- session_title = session.get("title") or "Untitled"
999
-
1000
- with self.request():
1001
- session_load_response = api.session_load(cwd, [], self.session_id)
1002
- self.post_message(messages.SessionReplay(active=True))
1003
- try:
1004
- response = await session_load_response.wait()
1005
- self.session_load_info = {
1006
- "total_messages": response.get("_total_messages", 0),
1007
- "visible_start": response.get("_visible_start", 0),
1008
- }
1009
- finally:
1010
- self.post_message(messages.SessionReplay(
1011
- active=False,
1012
- total_messages=self.session_load_info.get("total_messages", 0),
1013
- visible_count=self.session_load_info.get("total_messages", 0) - self.session_load_info.get("visible_start", 0),
1014
- ))
1015
-
1016
- if error := response.get("error"):
1017
- logger.warning("Session load error: %s", error)
1018
-
1019
- if (modes := response.get("modes", None)) is not None:
1020
- current_mode = modes["currentModeId"]
1021
- available_modes = modes["availableModes"]
1022
- modes_update = {
1023
- mode["id"]: Mode(
1024
- mode["id"], mode["name"], mode.get("description", None)
1025
- )
1026
- for mode in available_modes
1027
- }
1028
- self.post_message(messages.SetModes(current_mode, modes_update))
1029
-
1030
- if self.session_pk is None:
1031
- self._pending_session_data = {
1032
- "session_name": session_title or "Untitled",
1033
- "agent_name": self._agent_data["name"],
1034
- "agent_identity": self._agent_data["identity"],
1035
- "session_id": self.session_id,
1036
- "protocol": "acp",
1037
- "meta": {
1038
- "cwd": str(self.project_root_path),
1039
- "agent_data": self._agent_data,
1040
- },
1041
- }
1042
- await self._ensure_db_session()
1043
-
1044
- if session_title:
1045
- self.post_message(tui_messages.SessionUpdate(name=session_title, session_pk=self.session_pk))
1046
-
1047
- await self._save_last_session_to_cdh()
1048
-
1049
- async def acp_load_earlier_messages(self, offset: int, limit: int) -> None:
1050
- """Load a range of earlier messages from the current session."""
1051
- assert self.session_id is not None
1052
- with self.request():
1053
- response = api.session_load_earlier(self.session_id, offset, limit)
1054
- try:
1055
- await response.wait()
1056
- except jsonrpc.JSONRPCError:
1057
- pass
1058
-
1059
- async def acp_session_prompt(
1060
- self, prompt: list[protocol.ContentBlock]
1061
- ) -> str | None:
1062
- """Send the prompt to the agent.
1063
-
1064
- Returns:
1065
- The stop reason.
1066
-
1067
- """
1068
- if self._process is None:
1069
- self.post_message(
1070
- AgentFail(
1071
- "Agent process is not running",
1072
- "The agent subprocess has terminated. Restart the session to continue.",
1073
- )
1074
- )
1075
- return None
1076
- with self.request():
1077
- session_prompt = api.session_prompt(prompt, self.session_id)
1078
- try:
1079
- result = await session_prompt.wait()
1080
- except jsonrpc.APIError as error:
1081
- details = ""
1082
- match error.data:
1083
- case {"details": details}:
1084
- pass
1085
-
1086
- self.post_message(
1087
- AgentFail(
1088
- "Failed to send prompt" or error.message,
1089
- (
1090
- str(details)
1091
- if details
1092
- else f"{self._agent_data['name']} returned an error"
1093
- ),
1094
- )
1095
- )
1096
- return None
1097
- except jsonrpc.JSONRPCError as error:
1098
- self.post_message(
1099
- AgentFail(
1100
- "Failed to send prompt" or error.message,
1101
- (error.message or f"{self._agent_data['name']} returned an error"),
1102
- )
1103
- )
1104
- return None
1105
-
1106
- assert result is not None
1107
- stop_reason = result.get("stopReason")
1108
-
1109
- if session_id := self.session_id:
1110
- usage = result.get("usage") or {}
1111
- usage_kw: dict[str, Any] = {
1112
- "session_id": session_id,
1113
- "status": stop_reason,
1114
- "tags": {
1115
- "agent": self._agent_data.get("name", "") if self._agent_data else "",
1116
- "update_type": "session_prompt",
1117
- },
1118
- }
1119
- if self._effective_model:
1120
- usage_kw["model"] = self._effective_model
1121
- if total := usage.get("total_tokens"):
1122
- usage_kw["token_count"] = total
1123
- if inp := usage.get("input_tokens"):
1124
- usage_kw["input_tokens"] = inp
1125
- if out := usage.get("output_tokens"):
1126
- usage_kw["output_tokens"] = out
1127
- if cached := usage.get("cached_read_tokens"):
1128
- usage_kw["cached_input_tokens"] = cached
1129
- _add_trace("ACP", "session_prompt", **usage_kw)
1130
-
1131
- return stop_reason
1132
-
1133
- async def acp_session_set_mode(self, mode_id: str) -> str | None:
1134
- """Update the current mode with the agent."""
1135
- with self.request():
1136
- response = api.session_set_mode(self.session_id, mode_id)
1137
- try:
1138
- await response.wait()
1139
- except jsonrpc.APIError as error:
1140
- match error.data:
1141
- case {"details": details}:
1142
- return details if isinstance(details, str) else "Failed to set mode"
1143
- return "Failed to set mode"
1144
- else:
1145
- return None
1146
-
1147
- async def set_mode(self, mode_id: str) -> str | None:
1148
- return await self.acp_session_set_mode(mode_id)
1149
-
1150
- async def acp_session_clear_todos(self) -> dict:
1151
- """Clear all todos via the session/clear_todos RPC."""
1152
- if self.session_id is None:
1153
- return {"cleared": False}
1154
- with self.request():
1155
- response = api.session_clear_todos(self.session_id)
1156
- result = await response.wait()
1157
- return result or {"cleared": False}
1158
-
1159
- async def compact(self) -> dict | None:
1160
- """Compact the context via the session/compact RPC."""
1161
- if self.session_id is None:
1162
- return None
1163
- with self.request():
1164
- response = api.session_compact(self.session_id)
1165
- result = await response.wait()
1166
- return result
1167
-
1168
- async def set_session_name(self, name: str) -> None:
1169
- if self.session_pk is None:
1170
- return
1171
- db = DB()
1172
- await db.session_update_title(self.session_pk, name)
1173
- if self.session_id:
1174
- from cdh.session_store import AgentSession
1175
- session = AgentSession(self.session_id)
1176
- if session.load():
1177
- session.name = name
1178
- session.save()
1179
- self.post_message(tui_messages.SessionUpdate(name=name, session_pk=self.session_pk))
1180
-
1181
- async def acp_session_cancel(self) -> bool:
1182
- """Send session/cancel notification to the agent subprocess.
1183
-
1184
- Writes directly to stdin with drain() to ensure the message is
1185
- actually flushed through the pipe, unlike the Request path which
1186
- is synchronous and cannot drain.
1187
- """
1188
- if not self.session_id:
1189
- logger.info("[client] session/cancel: no session_id, skipping")
1190
- return False
1191
- cancel_msg = {
1192
- "jsonrpc": "2.0",
1193
- "method": "session/cancel",
1194
- "params": {"sessionId": self.session_id, "_meta": {}},
1195
- }
1196
- data = json.dumps(cancel_msg).encode("utf-8") + b"\n"
1197
- logger.info("[client] session/cancel: sending %s", cancel_msg)
1198
- stdin = self._process.stdin if self._process else None
1199
- if stdin is None:
1200
- logger.info("[client] session/cancel: no stdin pipe, skipping")
1201
- return False
1202
- stdin.write(data)
1203
- try:
1204
- await stdin.drain()
1205
- except OSError:
1206
- logger.info("[client] session/cancel: drain failed", exc_info=True)
1207
- return False
1208
- logger.info("[client] session/cancel: sent successfully")
1209
- return True
1210
-
1211
- async def cancel(self) -> bool:
1212
- return await self.acp_session_cancel()