@scemoon/cdh 1.0.7 → 1.0.9-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 (787) hide show
  1. package/ai-dlc-skill/SKILL.md +106 -0
  2. package/ai-dlc-skill/architecture/project-structure.md +78 -0
  3. package/ai-dlc-skill/brownfield/README.md +36 -0
  4. package/ai-dlc-skill/brownfield/entry.md +45 -0
  5. package/ai-dlc-skill/brownfield/generate-context.sh +64 -0
  6. package/ai-dlc-skill/brownfield/scripts/deps.sh +27 -0
  7. package/ai-dlc-skill/brownfield/scripts/discover.sh +34 -0
  8. package/ai-dlc-skill/brownfield/scripts/extract-api.sh +45 -0
  9. package/ai-dlc-skill/components/backend.md +47 -0
  10. package/ai-dlc-skill/components/desktop.md +63 -0
  11. package/ai-dlc-skill/components/mya.md +219 -0
  12. package/ai-dlc-skill/components/native.md +73 -0
  13. package/ai-dlc-skill/components/tta.md +235 -0
  14. package/ai-dlc-skill/components/web.md +77 -0
  15. package/ai-dlc-skill/components/wxa.md +219 -0
  16. package/ai-dlc-skill/contracts/README.md +25 -0
  17. package/ai-dlc-skill/core/adaptive-flow.md +107 -0
  18. package/ai-dlc-skill/core/security.md +29 -0
  19. package/ai-dlc-skill/core/task-registry.md +153 -0
  20. package/ai-dlc-skill/cross-tool/README.md +20 -0
  21. package/ai-dlc-skill/cross-tool/cline/export.sh +38 -0
  22. package/ai-dlc-skill/cross-tool/copilot/export.sh +41 -0
  23. package/ai-dlc-skill/cross-tool/cursor/export.sh +53 -0
  24. package/ai-dlc-skill/cross-tool/onecode/export.sh +27 -0
  25. package/ai-dlc-skill/cross-tool/opencode/export.sh +38 -0
  26. package/ai-dlc-skill/phases/debug/entry.md +48 -0
  27. package/ai-dlc-skill/phases/debug/lifecycle.md +284 -0
  28. package/ai-dlc-skill/phases/deliver/entry.md +35 -0
  29. package/ai-dlc-skill/phases/deliver/lifecycle.md +185 -0
  30. package/ai-dlc-skill/phases/deliver/prompt.md +54 -0
  31. package/ai-dlc-skill/phases/deliver/rules.md +61 -0
  32. package/ai-dlc-skill/phases/plan/design_system/accessibility.md +268 -0
  33. package/ai-dlc-skill/phases/plan/design_system/atomic_design.md +341 -0
  34. package/ai-dlc-skill/phases/plan/design_system/component_spec.md +398 -0
  35. package/ai-dlc-skill/phases/plan/design_system/design_tokens.md +190 -0
  36. package/ai-dlc-skill/phases/plan/design_system/iconography.md +299 -0
  37. package/ai-dlc-skill/phases/plan/design_system/platform_ui/desktop.md +318 -0
  38. package/ai-dlc-skill/phases/plan/design_system/platform_ui/mya.md +354 -0
  39. package/ai-dlc-skill/phases/plan/design_system/platform_ui/native.md +328 -0
  40. package/ai-dlc-skill/phases/plan/design_system/platform_ui/tta.md +394 -0
  41. package/ai-dlc-skill/phases/plan/design_system/platform_ui/web.md +287 -0
  42. package/ai-dlc-skill/phases/plan/design_system/platform_ui/wxa.md +374 -0
  43. package/ai-dlc-skill/phases/plan/design_system/theme_system.md +318 -0
  44. package/ai-dlc-skill/phases/plan/entry.md +33 -0
  45. package/ai-dlc-skill/phases/plan/lifecycle.md +260 -0
  46. package/ai-dlc-skill/phases/plan/prompt.md +75 -0
  47. package/ai-dlc-skill/phases/plan/rules.md +60 -0
  48. package/ai-dlc-skill/phases/understand/entry.md +36 -0
  49. package/ai-dlc-skill/phases/understand/lifecycle.md +184 -0
  50. package/ai-dlc-skill/phases/understand/prompt.md +58 -0
  51. package/ai-dlc-skill/phases/understand/rules.md +49 -0
  52. package/ai-dlc-skill/phases/verify/config/base_url.md +65 -0
  53. package/ai-dlc-skill/phases/verify/entry.md +59 -0
  54. package/ai-dlc-skill/phases/verify/gates/browser_e2e.md +96 -0
  55. package/ai-dlc-skill/phases/verify/lifecycle.md +217 -0
  56. package/ai-dlc-skill/phases/verify/prompt.md +73 -0
  57. package/ai-dlc-skill/phases/verify/rules.md +91 -0
  58. package/ai-dlc-skill/phases/verify/runners/playwright_local.md +103 -0
  59. package/ai-dlc-skill/practices/bdd.md +119 -0
  60. package/ai-dlc-skill/practices/sdd.md +84 -0
  61. package/ai-dlc-skill/practices/tdd.md +128 -0
  62. package/ai-dlc-skill/providers/README.md +114 -0
  63. package/ai-dlc-skill/providers/aliyun/SKILL.md +204 -0
  64. package/ai-dlc-skill/providers/aliyun/api/rest-api.md +214 -0
  65. package/ai-dlc-skill/providers/aliyun/api/sdk.md +307 -0
  66. package/ai-dlc-skill/providers/aliyun/best-practices/database-design.md +363 -0
  67. package/ai-dlc-skill/providers/aliyun/best-practices/function-design.md +424 -0
  68. package/ai-dlc-skill/providers/aliyun/best-practices/troubleshooting.md +258 -0
  69. package/ai-dlc-skill/providers/aliyun/cli/database.md +263 -0
  70. package/ai-dlc-skill/providers/aliyun/cli/functions.md +263 -0
  71. package/ai-dlc-skill/providers/aliyun/cli/hosting.md +226 -0
  72. package/ai-dlc-skill/providers/aliyun/cli/setup.md +235 -0
  73. package/ai-dlc-skill/providers/aliyun/cli/storage.md +315 -0
  74. package/ai-dlc-skill/providers/aliyun/deployment.yaml +66 -0
  75. package/ai-dlc-skill/providers/aliyun/integration/ci-cd.md +288 -0
  76. package/ai-dlc-skill/providers/aliyun/preview.yaml +84 -0
  77. package/ai-dlc-skill/providers/aliyun/provider.yaml +160 -0
  78. package/ai-dlc-skill/providers/aliyun/security/authentication.md +254 -0
  79. package/ai-dlc-skill/providers/aliyun/services/cdn-hosting.md +220 -0
  80. package/ai-dlc-skill/providers/aliyun/services/database.md +319 -0
  81. package/ai-dlc-skill/providers/aliyun/services/function-compute.md +273 -0
  82. package/ai-dlc-skill/providers/aliyun/services/overview.md +163 -0
  83. package/ai-dlc-skill/providers/aliyun/services/serverless-app-engine.md +266 -0
  84. package/ai-dlc-skill/providers/aliyun/services/storage.md +269 -0
  85. package/ai-dlc-skill/providers/tcb/SKILL.md +208 -0
  86. package/ai-dlc-skill/providers/tcb/api/rest-api.md +338 -0
  87. package/ai-dlc-skill/providers/tcb/api/sdk.md +288 -0
  88. package/ai-dlc-skill/providers/tcb/best-practices/database-design.md +452 -0
  89. package/ai-dlc-skill/providers/tcb/best-practices/function-design.md +502 -0
  90. package/ai-dlc-skill/providers/tcb/best-practices/troubleshooting.md +462 -0
  91. package/ai-dlc-skill/providers/tcb/cli/cls.md +133 -0
  92. package/ai-dlc-skill/providers/tcb/cli/database.md +230 -0
  93. package/ai-dlc-skill/providers/tcb/cli/env.md +207 -0
  94. package/ai-dlc-skill/providers/tcb/cli/functions.md +276 -0
  95. package/ai-dlc-skill/providers/tcb/cli/hosting.md +219 -0
  96. package/ai-dlc-skill/providers/tcb/cli/setup.md +218 -0
  97. package/ai-dlc-skill/providers/tcb/cli/storage.md +233 -0
  98. package/ai-dlc-skill/providers/tcb/deployment.yaml +111 -0
  99. package/ai-dlc-skill/providers/tcb/integration/ci-cd.md +309 -0
  100. package/ai-dlc-skill/providers/tcb/integration/mcp-server.md +371 -0
  101. package/ai-dlc-skill/providers/tcb/preview.yaml +83 -0
  102. package/ai-dlc-skill/providers/tcb/provider.yaml +172 -0
  103. package/ai-dlc-skill/providers/tcb/security/authentication.md +241 -0
  104. package/ai-dlc-skill/providers/tcb/services/cloud-database.md +299 -0
  105. package/ai-dlc-skill/providers/tcb/services/cloud-functions.md +265 -0
  106. package/ai-dlc-skill/providers/tcb/services/cloud-hosting.md +264 -0
  107. package/ai-dlc-skill/providers/tcb/services/cloud-run.md +285 -0
  108. package/ai-dlc-skill/providers/tcb/services/cloud-storage.md +245 -0
  109. package/ai-dlc-skill/providers/tcb/services/overview.md +174 -0
  110. package/ai-dlc-skill/pybdd/README.md +41 -0
  111. package/ai-dlc-skill/pybdd/conftest.py +17 -0
  112. package/ai-dlc-skill/pybdd/example/auth/login.feature +32 -0
  113. package/ai-dlc-skill/pybdd/pytest.ini +5 -0
  114. package/ai-dlc-skill/pybdd/steps/.gitkeep +1 -0
  115. package/ai-dlc-skill/pybdd/steps/test_example_steps.py +65 -0
  116. package/ai-dlc-skill/requirements.md +140 -0
  117. package/ai-dlc-skill/skill.yaml +135 -0
  118. package/ai-dlc-skill/templates/brownfield/context.md +78 -0
  119. package/ai-dlc-skill/templates/integration/CHANGELOG.md +41 -0
  120. package/ai-dlc-skill/templates/integration/asyncapi.yaml +43 -0
  121. package/ai-dlc-skill/templates/integration/contract-diff.md +63 -0
  122. package/ai-dlc-skill/templates/integration/contract-spec.md +49 -0
  123. package/ai-dlc-skill/templates/integration/openapi.yaml +18 -0
  124. package/ai-dlc-skill/templates/integration/runtime-contract.yaml +36 -0
  125. package/ai-dlc-skill/templates/plan/design.md +49 -0
  126. package/ai-dlc-skill/templates/plan/task-list.md +32 -0
  127. package/ai-dlc-skill/templates/project/README.md +126 -0
  128. package/ai-dlc-skill/templates/project/template.md +119 -0
  129. package/ai-dlc-skill/templates/understand/feature.feature +30 -0
  130. package/ai-dlc-skill/templates/understand/intent.md +29 -0
  131. package/ai-dlc-skill/templates/understand/spec-delta.md +47 -0
  132. package/ai-dlc-skill/templates/verify/test-unit.py +27 -0
  133. package/ai-dlc-skill/walkthrough/collect.sh +50 -0
  134. package/ai-dlc-skill/walkthrough/template.md +54 -0
  135. package/cdh/__init__.py +0 -0
  136. package/cdh/__main__.py +4 -0
  137. package/cdh/__pycache__/__init__.cpython-314.pyc +0 -0
  138. package/cdh/__pycache__/cli.cpython-314.pyc +0 -0
  139. package/cdh/__pycache__/cli_logging.cpython-314.pyc +0 -0
  140. package/cdh/__pycache__/config.cpython-314.pyc +0 -0
  141. package/cdh/__pycache__/project_loader.cpython-314.pyc +0 -0
  142. package/cdh/__pycache__/scaffold.cpython-314.pyc +0 -0
  143. package/cdh/__pycache__/session_store.cpython-314.pyc +0 -0
  144. package/cdh/cdh_session_aggregator.py +258 -0
  145. package/cdh/cli.py +3000 -0
  146. package/cdh/cli_logging.py +45 -0
  147. package/cdh/config.py +28 -0
  148. package/cdh/event_loop/__init__.py +7 -0
  149. package/cdh/event_loop/bus.py +123 -0
  150. package/cdh/event_loop/events.py +25 -0
  151. package/cdh/event_loop/runner.py +28 -0
  152. package/cdh/event_loop/scheduler.py +158 -0
  153. package/cdh/generators/__init__.py +35 -0
  154. package/cdh/generators/_runtime.py +176 -0
  155. package/cdh/generators/ada/MANIFEST.toml +14 -0
  156. package/cdh/generators/ada/template.ads.tmpl +7 -0
  157. package/cdh/generators/bash/MANIFEST.toml +14 -0
  158. package/cdh/generators/bash/template.sh.tmpl +16 -0
  159. package/cdh/generators/builtin_index.json +590 -0
  160. package/cdh/generators/c/MANIFEST.toml +14 -0
  161. package/cdh/generators/c/template.h.tmpl +20 -0
  162. package/cdh/generators/cli.py +379 -0
  163. package/cdh/generators/clojure/MANIFEST.toml +14 -0
  164. package/cdh/generators/clojure/template.clj.tmpl +13 -0
  165. package/cdh/generators/cobol/MANIFEST.toml +14 -0
  166. package/cdh/generators/cobol/template.cbl.tmpl +14 -0
  167. package/cdh/generators/cpp/MANIFEST.toml +14 -0
  168. package/cdh/generators/cpp/template.hpp.tmpl +32 -0
  169. package/cdh/generators/crystal/MANIFEST.toml +14 -0
  170. package/cdh/generators/crystal/template.cr.tmpl +11 -0
  171. package/cdh/generators/csharp/MANIFEST.toml +23 -0
  172. package/cdh/generators/csharp/template.cs.tmpl +14 -0
  173. package/cdh/generators/cython/MANIFEST.toml +14 -0
  174. package/cdh/generators/cython/template.pyx.tmpl +17 -0
  175. package/cdh/generators/d/MANIFEST.toml +14 -0
  176. package/cdh/generators/d/template.d.tmpl +24 -0
  177. package/cdh/generators/dart/MANIFEST.toml +17 -0
  178. package/cdh/generators/dart/template.dart.tmpl +27 -0
  179. package/cdh/generators/elixir/MANIFEST.toml +17 -0
  180. package/cdh/generators/elixir/template.ex.tmpl +27 -0
  181. package/cdh/generators/elm/MANIFEST.toml +14 -0
  182. package/cdh/generators/elm/template.elm.tmpl +20 -0
  183. package/cdh/generators/erlang/MANIFEST.toml +14 -0
  184. package/cdh/generators/erlang/template.erl.tmpl +18 -0
  185. package/cdh/generators/fortran/MANIFEST.toml +14 -0
  186. package/cdh/generators/fortran/template.f90.tmpl +24 -0
  187. package/cdh/generators/fsharp/MANIFEST.toml +14 -0
  188. package/cdh/generators/fsharp/template.fs.tmpl +17 -0
  189. package/cdh/generators/go/MANIFEST.toml +18 -0
  190. package/cdh/generators/go/imports.go.tmpl +3 -0
  191. package/cdh/generators/go/template.go.tmpl +9 -0
  192. package/cdh/generators/graphql-schema/MANIFEST.toml +18 -0
  193. package/cdh/generators/graphql-schema/template.graphqls.tmpl +12 -0
  194. package/cdh/generators/groovy/MANIFEST.toml +14 -0
  195. package/cdh/generators/groovy/template.groovy.tmpl +28 -0
  196. package/cdh/generators/hack/MANIFEST.toml +14 -0
  197. package/cdh/generators/hack/template.hh.tmpl +24 -0
  198. package/cdh/generators/haskell/MANIFEST.toml +14 -0
  199. package/cdh/generators/haskell/template.hs.tmpl +20 -0
  200. package/cdh/generators/haxe/MANIFEST.toml +14 -0
  201. package/cdh/generators/haxe/template.hx.tmpl +20 -0
  202. package/cdh/generators/idris/MANIFEST.toml +14 -0
  203. package/cdh/generators/idris/template.idr.tmpl +22 -0
  204. package/cdh/generators/java/MANIFEST.toml +18 -0
  205. package/cdh/generators/java/template.java.tmpl +13 -0
  206. package/cdh/generators/julia/MANIFEST.toml +14 -0
  207. package/cdh/generators/julia/template.jl.tmpl +27 -0
  208. package/cdh/generators/kotlin/MANIFEST.toml +18 -0
  209. package/cdh/generators/kotlin/template.kt.tmpl +12 -0
  210. package/cdh/generators/lua/MANIFEST.toml +14 -0
  211. package/cdh/generators/lua/template.lua.tmpl +27 -0
  212. package/cdh/generators/matlab/MANIFEST.toml +14 -0
  213. package/cdh/generators/matlab/template.m.tmpl +26 -0
  214. package/cdh/generators/nim/MANIFEST.toml +14 -0
  215. package/cdh/generators/nim/template.nim.tmpl +12 -0
  216. package/cdh/generators/nix/MANIFEST.toml +14 -0
  217. package/cdh/generators/nix/template.nix.tmpl +8 -0
  218. package/cdh/generators/objective-c/MANIFEST.toml +14 -0
  219. package/cdh/generators/objective-c/template.m.tmpl +31 -0
  220. package/cdh/generators/ocaml/MANIFEST.toml +14 -0
  221. package/cdh/generators/ocaml/template.ml.tmpl +13 -0
  222. package/cdh/generators/pascal/MANIFEST.toml +14 -0
  223. package/cdh/generators/pascal/template.pas.tmpl +5 -0
  224. package/cdh/generators/perl/MANIFEST.toml +14 -0
  225. package/cdh/generators/perl/template.pm.tmpl +27 -0
  226. package/cdh/generators/php/MANIFEST.toml +17 -0
  227. package/cdh/generators/php/template.php.tmpl +31 -0
  228. package/cdh/generators/powershell/MANIFEST.toml +14 -0
  229. package/cdh/generators/powershell/template.ps1.tmpl +20 -0
  230. package/cdh/generators/protobuf/MANIFEST.toml +18 -0
  231. package/cdh/generators/protobuf/template.proto.tmpl +13 -0
  232. package/cdh/generators/python/MANIFEST.toml +18 -0
  233. package/cdh/generators/python/template.py.tmpl +12 -0
  234. package/cdh/generators/r/MANIFEST.toml +14 -0
  235. package/cdh/generators/r/template.R.tmpl +29 -0
  236. package/cdh/generators/racket/MANIFEST.toml +14 -0
  237. package/cdh/generators/racket/template.rkt.tmpl +15 -0
  238. package/cdh/generators/registry.py +211 -0
  239. package/cdh/generators/ruby/MANIFEST.toml +17 -0
  240. package/cdh/generators/ruby/template.rb.tmpl +27 -0
  241. package/cdh/generators/rust/MANIFEST.toml +18 -0
  242. package/cdh/generators/rust/template.rs.tmpl +16 -0
  243. package/cdh/generators/scala/MANIFEST.toml +20 -0
  244. package/cdh/generators/scala/template.scala.tmpl +13 -0
  245. package/cdh/generators/scheme/MANIFEST.toml +14 -0
  246. package/cdh/generators/scheme/template.scm.tmpl +16 -0
  247. package/cdh/generators/solidity/MANIFEST.toml +14 -0
  248. package/cdh/generators/solidity/template.sol.tmpl +24 -0
  249. package/cdh/generators/swift/MANIFEST.toml +18 -0
  250. package/cdh/generators/swift/template.swift.tmpl +10 -0
  251. package/cdh/generators/typescript/MANIFEST.toml +18 -0
  252. package/cdh/generators/typescript/template.ts.tmpl +7 -0
  253. package/cdh/generators/version.py +214 -0
  254. package/cdh/generators/zig/MANIFEST.toml +14 -0
  255. package/cdh/generators/zig/template.zig.tmpl +20 -0
  256. package/cdh/logging.py +314 -0
  257. package/cdh/optimizer/__init__.py +7 -0
  258. package/cdh/optimizer/loop.py +201 -0
  259. package/cdh/optimizer/mutation.py +85 -0
  260. package/cdh/optimizer/reward.py +51 -0
  261. package/cdh/optimizer/tracker.py +118 -0
  262. package/cdh/project_loader.py +1022 -0
  263. package/cdh/rules/patterns.yaml +132 -0
  264. package/cdh/rules/spectral.yaml +301 -0
  265. package/cdh/scaffold.py +1436 -0
  266. package/cdh/session_store.py +221 -0
  267. package/cdh/state_schema.py +127 -0
  268. package/cdh/tools/__init__.py +57 -0
  269. package/cdh/tools/cls_search.py +406 -0
  270. package/cdh/tools/contract_diff.py +644 -0
  271. package/cdh/tools/deploy_stack.py +590 -0
  272. package/cdh/tools/generate_shared.py +300 -0
  273. package/cdh/tools/iac_gen.py +224 -0
  274. package/cdh/tools/otel_export.py +125 -0
  275. package/cdh/tools/pattern_detect.py +451 -0
  276. package/cdh/tools/retrofit_labels.py +505 -0
  277. package/cdh/trace/__init__.py +101 -0
  278. package/cdh/trace/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/cdh/trace/dashboard/__init__.py +61 -0
  280. package/cdh/trace/dashboard/api.py +1032 -0
  281. package/cdh/trace/dashboard/app.html +1321 -0
  282. package/cdh/trace/dashboard/server.py +310 -0
  283. package/cdh/trace/otel_exporter.py +462 -0
  284. package/cdh/trace/otel_tracer.py +281 -0
  285. package/cdh/tui.py +1084 -0
  286. package/cdh/validators/__init__.py +16 -0
  287. package/cdh/validators/__pycache__/__init__.cpython-314.pyc +0 -0
  288. package/cdh/validators/__pycache__/bdd.cpython-314.pyc +0 -0
  289. package/cdh/validators/__pycache__/dag.cpython-314.pyc +0 -0
  290. package/cdh/validators/__pycache__/ears.cpython-314.pyc +0 -0
  291. package/cdh/validators/__pycache__/fr_namespace.cpython-314.pyc +0 -0
  292. package/cdh/validators/bdd.py +144 -0
  293. package/cdh/validators/dag.py +179 -0
  294. package/cdh/validators/ears.py +452 -0
  295. package/cdh/validators/fr_namespace.py +143 -0
  296. package/cdh/validators/spectral.py +475 -0
  297. package/cdh/verification/__init__.py +3 -0
  298. package/cdh/verification/aggregation.py +53 -0
  299. package/cdh/verification/gates/__init__.py +5 -0
  300. package/cdh/verification/gates/base.py +18 -0
  301. package/cdh/verification/gates/lint_gate.py +37 -0
  302. package/cdh/verification/gates/test_gate.py +41 -0
  303. package/cdh/verification/loop.py +93 -0
  304. package/cdh/verification/policy.py +24 -0
  305. package/onecode/__init__.py +1 -0
  306. package/onecode/__main__.py +4 -0
  307. package/onecode/__pycache__/__init__.cpython-314.pyc +0 -0
  308. package/onecode/__pycache__/cli.cpython-314.pyc +0 -0
  309. package/onecode/__pycache__/commands.cpython-314.pyc +0 -0
  310. package/onecode/__pycache__/config.cpython-314.pyc +0 -0
  311. package/onecode/__pycache__/migrate.cpython-314.pyc +0 -0
  312. package/onecode/agent/__init__.py +0 -0
  313. package/onecode/agent/__pycache__/__init__.cpython-314.pyc +0 -0
  314. package/onecode/agent/__pycache__/cdh_loader.cpython-314.pyc +0 -0
  315. package/onecode/agent/__pycache__/checkpoint.cpython-314.pyc +0 -0
  316. package/onecode/agent/__pycache__/context.cpython-314.pyc +0 -0
  317. package/onecode/agent/__pycache__/engine.cpython-314.pyc +0 -0
  318. package/onecode/agent/__pycache__/hooks.cpython-314.pyc +0 -0
  319. package/onecode/agent/__pycache__/onecode_agent_acp.cpython-314.pyc +0 -0
  320. package/onecode/agent/__pycache__/permissions.cpython-314.pyc +0 -0
  321. package/onecode/agent/__pycache__/permissions_store.cpython-314.pyc +0 -0
  322. package/onecode/agent/__pycache__/project_doc.cpython-314.pyc +0 -0
  323. package/onecode/agent/__pycache__/session.cpython-314.pyc +0 -0
  324. package/onecode/agent/__pycache__/turn_record.cpython-314.pyc +0 -0
  325. package/onecode/agent/agents/__init__.py +29 -0
  326. package/onecode/agent/agents/__pycache__/__init__.cpython-314.pyc +0 -0
  327. package/onecode/agent/agents/__pycache__/types.cpython-314.pyc +0 -0
  328. package/onecode/agent/agents/prompts/build-agent.md +50 -0
  329. package/onecode/agent/agents/prompts/compaction-instructions.md +12 -0
  330. package/onecode/agent/agents/prompts/explore-agent.md +42 -0
  331. package/onecode/agent/agents/prompts/plan-agent.md +44 -0
  332. package/onecode/agent/agents/prompts/plan-gate-hard.md +4 -0
  333. package/onecode/agent/agents/prompts/plan-gate-soft.md +3 -0
  334. package/onecode/agent/agents/prompts/solo-agent.md +57 -0
  335. package/onecode/agent/agents/prompts/subagent-constraints.md +10 -0
  336. package/onecode/agent/agents/prompts/summary-instructions.md +7 -0
  337. package/onecode/agent/agents/prompts/title-instructions.md +3 -0
  338. package/onecode/agent/agents/prompts/tool-descriptions.md +129 -0
  339. package/onecode/agent/agents/types.py +786 -0
  340. package/onecode/agent/attachments.py +112 -0
  341. package/onecode/agent/cdh_loader.py +3 -0
  342. package/onecode/agent/checkpoint.py +285 -0
  343. package/onecode/agent/context.py +465 -0
  344. package/onecode/agent/engine.py +3547 -0
  345. package/onecode/agent/event_bridge.py +75 -0
  346. package/onecode/agent/hooks.py +86 -0
  347. package/onecode/agent/onecode_agent_acp.py +2993 -0
  348. package/onecode/agent/permissions.py +150 -0
  349. package/onecode/agent/permissions_store.py +73 -0
  350. package/onecode/agent/project_doc.py +19 -0
  351. package/onecode/agent/question_detect.py +230 -0
  352. package/onecode/agent/session.py +3 -0
  353. package/onecode/agent/snapshot.py +144 -0
  354. package/onecode/agent/tools/__init__.py +17 -0
  355. package/onecode/agent/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  356. package/onecode/agent/tools/__pycache__/agent_tools.cpython-314.pyc +0 -0
  357. package/onecode/agent/tools/__pycache__/apply_patch_tool.cpython-314.pyc +0 -0
  358. package/onecode/agent/tools/__pycache__/bash_tool.cpython-314.pyc +0 -0
  359. package/onecode/agent/tools/__pycache__/communication_tools.cpython-314.pyc +0 -0
  360. package/onecode/agent/tools/__pycache__/config_tool.cpython-314.pyc +0 -0
  361. package/onecode/agent/tools/__pycache__/cron_tools.cpython-314.pyc +0 -0
  362. package/onecode/agent/tools/__pycache__/errors.cpython-314.pyc +0 -0
  363. package/onecode/agent/tools/__pycache__/file_ops.cpython-314.pyc +0 -0
  364. package/onecode/agent/tools/__pycache__/file_tools.cpython-314.pyc +0 -0
  365. package/onecode/agent/tools/__pycache__/git_tools.cpython-314.pyc +0 -0
  366. package/onecode/agent/tools/__pycache__/lsp_tools.cpython-314.pyc +0 -0
  367. package/onecode/agent/tools/__pycache__/mcp_tools.cpython-314.pyc +0 -0
  368. package/onecode/agent/tools/__pycache__/permission_handler.cpython-314.pyc +0 -0
  369. package/onecode/agent/tools/__pycache__/permissions.cpython-314.pyc +0 -0
  370. package/onecode/agent/tools/__pycache__/protocol.cpython-314.pyc +0 -0
  371. package/onecode/agent/tools/__pycache__/registry.cpython-314.pyc +0 -0
  372. package/onecode/agent/tools/__pycache__/sandbox.cpython-314.pyc +0 -0
  373. package/onecode/agent/tools/__pycache__/schema_validation.cpython-314.pyc +0 -0
  374. package/onecode/agent/tools/__pycache__/skill_tools.cpython-314.pyc +0 -0
  375. package/onecode/agent/tools/__pycache__/todo_tools.cpython-314.pyc +0 -0
  376. package/onecode/agent/tools/__pycache__/web_tools.cpython-314.pyc +0 -0
  377. package/onecode/agent/tools/agent_tools.py +128 -0
  378. package/onecode/agent/tools/apply_patch_tool.py +138 -0
  379. package/onecode/agent/tools/bash_tool.py +121 -0
  380. package/onecode/agent/tools/communication_tools.py +154 -0
  381. package/onecode/agent/tools/config_tool.py +130 -0
  382. package/onecode/agent/tools/cron_tools.py +178 -0
  383. package/onecode/agent/tools/errors.py +17 -0
  384. package/onecode/agent/tools/file_ops.py +221 -0
  385. package/onecode/agent/tools/file_tools.py +225 -0
  386. package/onecode/agent/tools/git_tools.py +88 -0
  387. package/onecode/agent/tools/lsp_tools.py +404 -0
  388. package/onecode/agent/tools/mcp_tools.py +211 -0
  389. package/onecode/agent/tools/permission_handler.py +46 -0
  390. package/onecode/agent/tools/permissions.py +77 -0
  391. package/onecode/agent/tools/protocol.py +20 -0
  392. package/onecode/agent/tools/registry.py +210 -0
  393. package/onecode/agent/tools/sandbox.py +460 -0
  394. package/onecode/agent/tools/schema_validation.py +100 -0
  395. package/onecode/agent/tools/skill_tools.py +52 -0
  396. package/onecode/agent/tools/todo_tools.py +208 -0
  397. package/onecode/agent/tools/web_tools.py +530 -0
  398. package/onecode/agent/turn_record.py +28 -0
  399. package/onecode/builtin_skills/agent-browser/SKILL.md +212 -0
  400. package/onecode/builtin_skills/agent-browser/skill.yaml +8 -0
  401. package/onecode/builtin_skills/cloudbase/SKILL.md +162 -0
  402. package/onecode/builtin_skills/cloudbase/skill.yaml +7 -0
  403. package/onecode/builtin_skills/git/SKILL.md +64 -0
  404. package/onecode/builtin_skills/git/skill.yaml +7 -0
  405. package/onecode/builtin_skills/shell/SKILL.md +58 -0
  406. package/onecode/builtin_skills/shell/skill.yaml +8 -0
  407. package/onecode/builtin_skills/skill-creator/SKILL.md +106 -0
  408. package/onecode/builtin_skills/skill-creator/skill.yaml +8 -0
  409. package/onecode/cli.py +1325 -0
  410. package/onecode/codebase/__init__.py +69 -0
  411. package/onecode/codebase/__pycache__/__init__.cpython-314.pyc +0 -0
  412. package/onecode/codebase/__pycache__/chunker.cpython-314.pyc +0 -0
  413. package/onecode/codebase/__pycache__/indexer.cpython-314.pyc +0 -0
  414. package/onecode/codebase/__pycache__/retriever.cpython-314.pyc +0 -0
  415. package/onecode/codebase/__pycache__/storage.cpython-314.pyc +0 -0
  416. package/onecode/codebase/__pycache__/tools.cpython-314.pyc +0 -0
  417. package/onecode/codebase/chunker.py +125 -0
  418. package/onecode/codebase/indexer.py +154 -0
  419. package/onecode/codebase/retriever.py +240 -0
  420. package/onecode/codebase/storage.py +153 -0
  421. package/onecode/codebase/tools.py +59 -0
  422. package/onecode/commands.py +673 -0
  423. package/onecode/config.py +539 -0
  424. package/onecode/config_screen.py +486 -0
  425. package/onecode/cron/__init__.py +3 -0
  426. package/onecode/lsp/__init__.py +3 -0
  427. package/onecode/mcp/__init__.py +11 -0
  428. package/onecode/mcp/__pycache__/__init__.cpython-314.pyc +0 -0
  429. package/onecode/mcp/__pycache__/client.cpython-314.pyc +0 -0
  430. package/onecode/mcp/__pycache__/cloudbase.cpython-314.pyc +0 -0
  431. package/onecode/mcp/__pycache__/config.cpython-314.pyc +0 -0
  432. package/onecode/mcp/__pycache__/manager.cpython-314.pyc +0 -0
  433. package/onecode/mcp/__pycache__/oauth.cpython-314.pyc +0 -0
  434. package/onecode/mcp/client.py +305 -0
  435. package/onecode/mcp/cloudbase.py +188 -0
  436. package/onecode/mcp/config.py +363 -0
  437. package/onecode/mcp/manager.py +603 -0
  438. package/onecode/mcp/oauth.py +199 -0
  439. package/onecode/memory/__init__.py +106 -0
  440. package/onecode/memory/__pycache__/__init__.cpython-314.pyc +0 -0
  441. package/onecode/memory/__pycache__/backend.cpython-314.pyc +0 -0
  442. package/onecode/memory/__pycache__/pyramid.cpython-314.pyc +0 -0
  443. package/onecode/memory/__pycache__/recall.cpython-314.pyc +0 -0
  444. package/onecode/memory/backend.py +179 -0
  445. package/onecode/memory/pyramid.py +145 -0
  446. package/onecode/memory/recall.py +322 -0
  447. package/onecode/migrate.py +122 -0
  448. package/onecode/models/__init__.py +4 -0
  449. package/onecode/models/__pycache__/__init__.cpython-314.pyc +0 -0
  450. package/onecode/models/__pycache__/errors.cpython-314.pyc +0 -0
  451. package/onecode/models/__pycache__/messages.cpython-314.pyc +0 -0
  452. package/onecode/models/__pycache__/ollama_manager.cpython-314.pyc +0 -0
  453. package/onecode/models/__pycache__/provider.cpython-314.pyc +0 -0
  454. package/onecode/models/__pycache__/registry.cpython-314.pyc +0 -0
  455. package/onecode/models/errors.py +104 -0
  456. package/onecode/models/messages.py +750 -0
  457. package/onecode/models/ollama_manager.py +167 -0
  458. package/onecode/models/provider.py +730 -0
  459. package/onecode/models/providers/__init__.py +17 -0
  460. package/onecode/models/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  461. package/onecode/models/providers/__pycache__/anthropic_provider.cpython-314.pyc +0 -0
  462. package/onecode/models/providers/__pycache__/deepseek_provider.cpython-314.pyc +0 -0
  463. package/onecode/models/providers/__pycache__/glm_provider.cpython-314.pyc +0 -0
  464. package/onecode/models/providers/__pycache__/minimax_provider.cpython-314.pyc +0 -0
  465. package/onecode/models/providers/__pycache__/minimaxi_provider.cpython-314.pyc +0 -0
  466. package/onecode/models/providers/__pycache__/ollama_provider.cpython-314.pyc +0 -0
  467. package/onecode/models/providers/__pycache__/openai_provider.cpython-314.pyc +0 -0
  468. package/onecode/models/providers/anthropic_provider.py +286 -0
  469. package/onecode/models/providers/deepseek_provider.py +221 -0
  470. package/onecode/models/providers/glm_provider.py +219 -0
  471. package/onecode/models/providers/minimax_provider.py +182 -0
  472. package/onecode/models/providers/minimaxi_provider.py +426 -0
  473. package/onecode/models/providers/ollama_provider.py +183 -0
  474. package/onecode/models/providers/openai_provider.py +234 -0
  475. package/onecode/models/registry.py +349 -0
  476. package/onecode/server/__init__.py +3 -0
  477. package/onecode/server/app.py +251 -0
  478. package/onecode/skills/__init__.py +11 -0
  479. package/onecode/skills/__pycache__/__init__.cpython-314.pyc +0 -0
  480. package/onecode/skills/__pycache__/argument_substitution.cpython-314.pyc +0 -0
  481. package/onecode/skills/__pycache__/bootstrap.cpython-314.pyc +0 -0
  482. package/onecode/skills/__pycache__/create.cpython-314.pyc +0 -0
  483. package/onecode/skills/__pycache__/frontmatter.cpython-314.pyc +0 -0
  484. package/onecode/skills/__pycache__/loader.cpython-314.pyc +0 -0
  485. package/onecode/skills/__pycache__/model.cpython-314.pyc +0 -0
  486. package/onecode/skills/argument_substitution.py +38 -0
  487. package/onecode/skills/bootstrap.py +37 -0
  488. package/onecode/skills/create.py +56 -0
  489. package/onecode/skills/frontmatter.py +33 -0
  490. package/onecode/skills/loader.py +215 -0
  491. package/onecode/skills/manager.py +75 -0
  492. package/onecode/skills/model.py +43 -0
  493. package/onecode/storage/__init__.py +0 -0
  494. package/onecode/storage/activity.py +63 -0
  495. package/onecode/storage/project.py +54 -0
  496. package/onecode/storage/session.py +112 -0
  497. package/onecode/tasks/__init__.py +26 -0
  498. package/onecode/tasks/manager.py +232 -0
  499. package/onecode/tasks/models.py +240 -0
  500. package/onecode/trace/__init__.py +0 -0
  501. package/onecode/trace/tracer.py +173 -0
  502. package/onecode/utils/__init__.py +0 -0
  503. package/onecode/utils/helpers.py +20 -0
  504. package/onecode/verification/__init__.py +5 -0
  505. package/onecode/verification/__pycache__/__init__.cpython-314.pyc +0 -0
  506. package/onecode/verification/__pycache__/aggregation.cpython-314.pyc +0 -0
  507. package/onecode/verification/__pycache__/loop.cpython-314.pyc +0 -0
  508. package/onecode/verification/__pycache__/policy.cpython-314.pyc +0 -0
  509. package/onecode/verification/aggregation.py +53 -0
  510. package/onecode/verification/gates/__init__.py +6 -0
  511. package/onecode/verification/gates/__pycache__/__init__.cpython-314.pyc +0 -0
  512. package/onecode/verification/gates/__pycache__/base.cpython-314.pyc +0 -0
  513. package/onecode/verification/gates/__pycache__/lint_gate.cpython-314.pyc +0 -0
  514. package/onecode/verification/gates/__pycache__/test_gate.cpython-314.pyc +0 -0
  515. package/onecode/verification/gates/__pycache__/type_gate.cpython-314.pyc +0 -0
  516. package/onecode/verification/gates/base.py +20 -0
  517. package/onecode/verification/gates/lint_gate.py +45 -0
  518. package/onecode/verification/gates/test_gate.py +62 -0
  519. package/onecode/verification/gates/type_gate.py +46 -0
  520. package/onecode/verification/loop.py +95 -0
  521. package/onecode/verification/policy.py +29 -0
  522. package/package.json +2 -2
  523. package/pyproject.toml +84 -0
  524. package/run.js +2 -1
  525. package/tui/__init__.py +46 -0
  526. package/tui/__main__.py +4 -0
  527. package/tui/__pycache__/__init__.cpython-314.pyc +0 -0
  528. package/tui/__pycache__/_loop.cpython-314.pyc +0 -0
  529. package/tui/__pycache__/_path_fuzzy_search.cpython-314.pyc +0 -0
  530. package/tui/__pycache__/_path_match.cpython-314.pyc +0 -0
  531. package/tui/__pycache__/agent.cpython-314.pyc +0 -0
  532. package/tui/__pycache__/agent_schema.cpython-314.pyc +0 -0
  533. package/tui/__pycache__/agents.cpython-314.pyc +0 -0
  534. package/tui/__pycache__/answer.cpython-314.pyc +0 -0
  535. package/tui/__pycache__/app.cpython-314.pyc +0 -0
  536. package/tui/__pycache__/atomic.cpython-314.pyc +0 -0
  537. package/tui/__pycache__/complete.cpython-314.pyc +0 -0
  538. package/tui/__pycache__/constants.cpython-314.pyc +0 -0
  539. package/tui/__pycache__/conversation_markdown.cpython-314.pyc +0 -0
  540. package/tui/__pycache__/db.cpython-314.pyc +0 -0
  541. package/tui/__pycache__/dec.cpython-314.pyc +0 -0
  542. package/tui/__pycache__/directory.cpython-314.pyc +0 -0
  543. package/tui/__pycache__/directory_watcher.cpython-314.pyc +0 -0
  544. package/tui/__pycache__/format_path.cpython-314.pyc +0 -0
  545. package/tui/__pycache__/fuzzy.cpython-314.pyc +0 -0
  546. package/tui/__pycache__/fuzzy_index.cpython-314.pyc +0 -0
  547. package/tui/__pycache__/history.cpython-314.pyc +0 -0
  548. package/tui/__pycache__/jsonrpc.cpython-314.pyc +0 -0
  549. package/tui/__pycache__/menus.cpython-314.pyc +0 -0
  550. package/tui/__pycache__/message_log.cpython-314.pyc +0 -0
  551. package/tui/__pycache__/messages.cpython-314.pyc +0 -0
  552. package/tui/__pycache__/path_complete.cpython-314.pyc +0 -0
  553. package/tui/__pycache__/path_filter.cpython-314.pyc +0 -0
  554. package/tui/__pycache__/paths.cpython-314.pyc +0 -0
  555. package/tui/__pycache__/pill.cpython-314.pyc +0 -0
  556. package/tui/__pycache__/platform_commands.cpython-314.pyc +0 -0
  557. package/tui/__pycache__/protocol.cpython-314.pyc +0 -0
  558. package/tui/__pycache__/session_tracker.cpython-314.pyc +0 -0
  559. package/tui/__pycache__/settings.cpython-314.pyc +0 -0
  560. package/tui/__pycache__/settings_schema.cpython-314.pyc +0 -0
  561. package/tui/__pycache__/shell.cpython-314.pyc +0 -0
  562. package/tui/__pycache__/shell_read.cpython-314.pyc +0 -0
  563. package/tui/__pycache__/slash_command.cpython-314.pyc +0 -0
  564. package/tui/__pycache__/version.cpython-314.pyc +0 -0
  565. package/tui/_loop.py +86 -0
  566. package/tui/_path_fuzzy_search.py +48 -0
  567. package/tui/_path_match.py +141 -0
  568. package/tui/about.py +95 -0
  569. package/tui/acp/__pycache__/agent.cpython-314.pyc +0 -0
  570. package/tui/acp/__pycache__/api.cpython-314.pyc +0 -0
  571. package/tui/acp/__pycache__/encode_tool_call_id.cpython-314.pyc +0 -0
  572. package/tui/acp/__pycache__/event_tap.cpython-314.pyc +0 -0
  573. package/tui/acp/__pycache__/messages.cpython-314.pyc +0 -0
  574. package/tui/acp/__pycache__/prompt.cpython-314.pyc +0 -0
  575. package/tui/acp/__pycache__/protocol.cpython-314.pyc +0 -0
  576. package/tui/acp/agent.py +1212 -0
  577. package/tui/acp/api.py +79 -0
  578. package/tui/acp/encode_tool_call_id.py +12 -0
  579. package/tui/acp/event_tap.py +107 -0
  580. package/tui/acp/messages.py +222 -0
  581. package/tui/acp/prompt.py +53 -0
  582. package/tui/acp/protocol.py +551 -0
  583. package/tui/agent.py +70 -0
  584. package/tui/agent_schema.py +76 -0
  585. package/tui/agents.py +46 -0
  586. package/tui/ansi/__init__.py +1 -0
  587. package/tui/ansi/__pycache__/__init__.cpython-314.pyc +0 -0
  588. package/tui/ansi/__pycache__/_ansi.cpython-314.pyc +0 -0
  589. package/tui/ansi/__pycache__/_ansi_colors.cpython-314.pyc +0 -0
  590. package/tui/ansi/__pycache__/_control_codes.cpython-314.pyc +0 -0
  591. package/tui/ansi/__pycache__/_keys.cpython-314.pyc +0 -0
  592. package/tui/ansi/__pycache__/_sgr_styles.cpython-314.pyc +0 -0
  593. package/tui/ansi/__pycache__/_stream_parser.cpython-314.pyc +0 -0
  594. package/tui/ansi/_ansi.py +1689 -0
  595. package/tui/ansi/_ansi_colors.py +264 -0
  596. package/tui/ansi/_control_codes.py +37 -0
  597. package/tui/ansi/_keys.py +251 -0
  598. package/tui/ansi/_sgr_styles.py +64 -0
  599. package/tui/ansi/_stream_parser.py +418 -0
  600. package/tui/answer.py +12 -0
  601. package/tui/app.py +1195 -0
  602. package/tui/atomic.py +37 -0
  603. package/tui/cli.py +208 -0
  604. package/tui/code_analyze.py +27 -0
  605. package/tui/complete.py +38 -0
  606. package/tui/constants.py +61 -0
  607. package/tui/conversation_markdown.py +30 -0
  608. package/tui/danger.py +372 -0
  609. package/tui/data/agents/ampcode.com.toml +52 -0
  610. package/tui/data/agents/augmentcode.com.toml +41 -0
  611. package/tui/data/agents/cdh.cloud-dev-harness.toml +23 -0
  612. package/tui/data/agents/claude.com.toml +41 -0
  613. package/tui/data/agents/copilot.github.com.toml +29 -0
  614. package/tui/data/agents/crowai.dev.toml +36 -0
  615. package/tui/data/agents/cursor.com.toml +38 -0
  616. package/tui/data/agents/deepagents.langchain.com +34 -0
  617. package/tui/data/agents/docker.com.toml +60 -0
  618. package/tui/data/agents/geminicli.com.toml +28 -0
  619. package/tui/data/agents/goose.ai.toml +52 -0
  620. package/tui/data/agents/inference.huggingface.co.toml +41 -0
  621. package/tui/data/agents/kimi.com.toml +35 -0
  622. package/tui/data/agents/kiro.dev.toml +43 -0
  623. package/tui/data/agents/onecode.dev.toml +22 -0
  624. package/tui/data/agents/openai.com.toml +53 -0
  625. package/tui/data/agents/openclaw.ai.toml +37 -0
  626. package/tui/data/agents/opencode.ai.toml +39 -0
  627. package/tui/data/agents/openhands.dev.toml +46 -0
  628. package/tui/data/agents/stakpak.dev.toml +62 -0
  629. package/tui/data/agents/vibe.mistral.ai.toml +31 -0
  630. package/tui/data/agents/vtcode.dev.toml +63 -0
  631. package/tui/data/images/frog.png +0 -0
  632. package/tui/data/sounds/question.wav +0 -0
  633. package/tui/data/sounds/turn-over.wav +0 -0
  634. package/tui/db.py +213 -0
  635. package/tui/dec.py +332 -0
  636. package/tui/diff_utils.py +131 -0
  637. package/tui/directory.py +234 -0
  638. package/tui/directory_suggester.py +93 -0
  639. package/tui/directory_watcher.py +231 -0
  640. package/tui/format_path.py +25 -0
  641. package/tui/fuzzy.py +140 -0
  642. package/tui/fuzzy_index.py +275 -0
  643. package/tui/gist.py +33 -0
  644. package/tui/history.py +138 -0
  645. package/tui/jsonrpc.py +599 -0
  646. package/tui/menus.py +14 -0
  647. package/tui/message_log.py +69 -0
  648. package/tui/messages.py +144 -0
  649. package/tui/option_content.py +51 -0
  650. package/tui/os.py +0 -0
  651. package/tui/path_complete.py +217 -0
  652. package/tui/path_filter.py +124 -0
  653. package/tui/paths.py +87 -0
  654. package/tui/pill.py +23 -0
  655. package/tui/platform_commands.py +52 -0
  656. package/tui/prompt/__pycache__/extract.cpython-314.pyc +0 -0
  657. package/tui/prompt/__pycache__/resource.cpython-314.pyc +0 -0
  658. package/tui/prompt/extract.py +19 -0
  659. package/tui/prompt/resource.py +68 -0
  660. package/tui/protocol.py +28 -0
  661. package/tui/screens/__init__.py +0 -0
  662. package/tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
  663. package/tui/screens/__pycache__/diff_screen.cpython-314.pyc +0 -0
  664. package/tui/screens/__pycache__/main.cpython-314.pyc +0 -0
  665. package/tui/screens/__pycache__/sessions.cpython-314.pyc +0 -0
  666. package/tui/screens/action_modal.py +94 -0
  667. package/tui/screens/agent_modal.py +175 -0
  668. package/tui/screens/command_edit_modal.py +74 -0
  669. package/tui/screens/diff_explorer_screen.py +419 -0
  670. package/tui/screens/diff_screen.py +84 -0
  671. package/tui/screens/ide_screen.py +461 -0
  672. package/tui/screens/main.py +397 -0
  673. package/tui/screens/main.tcss +662 -0
  674. package/tui/screens/permissions.py +404 -0
  675. package/tui/screens/permissions.tcss +72 -0
  676. package/tui/screens/projects.tcss +84 -0
  677. package/tui/screens/projects_app.py +341 -0
  678. package/tui/screens/projects_screen.py +277 -0
  679. package/tui/screens/session_resume_modal.py +172 -0
  680. package/tui/screens/session_resume_modal.tcss +35 -0
  681. package/tui/screens/sessions.py +171 -0
  682. package/tui/screens/sessions.tcss +119 -0
  683. package/tui/screens/settings.py +293 -0
  684. package/tui/screens/settings.tcss +113 -0
  685. package/tui/screens/store.py +502 -0
  686. package/tui/screens/store.tcss +274 -0
  687. package/tui/screens/tool_content_screen.py +59 -0
  688. package/tui/screens/trace.py +317 -0
  689. package/tui/session_tracker.py +123 -0
  690. package/tui/settings.py +353 -0
  691. package/tui/settings_schema.py +467 -0
  692. package/tui/shell.py +304 -0
  693. package/tui/shell_read.py +42 -0
  694. package/tui/slash_command.py +34 -0
  695. package/tui/tui.tcss +246 -0
  696. package/tui/twitter.py +38 -0
  697. package/tui/version.py +80 -0
  698. package/tui/visuals/__init__.py +0 -0
  699. package/tui/visuals/__pycache__/__init__.cpython-314.pyc +0 -0
  700. package/tui/visuals/__pycache__/columns.cpython-314.pyc +0 -0
  701. package/tui/visuals/columns.py +272 -0
  702. package/tui/widgets/__init__.py +0 -0
  703. package/tui/widgets/__pycache__/__init__.cpython-314.pyc +0 -0
  704. package/tui/widgets/__pycache__/agent_response.cpython-314.pyc +0 -0
  705. package/tui/widgets/__pycache__/agent_thought.cpython-314.pyc +0 -0
  706. package/tui/widgets/__pycache__/aidlc.cpython-314.pyc +0 -0
  707. package/tui/widgets/__pycache__/ask_user.cpython-314.pyc +0 -0
  708. package/tui/widgets/__pycache__/condensed_path.cpython-314.pyc +0 -0
  709. package/tui/widgets/__pycache__/context_stats.cpython-314.pyc +0 -0
  710. package/tui/widgets/__pycache__/conversation.cpython-314.pyc +0 -0
  711. package/tui/widgets/__pycache__/diff_view.cpython-314.pyc +0 -0
  712. package/tui/widgets/__pycache__/flash.cpython-314.pyc +0 -0
  713. package/tui/widgets/__pycache__/future_text.cpython-314.pyc +0 -0
  714. package/tui/widgets/__pycache__/grid_select.cpython-314.pyc +0 -0
  715. package/tui/widgets/__pycache__/highlighted_textarea.cpython-314.pyc +0 -0
  716. package/tui/widgets/__pycache__/load_more.cpython-314.pyc +0 -0
  717. package/tui/widgets/__pycache__/menu.cpython-314.pyc +0 -0
  718. package/tui/widgets/__pycache__/modified_files.cpython-314.pyc +0 -0
  719. package/tui/widgets/__pycache__/non_selectable_label.cpython-314.pyc +0 -0
  720. package/tui/widgets/__pycache__/note.cpython-314.pyc +0 -0
  721. package/tui/widgets/__pycache__/path_search.cpython-314.pyc +0 -0
  722. package/tui/widgets/__pycache__/pending_prompts.cpython-314.pyc +0 -0
  723. package/tui/widgets/__pycache__/plan.cpython-314.pyc +0 -0
  724. package/tui/widgets/__pycache__/project_directory_tree.cpython-314.pyc +0 -0
  725. package/tui/widgets/__pycache__/prompt.cpython-314.pyc +0 -0
  726. package/tui/widgets/__pycache__/question.cpython-314.pyc +0 -0
  727. package/tui/widgets/__pycache__/session_grid_select.cpython-314.pyc +0 -0
  728. package/tui/widgets/__pycache__/session_summary.cpython-314.pyc +0 -0
  729. package/tui/widgets/__pycache__/session_tabs.cpython-314.pyc +0 -0
  730. package/tui/widgets/__pycache__/shell_terminal.cpython-314.pyc +0 -0
  731. package/tui/widgets/__pycache__/side_bar.cpython-314.pyc +0 -0
  732. package/tui/widgets/__pycache__/slash_complete.cpython-314.pyc +0 -0
  733. package/tui/widgets/__pycache__/strike_text.cpython-314.pyc +0 -0
  734. package/tui/widgets/__pycache__/terminal.cpython-314.pyc +0 -0
  735. package/tui/widgets/__pycache__/throbber.cpython-314.pyc +0 -0
  736. package/tui/widgets/__pycache__/tool_call.cpython-314.pyc +0 -0
  737. package/tui/widgets/__pycache__/user_input.cpython-314.pyc +0 -0
  738. package/tui/widgets/acp_content.py +70 -0
  739. package/tui/widgets/agent_response.py +76 -0
  740. package/tui/widgets/agent_thought.py +167 -0
  741. package/tui/widgets/aidlc.py +334 -0
  742. package/tui/widgets/ask_user.py +604 -0
  743. package/tui/widgets/command_pane.py +223 -0
  744. package/tui/widgets/condensed_path.py +115 -0
  745. package/tui/widgets/context_stats.py +66 -0
  746. package/tui/widgets/conversation.py +3235 -0
  747. package/tui/widgets/danger_warning.py +65 -0
  748. package/tui/widgets/diff_view.py +69 -0
  749. package/tui/widgets/directory_input.py +8 -0
  750. package/tui/widgets/edit_field.py +206 -0
  751. package/tui/widgets/flash.py +81 -0
  752. package/tui/widgets/future_text.py +126 -0
  753. package/tui/widgets/grid_select.py +234 -0
  754. package/tui/widgets/highlighted_textarea.py +183 -0
  755. package/tui/widgets/load_more.py +24 -0
  756. package/tui/widgets/mandelbrot.py +294 -0
  757. package/tui/widgets/markdown_note.py +13 -0
  758. package/tui/widgets/menu.py +147 -0
  759. package/tui/widgets/model_status.py +230 -0
  760. package/tui/widgets/modified_files.py +315 -0
  761. package/tui/widgets/non_selectable_label.py +5 -0
  762. package/tui/widgets/note.py +18 -0
  763. package/tui/widgets/path_search.py +492 -0
  764. package/tui/widgets/pending_prompts.py +36 -0
  765. package/tui/widgets/plan.py +285 -0
  766. package/tui/widgets/project_directory_tree.py +102 -0
  767. package/tui/widgets/project_grid_select.py +68 -0
  768. package/tui/widgets/project_summary.py +33 -0
  769. package/tui/widgets/prompt.py +935 -0
  770. package/tui/widgets/question.py +360 -0
  771. package/tui/widgets/session_grid_select.py +230 -0
  772. package/tui/widgets/session_summary.py +115 -0
  773. package/tui/widgets/session_tabs.py +194 -0
  774. package/tui/widgets/shell_result.py +35 -0
  775. package/tui/widgets/shell_terminal.py +40 -0
  776. package/tui/widgets/side_bar.py +124 -0
  777. package/tui/widgets/slash_complete.py +235 -0
  778. package/tui/widgets/strike_text.py +70 -0
  779. package/tui/widgets/subagent.py +287 -0
  780. package/tui/widgets/subagent_screen.py +715 -0
  781. package/tui/widgets/terminal.py +576 -0
  782. package/tui/widgets/terminal_tool.py +360 -0
  783. package/tui/widgets/throbber.py +100 -0
  784. package/tui/widgets/tool_call.py +432 -0
  785. package/tui/widgets/user_input.py +23 -0
  786. package/tui/widgets/version.py +5 -0
  787. package/tui/widgets/welcome.py +31 -0
