@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
@@ -1,1321 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>CDH Trace Dashboard</title>
7
- <script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>
8
- <style>
9
- :root {
10
- --bg-base: #090d13;
11
- --bg-sidebar: #0d1117;
12
- --bg-card: #161b22;
13
- --bg-hover: #1c2128;
14
- --bg-active: #21262d;
15
- --border: #30363d;
16
- --border-light: #3d444d;
17
- --text-primary: #e6edf3;
18
- --text-secondary: #8b949e;
19
- --text-muted: #6e7681;
20
- --accent: #58a6ff;
21
- --accent-hover: #79c0ff;
22
- --green: #3fb950;
23
- --yellow: #d29922;
24
- --red: #f85149;
25
- --purple: #a78bfa;
26
- --orange: #f78166;
27
- --cyan: #39d353;
28
- }
29
- * { margin: 0; padding: 0; box-sizing: border-box; }
30
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg-base); color: var(--text-primary); font-size: 14px; height: 100vh; overflow: hidden; }
31
- a { color: var(--accent); text-decoration: none; }
32
- a:hover { color: var(--accent-hover); }
33
-
34
- /* Layout */
35
- .app { display: flex; height: 100vh; }
36
-
37
- /* Sidebar */
38
- .sidebar { width: 220px; background: var(--bg-sidebar); border-right: 1px solid var(--border); display: flex; flex-direction: column; flex-shrink: 0; }
39
- .sidebar-header { padding: 16px; border-bottom: 1px solid var(--border); }
40
- .sidebar-logo { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 1rem; color: var(--text-primary); }
41
- .sidebar-logo svg { width: 24px; height: 24px; color: var(--accent); }
42
- .sidebar-nav { flex: 1; padding: 12px 8px; overflow-y: auto; }
43
- .nav-item { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 6px; color: var(--text-secondary); font-size: 0.875rem; cursor: pointer; transition: all 0.15s; margin-bottom: 2px; }
44
- .nav-item:hover { background: var(--bg-hover); color: var(--text-primary); }
45
- .nav-item.active { background: var(--bg-active); color: var(--accent); }
46
- .nav-item svg { width: 18px; height: 18px; flex-shrink: 0; }
47
- .nav-item .count { margin-left: auto; font-size: 0.72rem; background: var(--bg-active); padding: 2px 8px; border-radius: 10px; color: var(--text-muted); }
48
- .nav-section { font-size: 0.68rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; padding: 16px 12px 8px; }
49
-
50
- /* Main Content */
51
- .main { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
52
-
53
- /* Top Bar */
54
- .topbar { height: 56px; background: var(--bg-sidebar); border-bottom: 1px solid var(--border); display: flex; align-items: center; padding: 0 20px; gap: 16px; flex-shrink: 0; }
55
- .topbar-title { font-size: 0.875rem; color: var(--text-secondary); }
56
- .topbar-title strong { color: var(--text-primary); font-weight: 600; }
57
- .time-selector { display: flex; align-items: center; gap: 8px; margin-left: auto; }
58
- .time-selector button { background: var(--bg-card); border: 1px solid var(--border); color: var(--text-secondary); padding: 6px 12px; border-radius: 6px; font-size: 0.78rem; cursor: pointer; transition: all 0.15s; }
59
- .time-selector button:hover { border-color: var(--accent); color: var(--text-primary); }
60
- .time-selector button.active { background: var(--accent); border-color: var(--accent); color: #fff; }
61
- .refresh-btn { display: inline-flex; align-items: center; gap: 6px; background: var(--bg-card); border: 1px solid var(--border); color: var(--text-secondary); padding: 6px 12px; border-radius: 6px; font-size: 0.78rem; cursor: pointer; box-sizing: border-box; height: 32px; outline: none; }
62
- .refresh-btn:hover { border-color: var(--accent); }
63
- .refresh-btn:focus { border-color: var(--accent); }
64
- .refresh-btn:active { border-color: var(--accent); transform: scale(0.98); }
65
- .refresh-btn.loading { opacity: 0.7; pointer-events: none; }
66
- .refresh-btn.loading svg { animation: spin 1s linear infinite; }
67
- @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
68
-
69
- /* Content Area */
70
- .content { flex: 1; overflow-y: auto; padding: 20px; }
71
-
72
- /* Dashboard Grid */
73
- .dashboard { display: grid; grid-template-columns: repeat(12, 1fr); gap: 16px; }
74
-
75
- /* Cards */
76
- .card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
77
- .card-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--border); }
78
- .card-title { display: flex; align-items: center; gap: 8px; font-size: 0.8rem; font-weight: 600; color: var(--text-primary); text-transform: uppercase; letter-spacing: 0.3px; }
79
- .card-title .dot { width: 8px; height: 8px; border-radius: 50%; }
80
- .card-body { padding: 16px; }
81
- .card-body.no-padding { padding: 0; }
82
- .card-footer { padding: 12px 16px; border-top: 1px solid var(--border); background: var(--bg-hover); }
83
-
84
- /* Grid spans */
85
- .col-3 { grid-column: span 3; }
86
- .col-4 { grid-column: span 4; }
87
- .col-6 { grid-column: span 6; }
88
- .col-8 { grid-column: span 8; }
89
- .col-12 { grid-column: span 12; }
90
-
91
- /* Stat Cards */
92
- .stat-card { padding: 16px; display: flex; flex-direction: column; gap: 8px; }
93
- .stat-card .stat-label { font-size: 0.7rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; display: flex; align-items: center; gap: 6px; }
94
- .stat-card .stat-value { font-size: 1.75rem; font-weight: 700; color: var(--text-primary); line-height: 1; }
95
- .stat-card .stat-value.accent { color: var(--accent); }
96
- .stat-card .stat-value.green { color: var(--green); }
97
- .stat-card .stat-value.yellow { color: var(--yellow); }
98
- .stat-card .stat-value.red { color: var(--red); }
99
- .stat-card .stat-value.purple { color: var(--purple); }
100
- .stat-card .stat-value.orange { color: var(--orange); }
101
- .stat-card .stat-sub { font-size: 0.75rem; color: var(--text-muted); }
102
- .stat-card .stat-trend { display: inline-flex; align-items: center; gap: 4px; font-size: 0.72rem; padding: 2px 8px; border-radius: 12px; margin-top: 4px; }
103
- .stat-card .stat-trend.up { background: rgba(63, 185, 80, 0.15); color: var(--green); }
104
- .stat-card .stat-trend.down { background: rgba(248, 81, 73, 0.15); color: var(--red); }
105
-
106
- /* Tables */
107
- .data-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; }
108
- .data-table th { text-align: left; padding: 10px 14px; background: var(--bg-hover); color: var(--text-muted); font-weight: 600; font-size: 0.7rem; text-transform: uppercase; white-space: nowrap; border-bottom: 1px solid var(--border); }
109
- .data-table td { padding: 10px 14px; border-bottom: 1px solid var(--border); white-space: nowrap; }
110
- .data-table tr:hover td { background: var(--bg-hover); }
111
- .data-table tr:last-child td { border-bottom: none; }
112
- .data-table td.truncate { max-width: 200px; overflow: hidden; text-overflow: ellipsis; }
113
-
114
- /* Badges */
115
- .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.68rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px; }
116
- .badge-blue { background: rgba(88, 166, 255, 0.15); color: var(--accent); }
117
- .badge-green { background: rgba(63, 185, 80, 0.15); color: var(--green); }
118
- .badge-yellow { background: rgba(210, 153, 34, 0.15); color: var(--yellow); }
119
- .badge-red { background: rgba(248, 81, 73, 0.15); color: var(--red); }
120
- .badge-purple { background: rgba(167, 139, 250, 0.15); color: var(--purple); }
121
- .badge-orange { background: rgba(247, 129, 102, 0.15); color: var(--orange); }
122
- .badge-gray { background: var(--bg-active); color: var(--text-secondary); }
123
- .badge-tag { background: rgba(167, 139, 250, 0.12); color: var(--purple); margin: 2px; }
124
-
125
- /* Status indicators */
126
- .status-dot { width: 6px; height: 6px; border-radius: 50%; display: inline-block; }
127
- .status-dot.green { background: var(--green); }
128
- .status-dot.red { background: var(--red); }
129
- .status-dot.yellow { background: var(--yellow); }
130
-
131
- /* Progress bars */
132
- .progress-bar { height: 4px; background: var(--bg-active); border-radius: 2px; overflow: hidden; margin-top: 6px; }
133
- .progress-bar .fill { height: 100%; border-radius: 2px; transition: width 0.3s; }
134
- .progress-bar .fill.blue { background: var(--accent); }
135
- .progress-bar .fill.green { background: var(--green); }
136
- .progress-bar .fill.purple { background: var(--purple); }
137
-
138
- /* Percentile cards */
139
- .percentile-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
140
- .percentile-item { text-align: center; padding: 12px; background: var(--bg-hover); border-radius: 6px; }
141
- .percentile-item .val { font-size: 1.4rem; font-weight: 700; }
142
- .percentile-item .val.p50 { color: var(--accent); }
143
- .percentile-item .val.p95 { color: var(--purple); }
144
- .percentile-item .val.p99 { color: var(--orange); }
145
- .percentile-item .label { font-size: 0.68rem; color: var(--text-muted); text-transform: uppercase; margin-top: 4px; }
146
-
147
- /* Chart containers */
148
- .chart-container { position: relative; height: 200px; }
149
- .chart-container.tall { height: 280px; }
150
- .chart-container.short { height: 160px; }
151
-
152
- /* List items */
153
- .list-item { display: flex; align-items: center; padding: 10px 14px; border-bottom: 1px solid var(--border); gap: 12px; }
154
- .list-item:last-child { border-bottom: none; }
155
- .list-item:hover { background: var(--bg-hover); }
156
- .list-item .icon { width: 32px; height: 32px; border-radius: 6px; background: var(--bg-active); display: flex; align-items: center; justify-content: center; color: var(--text-muted); }
157
- .list-item .content { flex: 1; min-width: 0; }
158
- .list-item .title { font-size: 0.82rem; color: var(--text-primary); font-weight: 500; }
159
- .list-item .sub { font-size: 0.72rem; color: var(--text-muted); }
160
- .list-item .value { font-size: 0.82rem; color: var(--text-primary); font-weight: 600; text-align: right; }
161
-
162
- /* Tags cloud */
163
- .tags-cloud { display: flex; flex-wrap: wrap; gap: 6px; padding: 12px 14px; }
164
-
165
- /* Filters */
166
- .filter-bar { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; padding: 12px 16px; background: var(--bg-hover); border-radius: 6px; margin-bottom: 16px; }
167
- .filter-bar select, .filter-bar input { background: var(--bg-card); border: 1px solid var(--border); color: var(--text-primary); padding: 6px 10px; border-radius: 4px; font-size: 0.8rem; }
168
- .filter-bar select:focus, .filter-bar input:focus { outline: none; border-color: var(--accent); }
169
- .filter-bar label { font-size: 0.78rem; color: var(--text-muted); display: flex; align-items: center; gap: 6px; }
170
-
171
- /* Pagination */
172
- .pagination { display: flex; gap: 8px; align-items: center; font-size: 0.8rem; color: var(--text-secondary); }
173
- .pagination button { background: var(--bg-card); border: 1px solid var(--border); color: var(--text-secondary); padding: 4px 10px; border-radius: 4px; cursor: pointer; }
174
- .pagination button:hover { border-color: var(--accent); }
175
- .pagination button:disabled { opacity: 0.5; cursor: not-allowed; }
176
-
177
- /* Loading */
178
- .loading { text-align: center; padding: 40px; color: var(--text-secondary); }
179
- .loading::after { content: '...'; animation: dots 1.5s steps(4) infinite; }
180
- @keyframes dots { 0%,20% { content: '.'; } 40% { content: '..'; } 60%,100% { content: '...'; } }
181
- .error-msg { color: var(--red); padding: 16px; text-align: center; background: rgba(248, 81, 73, 0.08); border-radius: 6px; margin: 16px; border: 1px solid rgba(248, 81, 73, 0.2); }
182
- .empty-state { text-align: center; padding: 40px; color: var(--text-muted); }
183
- .empty-state svg { width: 40px; height: 40px; margin-bottom: 8px; opacity: 0.5; }
184
-
185
- /* Buttons */
186
- .btn { background: var(--bg-card); border: 1px solid var(--border); color: var(--text-primary); padding: 6px 12px; border-radius: 4px; font-size: 0.8rem; cursor: pointer; transition: all 0.15s; display: inline-flex; align-items: center; gap: 6px; }
187
- .btn:hover { border-color: var(--accent); }
188
- .btn-primary { background: var(--accent); border-color: var(--accent); color: #fff; }
189
- .btn-primary:hover { background: #388bfd; }
190
- .btn-sm { padding: 4px 8px; font-size: 0.72rem; }
191
- .btn-icon { padding: 6px; }
192
-
193
- /* Scrollbar */
194
- ::-webkit-scrollbar { width: 8px; height: 8px; }
195
- ::-webkit-scrollbar-track { background: var(--bg-base); }
196
- ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
197
- ::-webkit-scrollbar-thumb:hover { background: var(--border-light); }
198
-
199
- /* Page views - hidden by default */
200
- .page-view { display: none; }
201
- .page-view.active { display: block; }
202
-
203
- /* Trace Detail */
204
- .trace-detail { }
205
- .trace-detail-header { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; margin-bottom: 16px; }
206
- .trace-meta { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; }
207
- .trace-meta dt { font-size: 0.68rem; color: var(--text-muted); text-transform: uppercase; margin-bottom: 2px; }
208
- .trace-meta dd { font-size: 0.88rem; color: var(--text-primary); }
209
-
210
- /* Tree view */
211
- .tree-view { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.8rem; }
212
- .tree-node { border-left: 2px solid var(--border); margin: 1px 0; padding: 4px 8px 4px 16px; cursor: pointer; transition: background 0.1s; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-height: 28px; }
213
- .tree-node:hover { background: var(--bg-hover); border-left-color: var(--accent); }
214
- .tree-node.error { border-left-color: var(--red); }
215
- .tree-view { font-size: 0.8rem; }
216
- .tree-bar { display: inline-block; height: 14px; border-radius: 2px; margin-right: 8px; vertical-align: middle; min-width: 3px; background: var(--accent); }
217
- .tree-bar.green { background: var(--green); }
218
- .tree-bar.red { background: var(--red); }
219
-
220
- /* Timeline */
221
- .timeline-view { margin-top: 8px; }
222
- .timeline-row { display: flex; align-items: center; height: 24px; font-size: 0.75rem; }
223
- .timeline-label { width: 200px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding-right: 8px; cursor: pointer; }
224
- .timeline-label:hover { color: var(--accent); }
225
- .timeline-track { flex: 1; height: 12px; background: var(--bg-active); border-radius: 3px; position: relative; }
226
- .timeline-bar { position: absolute; top: 1px; height: 10px; border-radius: 2px; min-width: 3px; background: var(--accent); cursor: pointer; }
227
- .timeline-bar.green { background: var(--green); }
228
- .timeline-bar.red { background: var(--red); }
229
-
230
- /* Span detail panel */
231
- .span-detail { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; margin: 8px 0; }
232
- .span-detail h4 { font-size: 0.85rem; color: var(--accent); margin-bottom: 12px; }
233
- .span-detail-grid { display: grid; grid-template-columns: 140px 1fr; gap: 6px 16px; font-size: 0.8rem; }
234
- .span-detail-grid dt { color: var(--text-muted); }
235
- .span-detail-grid dd { color: var(--text-primary); }
236
- .raw-json { background: var(--bg-base); border: 1px solid var(--border); border-radius: 4px; padding: 12px; font-family: 'SF Mono', monospace; font-size: 0.72rem; white-space: pre-wrap; max-height: 250px; overflow: auto; margin-top: 12px; display: none; }
237
-
238
- /* Compare view */
239
- .compare-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); gap: 16px; }
240
- .compare-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; }
241
- .compare-card h3 { font-size: 0.9rem; color: var(--accent); margin-bottom: 12px; }
242
- .compare-row { display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid var(--border); font-size: 0.82rem; }
243
- .compare-row:last-child { border-bottom: none; }
244
- .compare-row .label { color: var(--text-secondary); }
245
- .compare-row .value { color: var(--text-primary); font-weight: 600; }
246
- .compare-row .value.highlight { color: var(--orange); }
247
-
248
- /* Session selector */
249
- .session-selector { margin-bottom: 16px; }
250
- .session-selector select { width: 100%; max-width: 400px; background: var(--bg-card); border: 1px solid var(--border); color: var(--text-primary); padding: 8px 12px; border-radius: 6px; font-size: 0.85rem; }
251
-
252
- /* Tabs */
253
- .tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--border); margin-bottom: 16px; }
254
- .tabs button { background: none; border: none; color: var(--text-secondary); padding: 8px 16px; font-size: 0.82rem; cursor: pointer; border-bottom: 2px solid transparent; }
255
- .tabs button:hover { color: var(--text-primary); }
256
- .tabs button.active { color: var(--accent); border-bottom-color: var(--accent); }
257
-
258
- /* Env badge */
259
- .env-badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.68rem; font-weight: 600; text-transform: uppercase; }
260
- .env-badge.production { background: rgba(63, 185, 80, 0.15); color: var(--green); }
261
- .env-badge.staging { background: rgba(210, 153, 34, 0.15); color: var(--yellow); }
262
- .env-badge.development { background: rgba(88, 166, 255, 0.15); color: var(--accent); }
263
- .env-badge.test { background: rgba(167, 139, 250, 0.15); color: var(--purple); }
264
-
265
- /* Live indicator */
266
- .live-indicator { display: flex; align-items: center; gap: 6px; font-size: 0.78rem; color: var(--green); }
267
- .live-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); animation: pulse 2s infinite; }
268
- @keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } }
269
-
270
- /* Sparkline */
271
- .sparkline { height: 32px; margin-top: 4px; }
272
- </style>
273
- </head>
274
- <body>
275
- <div class="app">
276
- <!-- Sidebar -->
277
- <div class="sidebar">
278
- <div class="sidebar-header">
279
- <div class="sidebar-logo">
280
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
281
- CDH Traces
282
- </div>
283
- </div>
284
- <nav class="sidebar-nav">
285
- <div class="nav-section">Dashboards</div>
286
- <div class="nav-item active" data-page="overview" onclick="switchPage('overview')">
287
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
288
- Overview
289
- </div>
290
- <div class="nav-item" data-page="traces" onclick="switchPage('traces')">
291
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 12h-4l-3 9L9 3l-3 9H2"/></svg>
292
- Traces
293
- </div>
294
- <div class="nav-item" data-page="detail" onclick="switchPage('detail')">
295
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/><path d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/></svg>
296
- Session Detail
297
- </div>
298
- <div class="nav-item" data-page="analytics" onclick="switchPage('analytics')">
299
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 20V10"/><path d="M12 20V4"/><path d="M6 20v-6"/></svg>
300
- Analytics
301
- </div>
302
- <div class="nav-item" data-page="compare" onclick="switchPage('compare')">
303
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 9h6v6H9z"/><path d="M9 3v6M15 3v6M9 15v6M15 15v6M3 9h6M15 9h6M3 15h6M15 15h6"/></svg>
304
- Compare
305
- </div>
306
- <div class="nav-section">Filters</div>
307
- <div class="nav-item" data-page="users" onclick="switchPage('users')">
308
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75"/></svg>
309
- Users & Environments
310
- </div>
311
- <div class="nav-item" data-page="errors" onclick="switchPage('errors')">
312
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M12 8v4M12 16h.01"/></svg>
313
- Errors
314
- </div>
315
- </nav>
316
- </div>
317
-
318
- <!-- Main Content -->
319
- <div class="main">
320
- <!-- Top Bar -->
321
- <div class="topbar">
322
- <div class="topbar-title">Trace <strong>Dashboard</strong></div>
323
- <div class="time-selector">
324
- <button class="active" onclick="setTimeRange('1h')">1H</button>
325
- <button onclick="setTimeRange('6h')">6H</button>
326
- <button onclick="setTimeRange('24h')">24H</button>
327
- <button onclick="setTimeRange('7d')">7D</button>
328
- <button onclick="setTimeRange('30d')">30D</button>
329
- <button onclick="setTimeRange('all')">All</button>
330
- </div>
331
- <button class="refresh-btn" onclick="refreshData()">
332
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M23 4v6h-6M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>
333
- Refresh
334
- </button>
335
- <div class="live-indicator">
336
- <div class="live-dot"></div>
337
- Live
338
- </div>
339
- </div>
340
-
341
- <!-- Content -->
342
- <div class="content">
343
- <!-- Overview Page -->
344
- <div id="page-overview" class="page-view active">
345
- <!-- Stats Row -->
346
- <div class="dashboard" style="margin-bottom: 16px;">
347
- <div class="card col-3">
348
- <div class="stat-card">
349
- <div class="stat-label"><span class="status-dot green"></span>Total Traces</div>
350
- <div class="stat-value accent" id="stat-total">-</div>
351
- <div class="stat-sub" id="stat-today">- today</div>
352
- </div>
353
- </div>
354
- <div class="card col-3">
355
- <div class="stat-card">
356
- <div class="stat-label"><span class="status-dot blue" style="background: var(--purple)"></span>Sessions</div>
357
- <div class="stat-value purple" id="stat-sessions">-</div>
358
- <div class="stat-sub" id="stat-agents">- agents</div>
359
- </div>
360
- </div>
361
- <div class="card col-3">
362
- <div class="stat-card">
363
- <div class="stat-label"><span class="status-dot green"></span>Avg Latency</div>
364
- <div class="stat-value green" id="stat-avg-dur">-</div>
365
- <div class="stat-sub">P95: <span id="stat-p95">-</span></div>
366
- </div>
367
- </div>
368
- <div class="card col-3">
369
- <div class="stat-card">
370
- <div class="stat-label"><span class="status-dot red"></span>Error Rate</div>
371
- <div class="stat-value red" id="stat-error-rate">-</div>
372
- <div class="stat-sub"><span id="stat-error-count">-</span> errors</div>
373
- </div>
374
- </div>
375
- <div class="card col-3">
376
- <div class="stat-card">
377
- <div class="stat-label"><span class="status-dot" style="background: var(--cyan)"></span>Total Tokens</div>
378
- <div class="stat-value" id="stat-tokens">-</div>
379
- <div class="stat-sub" id="stat-token-dist">- in / - out</div>
380
- </div>
381
- </div>
382
- <div class="card col-3">
383
- <div class="stat-card">
384
- <div class="stat-label"><span class="status-dot yellow"></span>Cache Hit Rate</div>
385
- <div class="stat-value yellow" id="stat-cache">-</div>
386
- <div class="stat-sub" id="stat-cached">- cached</div>
387
- </div>
388
- </div>
389
- </div>
390
-
391
- <!-- Charts Row 1 -->
392
- <div class="dashboard" style="margin-bottom: 16px;">
393
- <div class="card col-8">
394
- <div class="card-header">
395
- <div class="card-title"><span class="dot" style="background: var(--accent)"></span>Activity Trend</div>
396
- </div>
397
- <div class="card-body">
398
- <div class="chart-container" id="chart-trend-container"><canvas id="chart-trend"></canvas></div>
399
- </div>
400
- </div>
401
- <div class="card col-4">
402
- <div class="card-header">
403
- <div class="card-title"><span class="dot" style="background: var(--purple)"></span>Latency Percentiles</div>
404
- </div>
405
- <div class="card-body" style="display:flex;flex-direction:column;height:280px;">
406
- <div class="percentile-grid" style="margin-bottom: 12px;flex-shrink:0;">
407
- <div class="percentile-item"><div class="val p50" id="lat-p50">-</div><div class="label">P50</div></div>
408
- <div class="percentile-item"><div class="val p95" id="lat-p95">-</div><div class="label">P95</div></div>
409
- <div class="percentile-item"><div class="val p99" id="lat-p99">-</div><div class="label">P99</div></div>
410
- </div>
411
- <div style="flex:1;min-height:0;position:relative;">
412
- <canvas id="chart-latency-bar"></canvas>
413
- </div>
414
- </div>
415
- </div>
416
- </div>
417
-
418
- <!-- Charts Row 2 -->
419
- <div class="dashboard" style="margin-bottom: 16px;">
420
- <div class="card col-4">
421
- <div class="card-header">
422
- <div class="card-title"><span class="dot" style="background: var(--green)"></span>Type Distribution</div>
423
- </div>
424
- <div class="card-body">
425
- <div class="chart-container short"><canvas id="chart-type"></canvas></div>
426
- </div>
427
- </div>
428
- <div class="card col-4">
429
- <div class="card-header">
430
- <div class="card-title"><span class="dot" style="background: var(--orange)"></span>Agent Activity</div>
431
- </div>
432
- <div class="card-body">
433
- <div class="chart-container short"><canvas id="chart-agent"></canvas></div>
434
- </div>
435
- </div>
436
- <div class="card col-4">
437
- <div class="card-header">
438
- <div class="card-title"><span class="dot" style="background: var(--cyan)"></span>Top Models</div>
439
- </div>
440
- <div class="card-body no-padding">
441
- <table class="data-table">
442
- <thead><tr><th>Model</th><th>Spans</th><th>Tokens</th></tr></thead>
443
- <tbody id="top-models-body"><tr><td colspan="3" class="loading">-</td></tr></tbody>
444
- </table>
445
- </div>
446
- </div>
447
- </div>
448
-
449
- <!-- Recent Traces -->
450
- <div class="card">
451
- <div class="card-header">
452
- <div class="card-title"><span class="dot" style="background: var(--yellow)"></span>Recent Traces</div>
453
- </div>
454
- <div class="card-body no-padding">
455
- <table class="data-table">
456
- <thead><tr><th>Time</th><th>Type</th><th>Function</th><th>Duration</th><th>Agent</th><th>Model</th><th>Status</th></tr></thead>
457
- <tbody id="recent-traces-body"><tr><td colspan="7" class="loading">Loading...</td></tr></tbody>
458
- </table>
459
- </div>
460
- <div class="card-footer" style="text-align: center;">
461
- <button class="btn btn-sm" onclick="switchPage('traces')">View All Traces</button>
462
- </div>
463
- </div>
464
- </div>
465
-
466
- <!-- Traces Page -->
467
- <div id="page-traces" class="page-view">
468
- <div class="filter-bar">
469
- <label>Type:</label><select id="f-type" onchange="loadTraces()"><option value="">All</option><option>ACP</option><option>ACP_EVENT</option><option>LIFECYCLE</option><option>GENERATION</option><option>TOOL</option></select>
470
- <label>Agent:</label><select id="f-agent" onchange="loadTraces()"><option value="">All</option></select>
471
- <label>Model:</label><select id="f-model" onchange="loadTraces()"><option value="">All</option></select>
472
- <label>Status:</label><select id="f-status" onchange="loadTraces()"><option value="">All</option><option>success</option><option>error</option><option>completed</option><option>failed</option></select>
473
- <label>Env:</label><select id="f-env" onchange="loadTraces()"><option value="">All</option><option>production</option><option>staging</option><option>development</option></select>
474
- <span style="flex:1"></span>
475
- <button class="btn btn-sm" onclick="exportTraces('json')">Export JSON</button>
476
- <button class="btn btn-sm" onclick="exportTraces('csv')">Export CSV</button>
477
- </div>
478
- <div class="card">
479
- <div class="card-body no-padding">
480
- <table class="data-table">
481
- <thead><tr><th>Time</th><th>Type</th><th>Function</th><th>Duration</th><th>Agent</th><th>Model</th><th>Status</th><th>Session</th></tr></thead>
482
- <tbody id="traces-body"><tr><td colspan="8" class="loading">Loading...</td></tr></tbody>
483
- </table>
484
- </div>
485
- <div class="card-footer">
486
- <div class="pagination" id="traces-pagination"></div>
487
- </div>
488
- </div>
489
- </div>
490
-
491
- <!-- Detail Page -->
492
- <div id="page-detail" class="page-view">
493
- <div class="session-selector">
494
- <label>Session:</label>
495
- <select id="detail-session" onchange="loadSessionDetail()"><option value="">— Select a session —</option></select>
496
- </div>
497
- <div id="detail-content"></div>
498
- </div>
499
-
500
- <!-- Analytics Page -->
501
- <div id="page-analytics" class="page-view">
502
- <div class="dashboard">
503
- <div class="card col-6">
504
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--purple)"></span>Model Performance</div></div>
505
- <div class="card-body no-padding">
506
- <table class="data-table">
507
- <thead><tr><th>Model</th><th>Spans</th><th>Tokens</th><th>Avg Duration</th><th>Success Rate</th></tr></thead>
508
- <tbody id="analytics-models"><tr><td colspan="5" class="loading">Loading...</td></tr></tbody>
509
- </table>
510
- </div>
511
- </div>
512
- <div class="card col-6">
513
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--orange)"></span>Tool Usage</div></div>
514
- <div class="card-body">
515
- <div class="chart-container"><canvas id="chart-tools"></canvas></div>
516
- </div>
517
- </div>
518
- <div class="card col-12">
519
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--accent)"></span>Latency vs Tokens Scatter</div></div>
520
- <div class="card-body">
521
- <div class="chart-container tall"><canvas id="chart-scatter"></canvas></div>
522
- </div>
523
- </div>
524
- <div class="card col-6">
525
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--green)"></span>Latency Distribution</div></div>
526
- <div class="card-body">
527
- <div class="chart-container"><canvas id="chart-latency-hist"></canvas></div>
528
- </div>
529
- </div>
530
- <div class="card col-6">
531
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--cyan)"></span>Coding Efficiency</div></div>
532
- <div class="card-body" id="analytics-loc"><div class="loading">Loading...</div></div>
533
- </div>
534
- </div>
535
- </div>
536
-
537
- <!-- Compare Page -->
538
- <div id="page-compare" class="page-view">
539
- <div class="filter-bar" style="margin-bottom: 16px;">
540
- <label>Select sessions to compare:</label>
541
- </div>
542
- <div class="comp-select" id="compare-sessions" style="margin-bottom: 16px;"></div>
543
- <button class="btn btn-primary" onclick="doCompare()" style="margin-bottom: 16px;">Compare Selected</button>
544
- <div id="compare-results"></div>
545
- </div>
546
-
547
- <!-- Users Page -->
548
- <div id="page-users" class="page-view">
549
- <div class="dashboard">
550
- <div class="card col-4">
551
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--accent)"></span>Environments</div></div>
552
- <div class="card-body no-padding">
553
- <table class="data-table">
554
- <thead><tr><th>Environment</th><th>Count</th><th>Error Rate</th></tr></thead>
555
- <tbody id="env-body"><tr><td colspan="3" class="loading">Loading...</td></tr></tbody>
556
- </table>
557
- </div>
558
- </div>
559
- <div class="card col-8">
560
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--purple)"></span>Top Tags</div></div>
561
- <div class="card-body no-padding">
562
- <div class="tags-cloud" id="tags-cloud"><div class="loading">Loading...</div></div>
563
- </div>
564
- </div>
565
- <div class="card col-12">
566
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--green)"></span>User Statistics</div></div>
567
- <div class="card-body no-padding">
568
- <table class="data-table">
569
- <thead><tr><th>User ID</th><th>Traces</th><th>Sessions</th><th>Total Tokens</th></tr></thead>
570
- <tbody id="users-body"><tr><td colspan="4" class="loading">Loading...</td></tr></tbody>
571
- </table>
572
- </div>
573
- </div>
574
- </div>
575
- </div>
576
-
577
- <!-- Errors Page -->
578
- <div id="page-errors" class="page-view">
579
- <div class="card">
580
- <div class="card-header"><div class="card-title"><span class="dot" style="background: var(--red)"></span>Error Summary</div></div>
581
- <div class="card-body no-padding">
582
- <table class="data-table">
583
- <thead><tr><th>Error</th><th>Count</th><th>Latest</th><th>Session</th></tr></thead>
584
- <tbody id="errors-body"><tr><td colspan="4" class="loading">Loading...</td></tr></tbody>
585
- </table>
586
- </div>
587
- </div>
588
- </div>
589
- </div>
590
- </div>
591
- </div>
592
-
593
- <script>
594
- let CHARTS = {};
595
- let STATE = {
596
- currentPage: 'overview',
597
- timeRange: '24h',
598
- tracesPage: 0,
599
- tracesTotal: 0,
600
- sessions: [],
601
- };
602
-
603
- function escape(s) { return String(s ?? '').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'); }
604
-
605
- function fmtDur(s) {
606
- if (s == null || s === 0) return '-';
607
- s = Number(s);
608
- if (s < 1) return (s * 1000).toFixed(0) + 'ms';
609
- if (s < 60) return s.toFixed(1) + 's';
610
- return Math.floor(s / 60) + 'm ' + (s % 60).toFixed(0) + 's';
611
- }
612
-
613
- function fmtNum(n) {
614
- if (n == null || n === 0) return '0';
615
- if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';
616
- if (n >= 1000) return Math.round(n).toLocaleString();
617
- return String(n);
618
- }
619
-
620
- function fmtDate(ts) {
621
- if (!ts) return '-';
622
- let d = new Date(ts);
623
- return d.toLocaleDateString() + ' ' + d.toLocaleTimeString();
624
- }
625
-
626
- function fmtTime(ts) {
627
- if (!ts) return '-';
628
- let d = new Date(ts);
629
- return d.toLocaleTimeString() + '.' + String(d.getMilliseconds()).padStart(3, '0');
630
- }
631
-
632
- function badge(type) {
633
- if (!type) return '<span class="badge badge-gray">-</span>';
634
- let cls = 'badge-' + type.toLowerCase().replace(/[^a-z0-9]/g, '_');
635
- return `<span class="badge ${cls}">${escape(type)}</span>`;
636
- }
637
-
638
- function api(path) { return fetch(path).then(r => r.json()).then(d => { if (d.status === 'error') throw new Error(d.error); return d.data; }); }
639
-
640
- function destroyCharts() { for (let k in CHARTS) { CHARTS[k].destroy(); delete CHARTS[k]; } }
641
-
642
- function switchPage(page) {
643
- STATE.currentPage = page;
644
- document.querySelectorAll('.page-view').forEach(p => p.classList.remove('active'));
645
- document.querySelectorAll('.nav-item').forEach(n => n.classList.remove('active'));
646
- document.getElementById('page-' + page).classList.add('active');
647
- document.querySelector(`.nav-item[data-page="${page}"]`).classList.add('active');
648
- loadPage(page);
649
- }
650
-
651
- function setTimeRange(range) {
652
- STATE.timeRange = range;
653
- document.querySelectorAll('.time-selector button').forEach(b => b.classList.remove('active'));
654
- event.target.classList.add('active');
655
- loadPage(STATE.currentPage);
656
- }
657
-
658
- function getTimeRange() {
659
- let now = new Date();
660
- let start = new Date(0);
661
- switch (STATE.timeRange) {
662
- case '1h': start = new Date(now - 60 * 60 * 1000); break;
663
- case '6h': start = new Date(now - 6 * 60 * 60 * 1000); break;
664
- case '24h': start = new Date(now - 24 * 60 * 60 * 1000); break;
665
- case '7d': start = new Date(now - 7 * 24 * 60 * 60 * 1000); break;
666
- case '30d': start = new Date(now - 30 * 24 * 60 * 60 * 1000); break;
667
- case 'all': start = new Date(0); break;
668
- default: start = new Date(now - 24 * 60 * 60 * 1000);
669
- }
670
- return {
671
- start: start.toISOString().slice(0, 19),
672
- end: now.toISOString().slice(0, 19)
673
- };
674
- }
675
-
676
- function refreshData() {
677
- let btn = document.querySelector('.refresh-btn');
678
- btn.classList.add('loading');
679
- loadPage(STATE.currentPage);
680
- setTimeout(() => btn.classList.remove('loading'), 500);
681
- }
682
-
683
- async function loadPage(page) {
684
- switch(page) {
685
- case 'overview': await loadOverview(); break;
686
- case 'traces': await loadTraces(); break;
687
- case 'detail': await loadDetailPage(); break;
688
- case 'analytics': await loadAnalytics(); break;
689
- case 'compare': await loadComparePage(); break;
690
- case 'users': await loadUsers(); break;
691
- case 'errors': await loadErrors(); break;
692
- }
693
- }
694
-
695
- /* ─── Overview ─── */
696
- async function loadOverview() {
697
- try {
698
- let tr = getTimeRange();
699
- let d = await api('/api/overview?start=' + encodeURIComponent(tr.start) + '&end=' + encodeURIComponent(tr.end));
700
- document.getElementById('stat-total').textContent = fmtNum(d.total);
701
- document.getElementById('stat-today').textContent = fmtNum(d.total_today) + ' today';
702
- document.getElementById('stat-sessions').textContent = fmtNum(d.sessions);
703
- document.getElementById('stat-agents').textContent = fmtNum(d.agents) + ' agents';
704
- document.getElementById('stat-avg-dur').textContent = fmtDur(d.avg_duration);
705
- document.getElementById('stat-p95').textContent = fmtDur(d.p95_duration);
706
- document.getElementById('stat-error-rate').textContent = d.error_rate + '%';
707
- document.getElementById('stat-error-count').textContent = d.error_count;
708
- document.getElementById('stat-tokens').textContent = fmtNum(d.total_tokens);
709
- document.getElementById('stat-token-dist').textContent = fmtNum(d.input_tokens) + ' in / ' + fmtNum(d.output_tokens) + ' out';
710
- document.getElementById('stat-cache').textContent = d.cache_hit_rate + '%';
711
- document.getElementById('stat-cached').textContent = fmtNum(d.cached_tokens) + ' cached';
712
-
713
- document.getElementById('lat-p50').textContent = fmtDur(d.p50_duration);
714
- document.getElementById('lat-p95').textContent = fmtDur(d.p95_duration);
715
- document.getElementById('lat-p99').textContent = fmtDur(d.p99_duration);
716
-
717
- // Trend chart
718
- let hourly = d.hourly || [];
719
- let ctx = document.getElementById('chart-trend').getContext('2d');
720
- CHARTS['trend'] = new Chart(ctx, {
721
- type: 'line',
722
- data: {
723
- labels: hourly.map(h => { let p = h.bucket.indexOf('T'); return h.bucket.slice(p+1, p+6); }),
724
- datasets: [{ label: 'Spans', data: hourly.map(h => h.count), borderColor: '#58a6ff', backgroundColor: 'rgba(88,166,255,0.1)', fill: true, tension: 0.4, pointRadius: 2 }]
725
- },
726
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { x: { grid: { color: '#30363d' }, ticks: { color: '#8b949e', maxTicksLimit: 12 } }, y: { grid: { color: '#30363d' }, ticks: { color: '#8b949e' }, beginAtZero: true } } }
727
- });
728
-
729
- // Latency bar
730
- ctx = document.getElementById('chart-latency-bar').getContext('2d');
731
- CHARTS['latbar'] = new Chart(ctx, {
732
- type: 'bar',
733
- data: { labels: ['P50', 'P95', 'P99'], datasets: [{ data: [d.p50_duration || 0, d.p95_duration || 0, d.p99_duration || 0], backgroundColor: ['#58a6ff', '#a78bfa', '#f78166'], borderRadius: 4 }] },
734
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { x: { grid: { display: false } }, y: { grid: { color: '#30363d' }, ticks: { color: '#8b949e' }, beginAtZero: true } } }
735
- });
736
-
737
- // Type chart
738
- let typeLabels = Object.keys(d.type_distribution || {});
739
- let typeData = Object.values(d.type_distribution || {});
740
- let typeColors = { ACP: '#58a6ff', ACP_EVENT: '#3fb950', LIFECYCLE: '#d29922', GENERATION: '#a78bfa', TOOL: '#f78166', EVENT: '#39d353' };
741
- ctx = document.getElementById('chart-type').getContext('2d');
742
- CHARTS['type'] = new Chart(ctx, {
743
- type: 'doughnut',
744
- data: { labels: typeLabels, datasets: [{ data: typeData, backgroundColor: typeLabels.map(l => typeColors[l] || '#8b949e'), borderWidth: 0 }] },
745
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'right', labels: { color: '#8b949e', padding: 8 } } } }
746
- });
747
-
748
- // Agent chart
749
- let agents = d.agent_breakdown || [];
750
- ctx = document.getElementById('chart-agent').getContext('2d');
751
- CHARTS['agent'] = new Chart(ctx, {
752
- type: 'bar',
753
- data: { labels: agents.slice(0, 8).map(a => a.agent), datasets: [{ label: 'Spans', data: agents.slice(0, 8).map(a => a.count), backgroundColor: '#f78166', borderRadius: 4 }] },
754
- options: { responsive: true, maintainAspectRatio: false, indexAxis: 'y', plugins: { legend: { display: false } }, scales: { x: { grid: { color: '#30363d' }, ticks: { color: '#8b949e' }, beginAtZero: true }, y: { grid: { display: false }, ticks: { color: '#8b949e' } } } }
755
- });
756
-
757
- // Top models
758
- let models = d.model_breakdown || [];
759
- document.getElementById('top-models-body').innerHTML = models.slice(0, 5).map(m => `<tr><td>${escape(m.model)}</td><td>${fmtNum(m.count)}</td><td>${fmtNum(m.total_tokens)}</td></tr>`).join('') || '<tr><td colspan="3" class="empty-state">No data</td></tr>';
760
-
761
- // Recent traces
762
- let traces = await api('/api/traces?limit=10');
763
- document.getElementById('recent-traces-body').innerHTML = (traces.traces || []).map(t => {
764
- let tags = t.tags || {}; let data = t.data || {};
765
- let status = data.status;
766
- let badge = status === 'success' || status === 'completed' ? 'badge-green' : status === 'error' || status === 'failed' ? 'badge-red' : 'badge-gray';
767
- return `<tr onclick="goDetail('${escape(t.session_id || '')}')" style="cursor:pointer">
768
- <td>${fmtDate(t.timestamp).split(' ')[1]}</td>
769
- <td><span class="badge badge-blue">${escape(t.type || '')}</span></td>
770
- <td class="truncate">${escape(t.function || '')}</td>
771
- <td>${fmtDur(data.duration_ms)}</td>
772
- <td>${escape(typeof tags.agent === 'string' ? tags.agent : '')}</td>
773
- <td class="truncate">${escape(data.kwargs?.model || data.model || tags.model || '')}</td>
774
- <td><span class="badge ${badge}">${escape(status || '')}</span></td>
775
- </tr>`;
776
- }).join('') || '<tr><td colspan="7" class="empty-state">No traces</td></tr>';
777
-
778
- } catch(e) { console.error(e); }
779
- }
780
-
781
- function goDetail(sessionId) { if (sessionId) { switchPage('detail'); document.getElementById('detail-session').value = sessionId; loadSessionDetail(); } }
782
-
783
- /* ─── Traces ─── */
784
- async function loadTraces() {
785
- try {
786
- let type = document.getElementById('f-type')?.value || '';
787
- let agent = document.getElementById('f-agent')?.value || '';
788
- let model = document.getElementById('f-model')?.value || '';
789
- let status = document.getElementById('f-status')?.value || '';
790
- let env = document.getElementById('f-env')?.value || '';
791
-
792
- let qs = `limit=50&offset=${STATE.tracesPage * 50}`;
793
- if (type) qs += `&type=${encodeURIComponent(type)}`;
794
- if (agent) qs += `&agent=${encodeURIComponent(agent)}`;
795
- if (model) qs += `&model=${encodeURIComponent(model)}`;
796
- if (status) qs += `&status=${encodeURIComponent(status)}`;
797
- if (env) qs += `&env=${encodeURIComponent(env)}`;
798
-
799
- let d = await api('/api/traces?' + qs);
800
- STATE.tracesTotal = d.total;
801
- let traces = d.traces || [];
802
-
803
- document.getElementById('traces-body').innerHTML = traces.map(t => {
804
- let tags = t.tags || {}; let data = t.data || {};
805
- let status = data.status;
806
- let badge = status === 'success' || status === 'completed' ? 'badge-green' : status === 'error' || status === 'failed' ? 'badge-red' : 'badge-gray';
807
- return `<tr onclick="goDetail('${escape(t.session_id || '')}')" style="cursor:pointer">
808
- <td>${fmtDate(t.timestamp)}</td>
809
- <td><span class="badge badge-blue">${escape(t.type || '')}</span></td>
810
- <td class="truncate">${escape(t.function || '')}</td>
811
- <td>${fmtDur(data.duration_ms)}</td>
812
- <td>${escape(typeof tags.agent === 'string' ? tags.agent : '')}</td>
813
- <td class="truncate">${escape(data.kwargs?.model || data.model || tags.model || '')}</td>
814
- <td><span class="badge ${badge}">${escape(status || '')}</span></td>
815
- <td class="truncate">${escape((t.session_id || '').slice(0, 20))}</td>
816
- </tr>`;
817
- }).join('') || '<tr><td colspan="8" class="empty-state">No traces match filters</td></tr>';
818
-
819
- let totalPages = Math.ceil(STATE.tracesTotal / 50);
820
- document.getElementById('traces-pagination').innerHTML = `
821
- <button ${STATE.tracesPage <= 0 ? 'disabled' : ''} onclick="STATE.tracesPage--;loadTraces()">Previous</button>
822
- <span>Page ${STATE.tracesPage + 1} of ${totalPages || 1} (${STATE.tracesTotal.toLocaleString()} total)</span>
823
- <button ${STATE.tracesPage >= totalPages - 1 ? 'disabled' : ''} onclick="STATE.tracesPage++;loadTraces()">Next</button>
824
- `;
825
-
826
- } catch(e) { console.error(e); }
827
- }
828
-
829
- function exportTraces(fmt) {
830
- let type = document.getElementById('f-type')?.value || '';
831
- let qs = `format=${fmt}&limit=500`;
832
- if (type) qs += `&type=${encodeURIComponent(type)}`;
833
- window.open('/api/export?' + qs, '_blank');
834
- }
835
-
836
- /* ─── Detail ─── */
837
- async function loadDetailPage() {
838
- try {
839
- let sessions = await api('/api/sessions?limit=500');
840
- STATE.sessions = sessions.sessions || [];
841
- let sel = document.getElementById('detail-session');
842
- sel.innerHTML = '<option value="">— Select a session —</option>' +
843
- STATE.sessions.map(s => `<option value="${escape(s.session_id)}">${escape((s.session_id || '').slice(0, 30))}… (${(s.agents || []).join(',')}, ${s.span_count} spans)</option>`).join('');
844
- } catch(e) { console.error(e); }
845
- }
846
-
847
- async function loadSessionDetail() {
848
- let sessionId = document.getElementById('detail-session').value;
849
- let el = document.getElementById('detail-content');
850
- if (!sessionId) { el.innerHTML = ''; return; }
851
-
852
- el.innerHTML = '<div class="loading">Loading session...</div>';
853
- try {
854
- let d = await api('/api/sessions/' + encodeURIComponent(sessionId));
855
- let s = d.stats || {};
856
- let spans = d.spans || [];
857
- let tree = d.tree || [];
858
- window._spans = spans;
859
- window._sessionTree = tree;
860
- window._sessionStats = s;
861
-
862
- // Collect all tags from all spans
863
- let allTags = {};
864
- spans.forEach(sp => {
865
- let tags = sp.tags || {};
866
- Object.keys(tags).forEach(k => { if (tags[k]) allTags[k] = allTags[k] || []; if (!allTags[k].includes(tags[k])) allTags[k].push(tags[k]); });
867
- });
868
-
869
- // Token breakdown
870
- let totalTokens = s.total_tokens || 0;
871
- let inputTokens = spans.reduce((sum, sp) => sum + (sp.data?.input_tokens || 0), 0);
872
- let outputTokens = spans.reduce((sum, sp) => sum + (sp.data?.output_tokens || 0), 0);
873
- let cachedTokens = spans.reduce((sum, sp) => sum + (sp.data?.cached_input_tokens || 0), 0);
874
-
875
- // Model usage
876
- let modelsUsed = [...new Set(spans.filter(sp => sp.data?.kwargs?.model || sp.data?.model || sp.tags?.model).map(sp => sp.data?.kwargs?.model || sp.data?.model || sp.tags?.model))];
877
-
878
- // Agent usage
879
- let agentsUsed = [...new Set(spans.map(sp => sp.tags?.agent).filter(Boolean))];
880
-
881
- let html = `
882
- <!-- Session Header Stats -->
883
- <div class="dashboard" style="margin-bottom:16px;">
884
- <div class="card col-3">
885
- <div class="stat-card">
886
- <div class="stat-label">Duration</div>
887
- <div class="stat-value accent">${fmtDur(s.duration_ms)}</div>
888
- <div class="stat-sub">${spans.length} spans</div>
889
- </div>
890
- </div>
891
- <div class="card col-3">
892
- <div class="stat-card">
893
- <div class="stat-label">Total Tokens</div>
894
- <div class="stat-value">${totalTokens.toLocaleString()}</div>
895
- <div class="stat-sub">${inputTokens.toLocaleString()} in / ${outputTokens.toLocaleString()} out</div>
896
- </div>
897
- </div>
898
- <div class="card col-3">
899
- <div class="stat-card">
900
- <div class="stat-label">Cache Hit Rate</div>
901
- <div class="stat-value yellow">${inputTokens > 0 ? Math.round(cachedTokens/inputTokens*100) : 0}%</div>
902
- <div class="stat-sub">${cachedTokens.toLocaleString()} cached</div>
903
- </div>
904
- </div>
905
- <div class="card col-3">
906
- <div class="stat-card">
907
- <div class="stat-label">Errors</div>
908
- <div class="stat-value ${s.error_count > 0 ? 'red' : 'green'}">${s.error_count || 0}</div>
909
- <div class="stat-sub">${s.error_count > 0 ? 'Issues detected' : 'No errors'}</div>
910
- </div>
911
- </div>
912
- </div>
913
-
914
- <!-- Session Meta Info -->
915
- <div class="card" style="margin-bottom:16px;">
916
- <div class="card-header"><div class="card-title">Session Info</div></div>
917
- <div class="card-body">
918
- <div class="trace-meta" style="grid-template-columns:repeat(4, 1fr);">
919
- <div><dt>Session ID</dt><dd><code style="font-size:0.75rem">${escape(sessionId)}</code></dd></div>
920
- <div><dt>Start Time</dt><dd>${fmtDate(s.first_ts)}</dd></div>
921
- <div><dt>End Time</dt><dd>${fmtDate(s.last_ts)}</dd></div>
922
- <div><dt>Lines Added</dt><dd>${(s.lines_added || 0).toLocaleString()}</dd></div>
923
- </div>
924
- </div>
925
- </div>
926
-
927
- <!-- Models & Agents -->
928
- <div class="dashboard" style="margin-bottom:16px;">
929
- <div class="card col-6">
930
- <div class="card-header"><div class="card-title">Models Used <span class="badge badge-blue">${modelsUsed.length}</span></div></div>
931
- <div class="card-body no-padding">
932
- <table class="data-table">
933
- <thead><tr><th>Model</th><th>Spans</th><th>Total Tokens</th></tr></thead>
934
- <tbody>
935
- ${modelsUsed.map(m => {
936
- let modelSpans = spans.filter(sp => (sp.data?.kwargs?.model || sp.data?.model || sp.tags?.model) === m);
937
- let modelTokens = modelSpans.reduce((sum, sp) => sum + (sp.data?.kwargs?.token_count || sp.data?.token_count || 0), 0);
938
- return `<tr><td><strong>${escape(m)}</strong></td><td>${modelSpans.length}</td><td>${modelTokens.toLocaleString()}</td></tr>`;
939
- }).join('')}
940
- </tbody>
941
- </table>
942
- </div>
943
- </div>
944
- <div class="card col-6">
945
- <div class="card-header"><div class="card-title">Agents <span class="badge badge-purple">${agentsUsed.length}</span></div></div>
946
- <div class="card-body no-padding">
947
- <table class="data-table">
948
- <thead><tr><th>Agent</th><th>Spans</th></tr></thead>
949
- <tbody>
950
- ${agentsUsed.map(a => {
951
- let agentSpans = spans.filter(sp => sp.tags?.agent === a);
952
- return `<tr><td><strong>${escape(a)}</strong></td><td>${agentSpans.length}</td></tr>`;
953
- }).join('')}
954
- </tbody>
955
- </table>
956
- </div>
957
- </div>
958
- </div>
959
-
960
- <!-- Tags -->
961
- ${Object.keys(allTags).length > 0 ? `
962
- <div class="card" style="margin-bottom:16px;">
963
- <div class="card-header"><div class="card-title">Tags & Attributes</div></div>
964
- <div class="card-body">
965
- <div style="display:flex;flex-wrap:wrap;gap:8px;">
966
- ${Object.entries(allTags).map(([k, vals]) => vals.map(v => `<span class="badge badge-tag">${escape(k)}=${escape(String(v).slice(0,50))}</span>`).join('')).join('')}
967
- </div>
968
- </div>
969
- </div>
970
- ` : ''}
971
-
972
- <!-- Tabs -->
973
- <div class="tabs">
974
- <button class="active" onclick="showDetailTab('tree', this)">Call Tree</button>
975
- <button onclick="showDetailTab('timeline', this)">Timeline</button>
976
- <button onclick="showDetailTab('spans', this)">Spans List</button>
977
- <button onclick="showDetailTab('errors', this)">Errors (${s.error_count || 0})</button>
978
- </div>
979
-
980
- <!-- Tab Content -->
981
- <div id="detail-tab-tree" class="detail-tab">
982
- <div class="card">
983
- <div class="card-header"><div class="card-title">Call Tree</div></div>
984
- <div class="card-body" style="max-height:500px;overflow-y:auto;">
985
- <div class="tree-view" id="call-tree">${renderTree(tree, s.duration_ms || 1, 0)}</div>
986
- </div>
987
- </div>
988
- </div>
989
-
990
- <div id="detail-tab-timeline" class="detail-tab" style="display:none;">
991
- <div class="card">
992
- <div class="card-header"><div class="card-title">Timeline</div></div>
993
- <div class="card-body" style="max-height:500px;overflow-y:auto;">${renderTimeline(tree, s)}</div>
994
- </div>
995
- </div>
996
-
997
- <div id="detail-tab-spans" class="detail-tab" style="display:none;">
998
- <div class="card">
999
- <div class="card-header"><div class="card-title">All Spans <span style="font-weight:normal;color:var(--text-muted)">(${spans.length})</span></div></div>
1000
- <div class="card-body no-padding" style="max-height:600px;overflow-y:auto;">
1001
- <table class="data-table">
1002
- <thead><tr><th>Time</th><th>Type</th><th>Function</th><th>Duration</th><th>Tokens</th><th>Status</th></tr></thead>
1003
- <tbody>
1004
- ${spans.map(sp => {
1005
- let data = sp.data || {};
1006
- let isError = data.status === 'error' || data.status === 'failed' || data.error;
1007
- return `<tr class="clickable" onclick="toggleSpanDetail('${escape(sp.id || '')}')">
1008
- <td>${fmtTime(sp.timestamp)}</td>
1009
- <td>${badge(sp.type)}</td>
1010
- <td class="truncate">${escape(sp.function || '')}</td>
1011
- <td>${fmtDur(data.duration_ms)}</td>
1012
- <td>${(data.token_count || 0).toLocaleString()}</td>
1013
- <td>${isError ? '<span class="badge badge-red">Error</span>' : '<span class="badge badge-green">OK</span>'}</td>
1014
- </tr>
1015
- <tr id="span-row-${escape(sp.id || '')}" style="display:none;"><td colspan="6" style="padding:12px 16px;background:var(--bg-hover);">
1016
- <div class="span-detail" style="margin:0;">
1017
- <h4>${escape(sp.function || '')}</h4>
1018
- <dl class="span-detail-grid">
1019
- <dt>ID</dt><dd><code>${escape(sp.id || '')}</code></dd>
1020
- <dt>Type</dt><dd>${badge(sp.type)}</dd>
1021
- <dt>Timestamp</dt><dd>${escape(sp.timestamp || '')}</dd>
1022
- <dt>Duration</dt><dd>${fmtDur(data.duration_ms)}</dd>
1023
- ${data.model ? `<dt>Model</dt><dd>${escape(data.model)}</dd>` : ''}
1024
- ${data.token_count ? `<dt>Tokens</dt><dd>${data.token_count.toLocaleString()}</dd>` : ''}
1025
- ${data.input_tokens ? `<dt>Input Tokens</dt><dd>${data.input_tokens.toLocaleString()}</dd>` : ''}
1026
- ${data.output_tokens ? `<dt>Output Tokens</dt><dd>${data.output_tokens.toLocaleString()}</dd>` : ''}
1027
- ${data.cached_input_tokens ? `<dt>Cached Input</dt><dd>${data.cached_input_tokens.toLocaleString()}</dd>` : ''}
1028
- ${data.tool_name ? `<dt>Tool</dt><dd>${escape(data.tool_name)}</dd>` : ''}
1029
- ${data.tool_kind ? `<dt>Tool Kind</dt><dd>${escape(data.tool_kind)}</dd>` : ''}
1030
- ${data.status ? `<dt>Status</dt><dd>${data.status}</dd>` : ''}
1031
- ${data.cost_amount ? `<dt>Cost</dt><dd>${data.cost_amount} ${escape(data.cost_currency || '')}</dd>` : ''}
1032
- ${sp.tags?.agent ? `<dt>Agent</dt><dd>${escape(sp.tags.agent)}</dd>` : ''}
1033
- ${sp.tags?.user_id ? `<dt>User</dt><dd>${escape(sp.tags.user_id)}</dd>` : ''}
1034
- ${sp.tags?.environment ? `<dt>Environment</dt><dd>${escape(sp.tags.environment)}</dd>` : ''}
1035
- ${data.error ? `<dt>Error</dt><dd style="color:var(--red)">${escape(data.error)}</dd>` : ''}
1036
- </dl>
1037
- </div>
1038
- </td></tr>`;
1039
- }).join('')}
1040
- </tbody>
1041
- </table>
1042
- </div>
1043
- </div>
1044
- </div>
1045
-
1046
- <div id="detail-tab-errors" class="detail-tab" style="display:none;">
1047
- <div class="card">
1048
- <div class="card-header"><div class="card-title">Errors <span class="badge badge-red">${s.error_count || 0}</span></div></div>
1049
- <div class="card-body no-padding">
1050
- ${(s.errors || []).length > 0 ? `<table class="data-table">
1051
- <thead><tr><th>Function</th><th>Error</th></tr></thead>
1052
- <tbody>
1053
- ${s.errors.map(e => `<tr><td><strong>${escape(e.function || '')}</strong></td><td style="color:var(--red)">${escape(String(e.error || '').slice(0, 200))}</td></tr>`).join('')}
1054
- </tbody>
1055
- </table>` : '<div class="empty-state"><p>No errors in this session</p></div>'}
1056
- </div>
1057
- </div>
1058
- </div>
1059
- `;
1060
-
1061
- el.innerHTML = html;
1062
- } catch(e) { el.innerHTML = `<div class="error-msg">${escape(e.message)}</div>`; }
1063
- }
1064
-
1065
- function showDetailTab(tab, btn) {
1066
- document.querySelectorAll('.detail-tab').forEach(el => el.style.display = 'none');
1067
- document.querySelectorAll('#page-detail .tabs button').forEach(b => b.classList.remove('active'));
1068
- document.getElementById('detail-tab-' + tab).style.display = 'block';
1069
- btn.classList.add('active');
1070
- }
1071
-
1072
- function toggleSpanDetail(spanId) {
1073
- let el = document.getElementById('span-row-' + spanId);
1074
- if (!el) return;
1075
- el.style.display = el.style.display === 'none' ? 'table-row' : 'none';
1076
- }
1077
-
1078
- function renderTree(nodes, totalMs, depth) {
1079
- if (!nodes || !nodes.length) return '';
1080
- return nodes.map(n => {
1081
- let data = n.data || {};
1082
- let tags = n.tags || {};
1083
- let dur = data.duration_ms || 0;
1084
- let pct = totalMs > 0 ? (dur / totalMs * 100) : 0;
1085
- let hasChildren = n.children && n.children.length;
1086
- let isError = data.status === 'error' || data.status === 'failed' || data.error;
1087
- let barColor = n.type === 'ACP_EVENT' ? 'green' : isError ? 'red' : '';
1088
- let typeColor = n.type === 'ACP' ? 'badge-blue' : n.type === 'ACP_EVENT' ? 'badge-green' : n.type === 'LIFECYCLE' ? 'badge-yellow' : 'badge-gray';
1089
- let typeBadge = n.type ? `<span class="badge ${typeColor}" style="font-size:0.6rem;padding:1px 4px;flex-shrink:0;">${escape(n.type || '')}</span>` : '';
1090
- let toolBadge = data.tool_name ? `<span class="badge badge-orange" style="font-size:0.58rem;padding:1px 4px;flex-shrink:0;" title="${escape(data.tool_name)}">${escape(data.tool_name.slice(0,12))}</span>` : '';
1091
- let modelBadge = data.model ? `<span style="background:rgba(167,139,250,0.15);color:var(--purple);padding:1px 6px;border-radius:3px;font-size:0.65rem;flex-shrink:0;">${escape(data.model)}</span>` : '';
1092
- let agentBadge = tags.agent ? `<span style="background:rgba(57,211,238,0.15);color:var(--cyan);padding:1px 6px;border-radius:3px;font-size:0.65rem;flex-shrink:0;">@${escape(tags.agent)}</span>` : '';
1093
- let tokenBadge = data.token_count ? `<span style="color:var(--text-muted);font-size:0.65rem;flex-shrink:0;">${data.token_count.toLocaleString()} tok</span>` : '';
1094
- let durBadge = dur ? `<span style="color:var(--accent);font-size:0.7rem;font-weight:600;flex-shrink:0;">${fmtDur(dur)}</span>` : '';
1095
- let expandIcon = hasChildren ? '<span style="color:var(--text-muted);font-size:0.7rem;width:12px;flex-shrink:0;">▸</span>' : '<span style="width:12px;flex-shrink:0;"></span>';
1096
- return `<div class="tree-node ${isError ? 'error' : ''}" style="margin-left:${depth * 16}px" onclick="toggleSpanDetail('${escape(n.id || '')}')">
1097
- ${expandIcon}
1098
- <span class="tree-bar ${barColor}" style="width:${Math.max(pct, 2)}%;flex-shrink:0;"></span>
1099
- ${typeBadge}${toolBadge ? toolBadge : ''}
1100
- <span style="color:var(--text-primary);font-weight:500;flex:1;min-width:100px;">${escape(n.function || '?')}</span>
1101
- ${modelBadge}${agentBadge}${tokenBadge}
1102
- ${durBadge}
1103
- ${isError ? '<span style="color:var(--red);flex-shrink:0;">⚠</span>' : ''}
1104
- </div>
1105
- <div id="span-${escape(n.id || '')}" style="display:none;margin-left:${(depth + 1) * 16}px"></div>
1106
- ${hasChildren ? renderTree(n.children, totalMs, depth + 1) : ''}`;
1107
- }).join('');
1108
- }
1109
-
1110
- function toggleSpanDetail(spanId) {
1111
- let el = document.getElementById('span-' + spanId);
1112
- if (!el) return;
1113
- if (el.style.display !== 'none') { el.style.display = 'none'; return; }
1114
-
1115
- if (!el.dataset.loaded) {
1116
- let span = findSpanById(window._spans, spanId);
1117
- if (span) {
1118
- let data = span.data || {};
1119
- let tags = span.tags || {};
1120
- el.innerHTML = `<div class="span-detail">
1121
- <h4>${escape(span.function || '')}</h4>
1122
- <dl class="span-detail-grid">
1123
- <dt>ID</dt><dd><code>${escape(span.id || '')}</code></dd>
1124
- <dt>Duration</dt><dd>${fmtDur(data.duration_ms)}</dd>
1125
- <dt>Agent</dt><dd>${escape(typeof tags.agent === 'string' ? tags.agent : '')}</dd>
1126
- ${data.model ? `<dt>Model</dt><dd>${escape(data.model)}</dd>` : ''}
1127
- ${data.token_count ? `<dt>Tokens</dt><dd>${data.token_count.toLocaleString()}</dd>` : ''}
1128
- ${data.input_tokens ? `<dt>Input</dt><dd>${data.input_tokens.toLocaleString()}</dd>` : ''}
1129
- ${data.output_tokens ? `<dt>Output</dt><dd>${data.output_tokens.toLocaleString()}</dd>` : ''}
1130
- ${data.status ? `<dt>Status</dt><dd><span class="badge ${data.status === 'success' ? 'badge-green' : 'badge-red'}">${escape(data.status)}</span></dd>` : ''}
1131
- ${data.error ? `<dt>Error</dt><dd style="color:var(--red)">${escape(data.error)}</dd>` : ''}
1132
- </dl>
1133
- <button class="btn btn-sm" onclick="toggleRaw(this, '${escape(spanId)}')">Raw JSON</button>
1134
- <div id="raw-${escape(spanId)}" class="raw-json">${escape(JSON.stringify(span, null, 2))}</div>
1135
- </div>`;
1136
- el.dataset.loaded = '1';
1137
- }
1138
- }
1139
- el.style.display = 'block';
1140
- }
1141
-
1142
- function toggleRaw(btn, id) {
1143
- let el = document.getElementById('raw-' + id);
1144
- if (el) el.style.display = el.style.display === 'none' ? 'block' : 'none';
1145
- }
1146
-
1147
- function findSpanById(spans, id) {
1148
- for (let s of spans) { if (s.id === id) return s; if (s.children) { let f = findSpanById(s.children, id); if (f) return f; } }
1149
- return null;
1150
- }
1151
-
1152
- function renderTimeline(tree, stats) {
1153
- let firstTs = stats.first_ts; let t0 = new Date(firstTs);
1154
- if (!t0.getTime()) return '';
1155
- let total = stats.duration_ms || 1;
1156
-
1157
- function flatten(nodes, out = []) {
1158
- nodes.forEach(n => { out.push(n); if (n.children) flatten(n.children, out); });
1159
- return out;
1160
- }
1161
-
1162
- let rows = flatten(tree || []);
1163
- if (!rows.length) return '';
1164
-
1165
- return `<div class="timeline-view">` + rows.map(span => {
1166
- let ts = new Date(span.timestamp);
1167
- let start = ts && !isNaN(ts.getTime()) ? (ts - t0) / 1000 : 0;
1168
- let dur = span.data?.duration_ms || 0;
1169
- let left = Math.min(100, (start / total) * 100);
1170
- let width = Math.max(0.5, Math.min(100 - left, (dur / total) * 100));
1171
- let isError = span.data?.status === 'error' || span.data?.failed || span.data?.error;
1172
- let color = span.type === 'ACP_EVENT' ? 'green' : isError ? 'red' : '';
1173
- return `<div class="timeline-row">
1174
- <div class="timeline-label" onclick="toggleSpanDetail('${escape(span.id || '')}')">${escape(span.function || '?')}</div>
1175
- <div class="timeline-track">
1176
- <div class="timeline-bar ${color}" style="left:${left}%;width:${width}%" onclick="toggleSpanDetail('${escape(span.id || '')}')" title="${fmtDur(dur)}"></div>
1177
- </div>
1178
- </div>`;
1179
- }).join('') + `</div>`;
1180
- }
1181
-
1182
- /* ─── Analytics ─── */
1183
- async function loadAnalytics() {
1184
- try {
1185
- let [models, tools, loc, latency, scatter] = await Promise.all([
1186
- api('/api/stats/models'),
1187
- api('/api/stats/tools'),
1188
- api('/api/stats/loc'),
1189
- api('/api/stats/latency'),
1190
- api('/api/stats/scatter?limit=300'),
1191
- ]);
1192
-
1193
- // Models
1194
- document.getElementById('analytics-models').innerHTML = (models || []).map(m => {
1195
- let rate = m.success_rate || 0;
1196
- let badge = rate >= 95 ? 'badge-green' : rate >= 80 ? 'badge-yellow' : 'badge-red';
1197
- return `<tr>
1198
- <td><strong>${escape(m.model)}</strong></td>
1199
- <td>${fmtNum(m.span_count)}</td>
1200
- <td>${fmtNum(m.total_tokens)}</td>
1201
- <td>${m.avg_duration ? m.avg_duration.toFixed(2) + 's' : '-'}</td>
1202
- <td><span class="badge ${badge}">${rate}%</span></td>
1203
- </tr>`;
1204
- }).join('') || '<tr><td colspan="5" class="empty-state">No data</td></tr>';
1205
-
1206
- // Tools chart
1207
- let ctx = document.getElementById('chart-tools').getContext('2d');
1208
- CHARTS['tools'] = new Chart(ctx, {
1209
- type: 'bar',
1210
- data: { labels: (tools || []).slice(0, 8).map(t => t.tool), datasets: [{ label: 'Calls', data: (tools || []).slice(0, 8).map(t => t.call_count), backgroundColor: '#f78166', borderRadius: 4 }] },
1211
- options: { responsive: true, maintainAspectRatio: false, indexAxis: 'y', plugins: { legend: { display: false } }, scales: { x: { grid: { color: '#30363d' }, ticks: { color: '#8b949e' }, beginAtZero: true }, y: { grid: { display: false }, ticks: { color: '#8b949e' } } } }
1212
- });
1213
-
1214
- // Scatter
1215
- ctx = document.getElementById('chart-scatter').getContext('2d');
1216
- let colors = { success: '#3fb950', error: '#f85149', completed: '#3fb950', failed: '#f85149' };
1217
- CHARTS['scatter'] = new Chart(ctx, {
1218
- type: 'scatter',
1219
- data: { datasets: [{ label: 'Traces', data: (scatter || []).map(p => ({ x: (p.x || 0) * 1000, y: p.y || 0 })), backgroundColor: (scatter || []).map(p => colors[p.status] || '#58a6ff'), pointRadius: 4, pointHoverRadius: 6 }] },
1220
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { x: { type: 'linear', position: 'bottom', grid: { color: '#30363d' }, ticks: { color: '#8b949e', callback: v => v + 'ms' }, title: { display: true, text: 'Latency', color: '#8b949e' } }, y: { grid: { color: '#30363d' }, ticks: { color: '#8b949e' }, title: { display: true, text: 'Tokens', color: '#8b949e' } } } }
1221
- });
1222
-
1223
- // Latency histogram
1224
- ctx = document.getElementById('chart-latency-hist').getContext('2d');
1225
- let hist = latency?.histogram || [];
1226
- CHARTS['hist'] = new Chart(ctx, {
1227
- type: 'bar',
1228
- data: { labels: hist.map(h => h.range), datasets: [{ label: 'Count', data: hist.map(h => h.count), backgroundColor: 'rgba(88,166,255,0.6)', borderRadius: 3 }] },
1229
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } }, scales: { x: { grid: { color: '#30363d' }, ticks: { color: '#8b949e', maxRotation: 45 } }, y: { grid: { color: '#30363d' }, ticks: { color: '#8b949e' }, beginAtZero: true } } }
1230
- });
1231
-
1232
- // LOC
1233
- document.getElementById('analytics-loc').innerHTML = `
1234
- <div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
1235
- <div class="stat-card"><div class="stat-label">Lines Added</div><div class="stat-value accent">${fmtNum(loc.lines_added || 0)}</div></div>
1236
- <div class="stat-card"><div class="stat-label">Tokens / 1K LOC</div><div class="stat-value purple">${fmtNum(loc.tokens_per_kloc || 0)}</div></div>
1237
- </div>`;
1238
-
1239
- } catch(e) { console.error(e); }
1240
- }
1241
-
1242
- /* ─── Compare ─── */
1243
- async function loadComparePage() {
1244
- try {
1245
- let sessions = await api('/api/sessions?limit=500');
1246
- STATE.sessions = sessions.sessions || [];
1247
- let el = document.getElementById('compare-sessions');
1248
- el.innerHTML = STATE.sessions.map(s => `<label style="display:inline-flex;align-items:center;gap:6px;background:var(--bg-card);padding:6px 12px;border-radius:4px;border:1px solid var(--border);margin:4px;cursor:pointer">
1249
- <input type="checkbox" value="${escape(s.session_id)}" onchange="onCompToggle(this)"> ${escape((s.session_id || '').slice(0, 16))}… (${(s.agents || []).join(',')})
1250
- </label>`).join('');
1251
- } catch(e) { console.error(e); }
1252
- }
1253
-
1254
- let compareSelected = [];
1255
- function onCompToggle(cb) {
1256
- let id = cb.value;
1257
- if (cb.checked) { if (!compareSelected.includes(id)) compareSelected.push(id); }
1258
- else { compareSelected = compareSelected.filter(x => x !== id); }
1259
- }
1260
-
1261
- async function doCompare() {
1262
- if (compareSelected.length < 2) { alert('Select at least 2 sessions'); return; }
1263
- let el = document.getElementById('compare-results');
1264
- el.innerHTML = '<div class="loading">Loading...</div>';
1265
- try {
1266
- let details = await Promise.all(compareSelected.map(id => api('/api/sessions/' + encodeURIComponent(id))));
1267
- let html = '<div class="compare-grid">' + details.map((d, i) => {
1268
- let s = d.stats || {};
1269
- return `<div class="compare-card">
1270
- <h3>Session ${i + 1}</h3>
1271
- <div class="compare-row"><span class="label">Duration</span><span class="value highlight">${fmtDur(s.duration_ms)}</span></div>
1272
- <div class="compare-row"><span class="label">Spans</span><span class="value">${(d.spans || []).length}</span></div>
1273
- <div class="compare-row"><span class="label">Tool Calls</span><span class="value">${s.tool_calls || 0}</span></div>
1274
- <div class="compare-row"><span class="label">Tokens</span><span class="value">${(s.total_tokens || 0).toLocaleString()}</span></div>
1275
- <div class="compare-row"><span class="label">Errors</span><span class="value" style="color:${s.error_count > 0 ? 'var(--red)' : 'var(--green)'}">${s.error_count}</span></div>
1276
- <div class="compare-row"><span class="label">Agents</span><span class="value">${(s.agents || []).join(', ')}</span></div>
1277
- </div>`;
1278
- }).join('') + '</div>';
1279
- el.innerHTML = html;
1280
- } catch(e) { el.innerHTML = `<div class="error-msg">${e.message}</div>`; }
1281
- }
1282
-
1283
- /* ─── Users ─── */
1284
- async function loadUsers() {
1285
- try {
1286
- let [users, tags, envs] = await Promise.all([
1287
- api('/api/stats/users'),
1288
- api('/api/stats/tags'),
1289
- api('/api/stats/environments'),
1290
- ]);
1291
-
1292
- document.getElementById('env-body').innerHTML = (envs.environments || []).map(e => {
1293
- let badge = e.environment?.toLowerCase() || '';
1294
- return `<tr><td><span class="env-badge ${badge}">${escape(e.environment || '')}</span></td><td>${fmtNum(e.count)}</td><td>${e.error_rate ? e.error_rate.toFixed(1) + '%' : '-'}</td></tr>`;
1295
- }).join('') || '<tr><td colspan="3" class="empty-state">No data</td></tr>';
1296
-
1297
- document.getElementById('tags-cloud').innerHTML = (tags || []).slice(0, 30).map(t => `<span class="badge badge-tag">${escape(t.tag)} (${t.count})</span>`).join('') || '<div class="empty-state">No tags</div>';
1298
-
1299
- document.getElementById('users-body').innerHTML = (users || []).map(u => `<tr><td><strong>${escape(u.user_id)}</strong></td><td>${fmtNum(u.trace_count)}</td><td>${fmtNum(u.session_count)}</td><td>${fmtNum(u.total_tokens)}</td></tr>`).join('') || '<tr><td colspan="4" class="empty-state">No users</td></tr>';
1300
-
1301
- } catch(e) { console.error(e); }
1302
- }
1303
-
1304
- /* ─── Errors ─── */
1305
- async function loadErrors() {
1306
- try {
1307
- let errors = await api('/api/stats/errors');
1308
- document.getElementById('errors-body').innerHTML = (errors || []).map(e => `<tr class="clickable" onclick="goDetail('${escape(e.latest_session || '')}')">
1309
- <td style="color:var(--red);max-width:300px;overflow:hidden;text-overflow:ellipsis">${escape((e.error || '').slice(0, 100))}</td>
1310
- <td>${e.count}</td>
1311
- <td>${fmtDate(e.latest)}</td>
1312
- <td class="truncate">${escape((e.latest_session || '').slice(0, 20))}</td>
1313
- </tr>`).join('') || '<tr><td colspan="4" class="empty-state">No errors</td></tr>';
1314
- } catch(e) { console.error(e); }
1315
- }
1316
-
1317
- // Initialize
1318
- document.addEventListener('DOMContentLoaded', () => loadPage('overview'));
1319
- </script>
1320
- </body>
1321
- </html>