@@ -0,0 +1,150 @@
1
+ from __future__ import annotations
2
+
3
+ import fnmatch
4
+ from dataclasses import dataclass, field
5
+ from enum import Enum
6
+ from pathlib import Path
7
+ from typing import Optional
8
+
9
+
10
+ class PermissionResult(Enum):
11
+ ALLOW = "allow"
12
+ DENY = "deny"
13
+ ASK = "ask"
14
+
15
+
16
+ @dataclass
17
+ class PathRule:
18
+ pattern: str
19
+ permission: PermissionResult = PermissionResult.ALLOW
20
+
21
+ def matches(self, path: str) -> bool:
22
+ return (
23
+ fnmatch.fnmatch(path, self.pattern) or
24
+ fnmatch.fnmatch(Path(path).name, self.pattern) or
25
+ fnmatch.fnmatch(Path(path).stem, self.pattern)
26
+ )
27
+
28
+
29
+ @dataclass
30
+ class CommandRule:
31
+ pattern: str
32
+ permission: PermissionResult = PermissionResult.ALLOW
33
+
34
+ def matches(self, cmd: str) -> bool:
35
+ normalized = cmd.strip()
36
+ if fnmatch.fnmatch(normalized, self.pattern):
37
+ return True
38
+ parts = normalized.split()
39
+ if parts:
40
+ cmd_base = parts[0]
41
+ args = " ".join(parts[1:]) if len(parts) > 1 else ""
42
+ if args and fnmatch.fnmatch(f"{cmd_base} {args}", self.pattern):
43
+ return True
44
+ if fnmatch.fnmatch(cmd_base, self.pattern):
45
+ return True
46
+ return False
47
+
48
+
49
+ @dataclass
50
+ class PermissionSet:
51
+ path_rules: list[PathRule] = field(default_factory=list)
52
+ command_rules: list[CommandRule] = field(default_factory=list)
53
+ default_path_permission: PermissionResult = PermissionResult.ALLOW
54
+ default_command_permission: PermissionResult = PermissionResult.ALLOW
55
+
56
+ def check_path(self, path: str) -> PermissionResult:
57
+ matched = self.default_path_permission
58
+ for rule in self.path_rules:
59
+ if rule.matches(path):
60
+ matched = rule.permission
61
+ return matched
62
+
63
+ def check_command(self, cmd: str) -> PermissionResult:
64
+ matched = self.default_command_permission
65
+ for rule in self.command_rules:
66
+ if rule.matches(cmd):
67
+ matched = rule.permission
68
+ return matched
69
+
70
+ def allow_path(self, pattern: str) -> None:
71
+ self.path_rules.append(PathRule(pattern, PermissionResult.ALLOW))
72
+
73
+ def deny_path(self, pattern: str) -> None:
74
+ self.path_rules.append(PathRule(pattern, PermissionResult.DENY))
75
+
76
+ def ask_path(self, pattern: str) -> None:
77
+ self.path_rules.append(PathRule(pattern, PermissionResult.ASK))
78
+
79
+ def allow_command(self, pattern: str) -> None:
80
+ self.command_rules.append(CommandRule(pattern, PermissionResult.ALLOW))
81
+
82
+ def deny_command(self, pattern: str) -> None:
83
+ self.command_rules.append(CommandRule(pattern, PermissionResult.DENY))
84
+
85
+ def ask_command(self, pattern: str) -> None:
86
+ self.command_rules.append(CommandRule(pattern, PermissionResult.ASK))
87
+
88
+ @classmethod
89
+ def from_config(cls, config: dict) -> "PermissionSet":
90
+ ps = cls()
91
+ perm_map = {"allow": PermissionResult.ALLOW, "ask": PermissionResult.ASK, "deny": PermissionResult.DENY}
92
+
93
+ if "path" in config:
94
+ for pattern, action in config["path"].items():
95
+ if action in perm_map:
96
+ getattr(ps, f"{action}_path")(pattern)
97
+
98
+ if "command" in config:
99
+ for pattern, action in config["command"].items():
100
+ if action in perm_map:
101
+ getattr(ps, f"{action}_command")(pattern)
102
+
103
+ if "default" in config:
104
+ default = config["default"]
105
+ if "path" in default and default["path"] in perm_map:
106
+ ps.default_path_permission = perm_map[default["path"]]
107
+ if "command" in default and default["command"] in perm_map:
108
+ ps.default_command_permission = perm_map[default["command"]]
109
+
110
+ return ps
111
+
112
+
113
+ class PermissionChecker:
114
+ def __init__(self, permission_set: Optional[PermissionSet] = None):
115
+ self.permission_set = permission_set or PermissionSet()
116
+
117
+ def check_file_read(self, path: str) -> PermissionResult:
118
+ return self.permission_set.check_path(path)
119
+
120
+ def check_file_write(self, path: str) -> PermissionResult:
121
+ return self.permission_set.check_path(path)
122
+
123
+ def check_command(self, cmd: str) -> PermissionResult:
124
+ return self.permission_set.check_command(cmd)
125
+
126
+ def is_allowed(self, permission: PermissionResult) -> bool:
127
+ return permission == PermissionResult.ALLOW
128
+
129
+ def is_denied(self, permission: PermissionResult) -> bool:
130
+ return permission == PermissionResult.DENY
131
+
132
+ def requires_approval(self, permission: PermissionResult) -> bool:
133
+ return permission == PermissionResult.ASK
134
+
135
+
136
+ def create_safe_permission_set() -> PermissionSet:
137
+ ps = PermissionSet()
138
+ ps.deny_path("**/.env")
139
+ ps.deny_path("**/secrets/**")
140
+ ps.deny_path("**/credentials/**")
141
+ ps.deny_command("rm -rf /")
142
+ ps.deny_command("rm -rf /*")
143
+ ps.deny_command("dd if=*")
144
+ ps.deny_command("mkfs.*")
145
+ ps.deny_command(":(){:|:&};:")
146
+ ps.ask_command("sudo *")
147
+ ps.ask_command("chmod 777 *")
148
+ ps.ask_command("curl *")
149
+ ps.ask_command("wget *")
150
+ return ps
@@ -0,0 +1,73 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional
4
+
5
+ from onecode.agent.agents.types import AgentPermission
6
+
7
+
8
+ class PermissionStore:
9
+ """Persists user-defined allow_always / reject_always overrides across
10
+ ``set_agent()`` calls so permissions survive mode switches.
11
+
12
+ Usage::
13
+
14
+ store = PermissionStore()
15
+ store.set_override("bash", AgentPermission.ALLOW) # user said "Allow always"
16
+ store.set_override("edit", AgentPermission.DENY) # user said "Reject always"
17
+ ...
18
+ store.apply_to(current_agent) # re-apply after set_agent
19
+ """
20
+
21
+ def __init__(self) -> None:
22
+ # perm_key → AgentPermission (e.g. "bash" → AgentPermission.ALLOW)
23
+ self._overrides: dict[str, AgentPermission] = {}
24
+
25
+ def set_override(self, perm_key: str, perm: AgentPermission) -> None:
26
+ """Record a user override for the given permission key."""
27
+ self._overrides[perm_key] = perm
28
+
29
+ def get_override(self, perm_key: str) -> Optional[AgentPermission]:
30
+ return self._overrides.get(perm_key)
31
+
32
+ def clear_override(self, perm_key: str) -> None:
33
+ self._overrides.pop(perm_key, None)
34
+
35
+ def clear_all(self) -> None:
36
+ self._overrides.clear()
37
+
38
+ def apply_to(self, agent) -> None:
39
+ """Apply all recorded overrides to an AgentConfig instance.
40
+
41
+ Call this after ``set_agent()`` to restore the user's choices.
42
+
43
+ Agents with ``permissions_locked`` (e.g. PlanAgent) are skipped
44
+ entirely — their permission set is an intentional mode-level
45
+ restriction (read-only plan gate) that user overrides from other
46
+ modes must never bypass, including fields that happen to be ASK
47
+ rather than hard-DENY.
48
+ """
49
+ if getattr(agent, "permissions_locked", False):
50
+ return
51
+ for perm_key, perm in self._overrides.items():
52
+ attr_name = f"permission_{perm_key}"
53
+ if hasattr(agent, attr_name):
54
+ current = getattr(agent, attr_name)
55
+ if current == AgentPermission.DENY:
56
+ continue
57
+ setattr(agent, attr_name, perm)
58
+
59
+ def to_dict(self) -> dict[str, str]:
60
+ return {k: v.value for k, v in self._overrides.items()}
61
+
62
+ @classmethod
63
+ def from_dict(cls, d: dict[str, str]) -> PermissionStore:
64
+ store = cls()
65
+ for k, v in d.items():
66
+ try:
67
+ store._overrides[k] = AgentPermission(v)
68
+ except ValueError:
69
+ pass
70
+ return store
71
+
72
+ def snapshot(self) -> dict[str, AgentPermission]:
73
+ return dict(self._overrides)
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def load_project_doc(workspace_root: Path) -> str:
7
+ """Read ``AGENTS.md`` at the project root if present.
8
+
9
+ Convention mirrors ``AGENTS.md`` / ``CLAUDE.md``: exactly one file at
10
+ the workspace root that all AI agents must read. Unlike skills,
11
+ this is not registered — it's injected directly as project context.
12
+ """
13
+ path = workspace_root.resolve() / "AGENTS.md"
14
+ if not path.exists():
15
+ return ""
16
+ try:
17
+ return path.read_text(encoding="utf-8")
18
+ except Exception:
19
+ return ""
@@ -0,0 +1,230 @@
1
+ """Shared plain-text question detection for auto-AskUser conversion.
2
+
3
+ Both the engine (intercepts mid-turn, before tool execution) and the ACP
4
+ adapter (end-of-turn fallback) must agree on what counts as a question, or
5
+ plain-text questions slip through and the user's input gets queued instead
6
+ of becoming an AskUser dialog.
7
+
8
+ Detection uses two layers:
9
+ - Layer 1 — Semantic (intent): explicit "need user input" signals
10
+ - Layer 2 — Syntax (punctuation): question marks as fallback
11
+
12
+ Self-talk patterns are excluded (the LLM is reasoning to itself, no input
13
+ needed).
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import re
19
+
20
+ # Patterns indicating the LLM explicitly needs human input
21
+ SEMANTIC_NEEDS_INPUT = [
22
+ r"需要用户", r"需要您", r"需要您提供",
23
+ r"请确认", r"请选择", r"询问您", r"问您",
24
+ r"需要确认", r"需要知道", r"请告诉我",
25
+ r"等待您的", r"需要.*信息", r"需要哪些参数",
26
+ r"请提供", r"请问要", r"请问您", r"需要.*id",
27
+ r"哪个用户", r"哪个文件", r"什么参数", r"如何处理",
28
+ r"^请问",
29
+ r"could you (tell me|confirm|provide|let me know)",
30
+ r"i need to know",
31
+ r"please (confirm|tell me|specify|provide|select|choose)",
32
+ r"which .*(user|file|parameter|option|setting)",
33
+ r"what .*(parameter|user|file|option|setting)",
34
+ r"what should i",
35
+ r"which (file|user|option|one)",
36
+ r"should i (proceed|continue|upgrade|execute)",
37
+ r"do you want (me to|to)",
38
+ r"can you (tell me|confirm|specify)",
39
+ r"let me know (which|what|if|whether)",
40
+ r"i'?m not sure (which|what|who|how)",
41
+ r"you('d| would) like (me to|to)",
42
+ r"would you like (me to|to)",
43
+ r"(could i|may i) get (the|your)",
44
+ r"pick (a|an|the)",
45
+ r"choose (a|an|the|which)",
46
+ r"what'?s the (user|file|path|parameter)",
47
+ r"which one",
48
+ r"confirm the (user|file|path|parameter)",
49
+ r"specify (the|which|what)",
50
+ r"what .*(file|user|path|parameter)",
51
+ r"which .*should i",
52
+ r"(do you|would you|should i)",
53
+ ]
54
+
55
+ # Patterns where SEMANTIC_NEEDS_INPUT matched but it's actually a polite
56
+ # instruction/statement rather than a genuine question. These are LLM
57
+ # self-talk statements of what it needs ("请告诉我错误信息" = "tell me the error"
58
+ # as a statement of need, not a question).
59
+ SEMANTIC_NEEDS_INPUT_EXCLUSIONS = [
60
+ r"请尝试后告知结果", r"请尝试", r"请告知", r"请先",
61
+ r"请试试", r"请按", r"请过一会儿", r"请执行",
62
+ r"请查看", r"请参考", r"请注意", r"请检查",
63
+ r"请运行", r"请输入", r"请提交", r"请刷新",
64
+ ]
65
+
66
+ # Patterns indicating the LLM is just reasoning (self-talk, no input needed)
67
+ SEMANTIC_SELF_TALK = [
68
+ r"^让我想想", r"^我需要先", r"^我可以先",
69
+ r"^首先", r"^然后", r"^接下来", r"^好的",
70
+ r"自言自语", r"我在想", r"我在考虑",
71
+ r"让我先", r"我先来", r"先执行",
72
+ r"^let me (think|check|read|look|find|see)",
73
+ r"^i('ll| will| can| should)?( be)? (checking|reading|looking|finding|seeing|thinking)",
74
+ r"^first(ly)?(,| )?(i('ll| will| can| should)?)?",
75
+ r"^then(,| )?(i('ll| will| can| should)?)?",
76
+ r"^next(,| )?(i('ll| will| can| should)?)?",
77
+ r"^okay(|,| ) (so|let me|i('ll| will| can| should)?)",
78
+ r"^alright(|,| ) (so|let me|i('ll| will| can| should)?)",
79
+ r"^sure(|,| ) (so|let me|i('ll| will| can| should)?)",
80
+ r"^sounds good(|,| )",
81
+ r"^i('ll| will| can| should)?( go ahead| start| begin| proceed| execute)",
82
+ r"^i('ll| will| can| should)?( need to| have to| want to) (check|read|look|find|see|think|consider|proceed|execute|verify|confirm|fix|update|change|add|remove)",
83
+ r"^i('m| am)( going to| about to)?",
84
+ r"^looks like",
85
+ r"^it seems (like|that)",
86
+ r"^based on",
87
+ r"^let me just",
88
+ r"^i('ll| will)? just (check|read|look|find|see|try)",
89
+ r"^i think (that )?",
90
+ r"^i believe (that )?",
91
+ r"i('m| am) thinking (about|that)",
92
+ r"i('m| am) considering",
93
+ r"^here('s| is)",
94
+ r"^so(,| )? i('ll| will| can| should)?",
95
+ r"^okay so",
96
+ r"i need to consider",
97
+ ]
98
+
99
+
100
+ def semantic_needs_input(text: str) -> bool:
101
+ """True when the text carries an explicit "I need user input" signal.
102
+
103
+ Self-talk patterns take precedence: an LLM reasoning to itself does not
104
+ need the user, even if it happens to mention an input-like phrase.
105
+
106
+ Polite instruction exclusions: phrases like "请尝试后告知结果" are
107
+ statements of what the LLM needs, not genuine questions.
108
+ """
109
+ if not text:
110
+ return False
111
+ for pattern in SEMANTIC_SELF_TALK:
112
+ if re.search(pattern, text, re.IGNORECASE):
113
+ return False
114
+ for pattern in SEMANTIC_NEEDS_INPUT:
115
+ if re.search(pattern, text, re.IGNORECASE):
116
+ for excl in SEMANTIC_NEEDS_INPUT_EXCLUSIONS:
117
+ if re.search(excl, text, re.IGNORECASE):
118
+ return False
119
+ return True
120
+ return False
121
+
122
+
123
+ def has_trailing_question_mark(text: str) -> bool:
124
+ """True when the text ends with a question marker (?/CJK+?)."""
125
+ stripped = text.rstrip() if text else ""
126
+ if not stripped:
127
+ return False
128
+ if stripped.endswith("\uff1f"):
129
+ return True
130
+ if stripped.endswith("?") and len(stripped) >= 2:
131
+ prev = stripped[-2]
132
+ return "\u4e00" <= prev <= "\u9fff" or "\u3000" <= prev <= "\u303f"
133
+ return False
134
+
135
+
136
+ def has_question_mark_in_last_sentence(text: str) -> bool:
137
+ """True when the FINAL sentence of the text contains a question mark.
138
+
139
+ This is the loose fallback: unlike checking anywhere in the output, an
140
+ aside or rhetorical ``?`` buried in the middle of the response does not
141
+ count — only a question that closes the turn does. This keeps auto-ask
142
+ from firing on every turn just because the LLM's prose happens to
143
+ contain a question mark.
144
+ """
145
+ stripped = text.rstrip() if text else ""
146
+ if not stripped:
147
+ return False
148
+ m = max(
149
+ stripped.rfind("。"), stripped.rfind("!"), stripped.rfind("?"),
150
+ stripped.rfind("."), stripped.rfind("!"), stripped.rfind("?"),
151
+ stripped.rfind("\n"),
152
+ )
153
+ tail = stripped[m + 1:] if m >= 0 else stripped
154
+ return "?" in tail or "?" in tail
155
+
156
+
157
+ def looks_like_question(text: str, *, strict: bool = False) -> bool:
158
+ """True when the text asks the user for input.
159
+
160
+ ``strict=True`` (used when the LLM made no tool calls): the question
161
+ must be signalled by intent or by trailing question punctuation, so
162
+ ordinary prose or code containing a stray ``?`` is not misread.
163
+
164
+ ``strict=False`` (used when tool calls accompany the text): a question
165
+ mark in the FINAL sentence also counts, so a question followed by tool
166
+ execution is still intercepted — but an aside ``?`` in the middle of the
167
+ output does not trigger auto-ask.
168
+ """
169
+ if not text or not text.strip():
170
+ return False
171
+ if semantic_needs_input(text):
172
+ return True
173
+ if has_trailing_question_mark(text):
174
+ return True
175
+ if not strict and has_question_mark_in_last_sentence(text):
176
+ return True
177
+ return False
178
+
179
+
180
+ # Common markdown block/emphasis markers that bloat the AskUser widget.
181
+ # We strip these from the auto-ask question so the dialog stays compact.
182
+ _MARKDOWN_STRIP = (
183
+ r"\*\*", r"__", r"`", r"```", r"\*",
184
+ r"^#+\s?", r"^>\s?", r"^\s*[-*+]\s+", r"^\s*\d+\.\s+",
185
+ r"^---\s*$", r"^\|", r"\|\s*$",
186
+ )
187
+
188
+
189
+ def strip_markdown(text: str) -> str:
190
+ """Strip common markdown syntax so question text renders cleanly."""
191
+ if not text:
192
+ return ""
193
+ lines = []
194
+ for raw in text.splitlines():
195
+ line = raw
196
+ for pat in _MARKDOWN_STRIP:
197
+ line = re.sub(pat, "", line)
198
+ lines.append(line.strip())
199
+ return "\n".join(lines).strip()
200
+
201
+
202
+ def compact_question(text: str, *, max_chars: int = 240) -> str:
203
+ """Condense a (possibly markdown-laden) question to a compact snippet.
204
+
205
+ Used for auto-AskUser conversion so the dialog shows the trailing
206
+ question sentence instead of the whole preamble/plan text.
207
+ """
208
+ if not text:
209
+ return ""
210
+ clean = strip_markdown(text)
211
+
212
+ # Prefer the final sentence, anchored on CJK/Latin sentence terminators.
213
+ tail = ""
214
+ for marker in ("。", "!", "\uff1f", ". ", "! ", "? ", "\n"):
215
+ idx = clean.rfind(marker)
216
+ if idx >= 0:
217
+ tail = clean[idx + 1:].strip()
218
+ break
219
+ if len(tail) < 12:
220
+ tail = clean
221
+
222
+ if len(tail) <= max_chars:
223
+ return tail
224
+
225
+ # Hard truncate at a sentence boundary near the limit.
226
+ prefix = tail[:max_chars]
227
+ cut = max(prefix.rfind("。"), prefix.rfind(","), prefix.rfind(". "), prefix.rfind(", "))
228
+ if cut >= max_chars * 3 // 4:
229
+ prefix = prefix[:cut + 1]
230
+ return prefix.rstrip() + "…"
@@ -0,0 +1,3 @@
1
+ from __future__ import annotations
2
+
3
+ from cdh.session_store import AgentSession, SessionData # noqa: F401
@@ -0,0 +1,144 @@
1
+ from __future__ import annotations
2
+
3
+ import fnmatch
4
+ import json
5
+ import os
6
+ import shutil
7
+ import tarfile
8
+ import uuid
9
+ from dataclasses import dataclass
10
+ from datetime import datetime, timezone
11
+ from pathlib import Path
12
+ from typing import Optional
13
+
14
+
15
+ @dataclass
16
+ class SnapshotInfo:
17
+ id: str
18
+ name: str
19
+ timestamp: str
20
+ description: str
21
+ size_bytes: int
22
+ file_count: int
23
+
24
+
25
+ class SnapshotManager:
26
+ def __init__(self, base_path: Optional[Path] = None):
27
+ from onecode.config import ONECODE_DIR
28
+ self.base_path = base_path or (ONECODE_DIR / "snapshots")
29
+ self.base_path.mkdir(parents=True, exist_ok=True)
30
+
31
+ def create(
32
+ self,
33
+ workspace: Path,
34
+ name: str,
35
+ description: str = "",
36
+ exclude_patterns: Optional[list[str]] = None,
37
+ ) -> SnapshotInfo:
38
+ snapshot_id = str(uuid.uuid4())[:8]
39
+ snapshot_dir = self.base_path / snapshot_id
40
+ snapshot_dir.mkdir(parents=True, exist_ok=True)
41
+
42
+ tar_path = snapshot_dir / "snapshot.tar.gz"
43
+ manifest_path = snapshot_dir / "manifest.json"
44
+
45
+ exclude_patterns = exclude_patterns or [
46
+ ".git",
47
+ "node_modules",
48
+ "__pycache__",
49
+ "*.pyc",
50
+ ".pytest_cache",
51
+ ".venv",
52
+ "venv",
53
+ ".env",
54
+ "*.egg-info",
55
+ ".cdh",
56
+ "snapshots",
57
+ ]
58
+
59
+ file_count = 0
60
+ with tarfile.open(str(tar_path), "w:gz") as tar:
61
+ for root, dirs, files in os.walk(workspace):
62
+ dirs[:] = [d for d in dirs if not self._should_exclude(d, exclude_patterns)]
63
+
64
+ for file in files:
65
+ file_path = Path(root) / file
66
+ if not self._should_exclude(file_path.name, exclude_patterns):
67
+ try:
68
+ tar.add(str(file_path), arcname=str(file_path.relative_to(workspace)))
69
+ file_count += 1
70
+ except Exception:
71
+ pass
72
+
73
+ size_bytes = tar_path.stat().st_size
74
+
75
+ manifest = {
76
+ "id": snapshot_id,
77
+ "name": name,
78
+ "description": description,
79
+ "timestamp": datetime.now(timezone.utc).isoformat(),
80
+ "workspace": str(workspace),
81
+ "file_count": file_count,
82
+ "size_bytes": size_bytes,
83
+ }
84
+ manifest_path.write_text(json.dumps(manifest, indent=2), encoding="utf-8")
85
+
86
+ return SnapshotInfo(
87
+ id=snapshot_id,
88
+ name=name,
89
+ timestamp=manifest["timestamp"],
90
+ description=description,
91
+ size_bytes=size_bytes,
92
+ file_count=file_count,
93
+ )
94
+
95
+ def restore(self, snapshot_id: str, target_dir: Path) -> bool:
96
+ snapshot_dir = self.base_path / snapshot_id
97
+ if not snapshot_dir.exists():
98
+ return False
99
+
100
+ tar_path = snapshot_dir / "snapshot.tar.gz"
101
+ if not tar_path.exists():
102
+ return False
103
+
104
+ target_dir.mkdir(parents=True, exist_ok=True)
105
+
106
+ with tarfile.open(str(tar_path), "r:gz") as tar:
107
+ tar.extractall(target_dir)
108
+
109
+ return True
110
+
111
+ def list(self) -> list[SnapshotInfo]:
112
+ snapshots = []
113
+ for snapshot_dir in self.base_path.iterdir():
114
+ if not snapshot_dir.is_dir():
115
+ continue
116
+ manifest_path = snapshot_dir / "manifest.json"
117
+ if not manifest_path.exists():
118
+ continue
119
+ try:
120
+ manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
121
+ snapshots.append(SnapshotInfo(
122
+ id=manifest["id"],
123
+ name=manifest["name"],
124
+ timestamp=manifest["timestamp"],
125
+ description=manifest.get("description", ""),
126
+ size_bytes=manifest.get("size_bytes", 0),
127
+ file_count=manifest.get("file_count", 0),
128
+ ))
129
+ except Exception:
130
+ continue
131
+ return sorted(snapshots, key=lambda s: s.timestamp, reverse=True)
132
+
133
+ def delete(self, snapshot_id: str) -> bool:
134
+ snapshot_dir = self.base_path / snapshot_id
135
+ if snapshot_dir.exists():
136
+ shutil.rmtree(snapshot_dir)
137
+ return True
138
+ return False
139
+
140
+ def _should_exclude(self, name: str, patterns: list[str]) -> bool:
141
+ for pattern in patterns:
142
+ if fnmatch.fnmatch(name, pattern):
143
+ return True
144
+ return False
@@ -0,0 +1,17 @@
1
+ from onecode.agent.tools.file_ops import FileOps, ShellTool, ToolFactory
2
+ from onecode.agent.tools.protocol import ToolCall, ToolResult
3
+ from onecode.agent.tools.errors import ToolError, ToolInputError, ToolPermissionError, ToolExecutionError
4
+ from onecode.agent.tools.registry import Tool, ToolRegistry, ToolSpec
5
+ from onecode.agent.tools.permissions import ToolPermissionContext, PermissionResult
6
+ from onecode.agent.tools.permission_handler import InteractivePermissionHandler, PermissionDecision, PermissionHandler
7
+ from onecode.agent.tools.schema_validation import validate_json_schema
8
+
9
+ __all__ = [
10
+ "FileOps", "ShellTool", "ToolFactory",
11
+ "ToolCall", "ToolResult",
12
+ "ToolError", "ToolInputError", "ToolPermissionError", "ToolExecutionError",
13
+ "Tool", "ToolRegistry", "ToolSpec",
14
+ "ToolPermissionContext", "PermissionResult",
15
+ "InteractivePermissionHandler", "PermissionDecision", "PermissionHandler",
16
+ "validate_json_schema",
17
+ ]