@codemieai/code 0.15.1 → 0.15.3

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 (336) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/bin/codemie.js +52 -0
  3. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  4. package/dist/agents/core/AgentCLI.js +6 -0
  5. package/dist/agents/core/AgentCLI.js.map +1 -1
  6. package/dist/agents/core/BaseAgentAdapter.d.ts +25 -0
  7. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  8. package/dist/agents/core/BaseAgentAdapter.js +137 -127
  9. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  10. package/dist/agents/core/session/BaseProcessor.d.ts +10 -0
  11. package/dist/agents/core/session/BaseProcessor.d.ts.map +1 -1
  12. package/dist/agents/core/session/BaseProcessor.js +11 -1
  13. package/dist/agents/core/session/BaseProcessor.js.map +1 -1
  14. package/dist/agents/core/session/BaseSessionAdapter.d.ts +4 -0
  15. package/dist/agents/core/session/BaseSessionAdapter.d.ts.map +1 -1
  16. package/dist/agents/core/types.d.ts +11 -5
  17. package/dist/agents/core/types.d.ts.map +1 -1
  18. package/dist/agents/plugins/claude/claude.models.d.ts.map +1 -1
  19. package/dist/agents/plugins/claude/claude.models.js +12 -11
  20. package/dist/agents/plugins/claude/claude.models.js.map +1 -1
  21. package/dist/agents/plugins/claude/claude.plugin.d.ts +3 -3
  22. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  23. package/dist/agents/plugins/claude/claude.plugin.js +14 -13
  24. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  25. package/dist/agents/plugins/claude/claude.session.d.ts +17 -1
  26. package/dist/agents/plugins/claude/claude.session.d.ts.map +1 -1
  27. package/dist/agents/plugins/claude/claude.session.js +31 -1
  28. package/dist/agents/plugins/claude/claude.session.js.map +1 -1
  29. package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
  30. package/dist/agents/plugins/claude/plugin/hooks/hooks.json +7 -7
  31. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  32. package/dist/agents/plugins/codex/codex.plugin.js +7 -6
  33. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  34. package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.d.ts.map +1 -1
  35. package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.js +5 -2
  36. package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.js.map +1 -1
  37. package/dist/agents/plugins/gemini/extension/gemini-extension.json +1 -1
  38. package/dist/agents/plugins/gemini/extension/hooks/hooks.json +7 -7
  39. package/dist/agents/plugins/gemini/gemini.plugin.d.ts.map +1 -1
  40. package/dist/agents/plugins/gemini/gemini.plugin.js +7 -6
  41. package/dist/agents/plugins/gemini/gemini.plugin.js.map +1 -1
  42. package/dist/agents/plugins/kimi/kimi.hook-config-injector.d.ts.map +1 -1
  43. package/dist/agents/plugins/kimi/kimi.hook-config-injector.js +26 -5
  44. package/dist/agents/plugins/kimi/kimi.hook-config-injector.js.map +1 -1
  45. package/dist/agents/plugins/kimi/kimi.plugin.d.ts.map +1 -1
  46. package/dist/agents/plugins/kimi/kimi.plugin.js +5 -2
  47. package/dist/agents/plugins/kimi/kimi.plugin.js.map +1 -1
  48. package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
  49. package/dist/agents/plugins/opencode/opencode-dynamic-models.js +3 -4
  50. package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
  51. package/dist/agents/plugins/pi/pi.models.d.ts.map +1 -1
  52. package/dist/agents/plugins/pi/pi.models.js +3 -3
  53. package/dist/agents/plugins/pi/pi.models.js.map +1 -1
  54. package/dist/bin/proxy-daemon.js +8 -1
  55. package/dist/bin/proxy-daemon.js.map +1 -1
  56. package/dist/cli/commands/analytics/cost/claude-dispatch-allocation.d.ts +6 -0
  57. package/dist/cli/commands/analytics/cost/claude-dispatch-allocation.d.ts.map +1 -0
  58. package/dist/cli/commands/analytics/cost/claude-dispatch-allocation.js +115 -0
  59. package/dist/cli/commands/analytics/cost/claude-dispatch-allocation.js.map +1 -0
  60. package/dist/cli/commands/analytics/cost/claude-lifecycle.d.ts +6 -0
  61. package/dist/cli/commands/analytics/cost/claude-lifecycle.d.ts.map +1 -0
  62. package/dist/cli/commands/analytics/cost/claude-lifecycle.js +107 -0
  63. package/dist/cli/commands/analytics/cost/claude-lifecycle.js.map +1 -0
  64. package/dist/cli/commands/analytics/cost/claude-native.d.ts +54 -0
  65. package/dist/cli/commands/analytics/cost/claude-native.d.ts.map +1 -0
  66. package/dist/cli/commands/analytics/cost/claude-native.js +14 -0
  67. package/dist/cli/commands/analytics/cost/claude-native.js.map +1 -0
  68. package/dist/cli/commands/analytics/cost/claude-ownership.d.ts +23 -0
  69. package/dist/cli/commands/analytics/cost/claude-ownership.d.ts.map +1 -0
  70. package/dist/cli/commands/analytics/cost/claude-ownership.js +99 -0
  71. package/dist/cli/commands/analytics/cost/claude-ownership.js.map +1 -0
  72. package/dist/cli/commands/analytics/cost/claude-trace.d.ts +28 -0
  73. package/dist/cli/commands/analytics/cost/claude-trace.d.ts.map +1 -0
  74. package/dist/cli/commands/analytics/cost/claude-trace.js +120 -0
  75. package/dist/cli/commands/analytics/cost/claude-trace.js.map +1 -0
  76. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts +1 -1
  77. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -1
  78. package/dist/cli/commands/analytics/cost/cost-enricher.js +34 -43
  79. package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
  80. package/dist/cli/commands/analytics/cost/dispatch-allocation.d.ts +18 -0
  81. package/dist/cli/commands/analytics/cost/dispatch-allocation.d.ts.map +1 -0
  82. package/dist/cli/commands/analytics/cost/dispatch-allocation.js +53 -0
  83. package/dist/cli/commands/analytics/cost/dispatch-allocation.js.map +1 -0
  84. package/dist/cli/commands/analytics/cost/dispatch-extractor.d.ts +8 -13
  85. package/dist/cli/commands/analytics/cost/dispatch-extractor.d.ts.map +1 -1
  86. package/dist/cli/commands/analytics/cost/dispatch-extractor.js +131 -69
  87. package/dist/cli/commands/analytics/cost/dispatch-extractor.js.map +1 -1
  88. package/dist/cli/commands/analytics/cost/types.d.ts +39 -0
  89. package/dist/cli/commands/analytics/cost/types.d.ts.map +1 -1
  90. package/dist/cli/commands/analytics/cost/types.js.map +1 -1
  91. package/dist/cli/commands/analytics/cost/usage-readers.d.ts +2 -0
  92. package/dist/cli/commands/analytics/cost/usage-readers.d.ts.map +1 -1
  93. package/dist/cli/commands/analytics/cost/usage-readers.js +14 -3
  94. package/dist/cli/commands/analytics/cost/usage-readers.js.map +1 -1
  95. package/dist/cli/commands/analytics/data-loader.d.ts +13 -0
  96. package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -1
  97. package/dist/cli/commands/analytics/data-loader.js +6 -0
  98. package/dist/cli/commands/analytics/data-loader.js.map +1 -1
  99. package/dist/cli/commands/analytics/native-loader.d.ts +1 -1
  100. package/dist/cli/commands/analytics/native-loader.d.ts.map +1 -1
  101. package/dist/cli/commands/analytics/native-loader.js +25 -3
  102. package/dist/cli/commands/analytics/native-loader.js.map +1 -1
  103. package/dist/cli/commands/analytics/otel-loader.d.ts.map +1 -1
  104. package/dist/cli/commands/analytics/otel-loader.js +5 -0
  105. package/dist/cli/commands/analytics/otel-loader.js.map +1 -1
  106. package/dist/cli/commands/analytics/report/client/app.js +302 -125
  107. package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
  108. package/dist/cli/commands/analytics/report/payload-builder.js +64 -13
  109. package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
  110. package/dist/cli/commands/analytics/report/template.html +50 -2
  111. package/dist/cli/commands/analytics/report/types.d.ts +16 -0
  112. package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
  113. package/dist/cli/commands/assistants/constants.d.ts +4 -0
  114. package/dist/cli/commands/assistants/constants.d.ts.map +1 -1
  115. package/dist/cli/commands/assistants/constants.js +4 -0
  116. package/dist/cli/commands/assistants/constants.js.map +1 -1
  117. package/dist/cli/commands/assistants/setup/data.d.ts +1 -0
  118. package/dist/cli/commands/assistants/setup/data.d.ts.map +1 -1
  119. package/dist/cli/commands/assistants/setup/data.js +55 -10
  120. package/dist/cli/commands/assistants/setup/data.js.map +1 -1
  121. package/dist/cli/commands/assistants/setup/helpers.d.ts +1 -1
  122. package/dist/cli/commands/assistants/setup/helpers.d.ts.map +1 -1
  123. package/dist/cli/commands/assistants/setup/helpers.js +2 -5
  124. package/dist/cli/commands/assistants/setup/helpers.js.map +1 -1
  125. package/dist/cli/commands/assistants/setup/index.d.ts +12 -0
  126. package/dist/cli/commands/assistants/setup/index.d.ts.map +1 -1
  127. package/dist/cli/commands/assistants/setup/index.js +148 -20
  128. package/dist/cli/commands/assistants/setup/index.js.map +1 -1
  129. package/dist/cli/commands/doctor/checks/AgentsCheck.d.ts +6 -0
  130. package/dist/cli/commands/doctor/checks/AgentsCheck.d.ts.map +1 -1
  131. package/dist/cli/commands/doctor/checks/AgentsCheck.js +37 -33
  132. package/dist/cli/commands/doctor/checks/AgentsCheck.js.map +1 -1
  133. package/dist/cli/commands/doctor/index.d.ts.map +1 -1
  134. package/dist/cli/commands/doctor/index.js +11 -0
  135. package/dist/cli/commands/doctor/index.js.map +1 -1
  136. package/dist/cli/commands/hook.d.ts.map +1 -1
  137. package/dist/cli/commands/hook.js +72 -12
  138. package/dist/cli/commands/hook.js.map +1 -1
  139. package/dist/cli/commands/install.d.ts.map +1 -1
  140. package/dist/cli/commands/install.js +5 -9
  141. package/dist/cli/commands/install.js.map +1 -1
  142. package/dist/cli/commands/mcp/index.d.ts.map +1 -1
  143. package/dist/cli/commands/mcp/index.js +68 -17
  144. package/dist/cli/commands/mcp/index.js.map +1 -1
  145. package/dist/cli/commands/profile/display.d.ts +5 -1
  146. package/dist/cli/commands/profile/display.d.ts.map +1 -1
  147. package/dist/cli/commands/profile/display.js +5 -1
  148. package/dist/cli/commands/profile/display.js.map +1 -1
  149. package/dist/cli/commands/profile/index.d.ts.map +1 -1
  150. package/dist/cli/commands/profile/index.js +7 -4
  151. package/dist/cli/commands/profile/index.js.map +1 -1
  152. package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -1
  153. package/dist/cli/commands/proxy/connect-orchestrator.js +3 -4
  154. package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -1
  155. package/dist/cli/commands/proxy/connectors/desktop.d.ts +15 -12
  156. package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
  157. package/dist/cli/commands/proxy/connectors/desktop.js +36 -38
  158. package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
  159. package/dist/cli/commands/proxy/connectors/model-name-resolver.d.ts +19 -0
  160. package/dist/cli/commands/proxy/connectors/model-name-resolver.d.ts.map +1 -0
  161. package/dist/cli/commands/proxy/connectors/model-name-resolver.js +126 -0
  162. package/dist/cli/commands/proxy/connectors/model-name-resolver.js.map +1 -0
  163. package/dist/cli/commands/proxy/connectors/tenant-catalog.d.ts +11 -0
  164. package/dist/cli/commands/proxy/connectors/tenant-catalog.d.ts.map +1 -0
  165. package/dist/cli/commands/proxy/connectors/tenant-catalog.js +108 -0
  166. package/dist/cli/commands/proxy/connectors/tenant-catalog.js.map +1 -0
  167. package/dist/cli/commands/proxy/connectors/vscode-claude-code.d.ts.map +1 -1
  168. package/dist/cli/commands/proxy/connectors/vscode-claude-code.js +49 -19
  169. package/dist/cli/commands/proxy/connectors/vscode-claude-code.js.map +1 -1
  170. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts +3 -3
  171. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts.map +1 -1
  172. package/dist/cli/commands/proxy/connectors/vscode-models.js +28 -28
  173. package/dist/cli/commands/proxy/connectors/vscode-models.js.map +1 -1
  174. package/dist/cli/commands/proxy/connectors/vscode.d.ts +3 -2
  175. package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -1
  176. package/dist/cli/commands/proxy/connectors/vscode.js +78 -39
  177. package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -1
  178. package/dist/cli/commands/setup.d.ts.map +1 -1
  179. package/dist/cli/commands/setup.js +72 -24
  180. package/dist/cli/commands/setup.js.map +1 -1
  181. package/dist/cli/commands/shared/headless.d.ts +69 -0
  182. package/dist/cli/commands/shared/headless.d.ts.map +1 -0
  183. package/dist/cli/commands/shared/headless.js +83 -0
  184. package/dist/cli/commands/shared/headless.js.map +1 -0
  185. package/dist/cli/commands/shared/helpers.d.ts +21 -0
  186. package/dist/cli/commands/shared/helpers.d.ts.map +1 -1
  187. package/dist/cli/commands/shared/helpers.js +73 -1
  188. package/dist/cli/commands/shared/helpers.js.map +1 -1
  189. package/dist/cli/commands/shared/identifier-resolution.d.ts +23 -0
  190. package/dist/cli/commands/shared/identifier-resolution.d.ts.map +1 -0
  191. package/dist/cli/commands/shared/identifier-resolution.js +55 -0
  192. package/dist/cli/commands/shared/identifier-resolution.js.map +1 -0
  193. package/dist/cli/commands/skills/setup/data.d.ts +3 -2
  194. package/dist/cli/commands/skills/setup/data.d.ts.map +1 -1
  195. package/dist/cli/commands/skills/setup/data.js +75 -13
  196. package/dist/cli/commands/skills/setup/data.js.map +1 -1
  197. package/dist/cli/commands/skills/setup/helpers.d.ts +1 -1
  198. package/dist/cli/commands/skills/setup/helpers.d.ts.map +1 -1
  199. package/dist/cli/commands/skills/setup/helpers.js +2 -5
  200. package/dist/cli/commands/skills/setup/helpers.js.map +1 -1
  201. package/dist/cli/commands/skills/setup/index.d.ts +17 -1
  202. package/dist/cli/commands/skills/setup/index.d.ts.map +1 -1
  203. package/dist/cli/commands/skills/setup/index.js +190 -19
  204. package/dist/cli/commands/skills/setup/index.js.map +1 -1
  205. package/dist/cli/commands/tips.d.ts +10 -0
  206. package/dist/cli/commands/tips.d.ts.map +1 -0
  207. package/dist/cli/commands/tips.js +142 -0
  208. package/dist/cli/commands/tips.js.map +1 -0
  209. package/dist/cli/commands/update.d.ts.map +1 -1
  210. package/dist/cli/commands/update.js +12 -10
  211. package/dist/cli/commands/update.js.map +1 -1
  212. package/dist/cli/commands/whatsnew.d.ts +6 -0
  213. package/dist/cli/commands/whatsnew.d.ts.map +1 -0
  214. package/dist/cli/commands/whatsnew.js +37 -0
  215. package/dist/cli/commands/whatsnew.js.map +1 -0
  216. package/dist/cli/first-time.d.ts.map +1 -1
  217. package/dist/cli/first-time.js +4 -0
  218. package/dist/cli/first-time.js.map +1 -1
  219. package/dist/cli/index.js +4 -0
  220. package/dist/cli/index.js.map +1 -1
  221. package/dist/providers/core/types.d.ts +15 -0
  222. package/dist/providers/core/types.d.ts.map +1 -1
  223. package/dist/providers/core/types.js.map +1 -1
  224. package/dist/providers/integration/setup-ui.d.ts +5 -3
  225. package/dist/providers/integration/setup-ui.d.ts.map +1 -1
  226. package/dist/providers/integration/setup-ui.js +6 -4
  227. package/dist/providers/integration/setup-ui.js.map +1 -1
  228. package/dist/providers/plugins/ollama/ollama.library.d.ts +37 -0
  229. package/dist/providers/plugins/ollama/ollama.library.d.ts.map +1 -0
  230. package/dist/providers/plugins/ollama/ollama.library.js +105 -0
  231. package/dist/providers/plugins/ollama/ollama.library.js.map +1 -0
  232. package/dist/providers/plugins/ollama/ollama.models.d.ts +3 -1
  233. package/dist/providers/plugins/ollama/ollama.models.d.ts.map +1 -1
  234. package/dist/providers/plugins/ollama/ollama.models.js +5 -39
  235. package/dist/providers/plugins/ollama/ollama.models.js.map +1 -1
  236. package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -1
  237. package/dist/providers/plugins/ollama/ollama.setup-steps.js +196 -6
  238. package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -1
  239. package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -1
  240. package/dist/providers/plugins/ollama/ollama.template.js +12 -32
  241. package/dist/providers/plugins/ollama/ollama.template.js.map +1 -1
  242. package/dist/providers/plugins/sso/proxy/plugins/claude-model-resolver.d.ts +41 -0
  243. package/dist/providers/plugins/sso/proxy/plugins/claude-model-resolver.d.ts.map +1 -0
  244. package/dist/providers/plugins/sso/proxy/plugins/claude-model-resolver.js +115 -0
  245. package/dist/providers/plugins/sso/proxy/plugins/claude-model-resolver.js.map +1 -0
  246. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts.map +1 -1
  247. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js +101 -7
  248. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js.map +1 -1
  249. package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.d.ts +4 -0
  250. package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.d.ts.map +1 -1
  251. package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.js +28 -3
  252. package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.js.map +1 -1
  253. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts +5 -0
  254. package/dist/providers/plugins/sso/proxy/proxy-types.d.ts.map +1 -1
  255. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  256. package/dist/providers/plugins/sso/proxy/sso.proxy.js +1 -0
  257. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  258. package/dist/providers/plugins/sso/session/BaseProcessor.d.ts +4 -0
  259. package/dist/providers/plugins/sso/session/BaseProcessor.d.ts.map +1 -1
  260. package/dist/providers/plugins/sso/session/SessionSyncer.d.ts +12 -0
  261. package/dist/providers/plugins/sso/session/SessionSyncer.d.ts.map +1 -1
  262. package/dist/providers/plugins/sso/session/SessionSyncer.js +89 -0
  263. package/dist/providers/plugins/sso/session/SessionSyncer.js.map +1 -1
  264. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.d.ts.map +1 -1
  265. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js +75 -41
  266. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js.map +1 -1
  267. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.d.ts.map +1 -1
  268. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js +11 -2
  269. package/dist/providers/plugins/sso/session/processors/metrics/metrics-aggregator.js.map +1 -1
  270. package/dist/providers/plugins/sso/session/processors/metrics/metrics-sync-processor.d.ts.map +1 -1
  271. package/dist/providers/plugins/sso/session/processors/metrics/metrics-sync-processor.js +25 -5
  272. package/dist/providers/plugins/sso/session/processors/metrics/metrics-sync-processor.js.map +1 -1
  273. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.d.ts +1 -0
  274. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.d.ts.map +1 -1
  275. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js +30 -6
  276. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js.map +1 -1
  277. package/dist/telemetry/clients/claude-desktop/claude-desktop.parser.d.ts.map +1 -1
  278. package/dist/telemetry/clients/claude-desktop/claude-desktop.parser.js +33 -3
  279. package/dist/telemetry/clients/claude-desktop/claude-desktop.parser.js.map +1 -1
  280. package/dist/telemetry/runtime/DesktopRepositoryResolver.d.ts +58 -0
  281. package/dist/telemetry/runtime/DesktopRepositoryResolver.d.ts.map +1 -0
  282. package/dist/telemetry/runtime/DesktopRepositoryResolver.js +370 -0
  283. package/dist/telemetry/runtime/DesktopRepositoryResolver.js.map +1 -0
  284. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts +1 -0
  285. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -1
  286. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +89 -6
  287. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -1
  288. package/dist/telemetry/runtime/types.d.ts +2 -0
  289. package/dist/telemetry/runtime/types.d.ts.map +1 -1
  290. package/dist/utils/auth.d.ts +13 -2
  291. package/dist/utils/auth.d.ts.map +1 -1
  292. package/dist/utils/auth.js +7 -3
  293. package/dist/utils/auth.js.map +1 -1
  294. package/dist/utils/cli-updater.d.ts.map +1 -1
  295. package/dist/utils/cli-updater.js +2 -8
  296. package/dist/utils/cli-updater.js.map +1 -1
  297. package/dist/utils/config.d.ts +21 -0
  298. package/dist/utils/config.d.ts.map +1 -1
  299. package/dist/utils/config.js +69 -7
  300. package/dist/utils/config.js.map +1 -1
  301. package/dist/utils/env.d.ts +12 -0
  302. package/dist/utils/env.d.ts.map +1 -0
  303. package/dist/utils/env.js +18 -0
  304. package/dist/utils/env.js.map +1 -0
  305. package/dist/utils/errors.d.ts +14 -0
  306. package/dist/utils/errors.d.ts.map +1 -1
  307. package/dist/utils/errors.js +25 -0
  308. package/dist/utils/errors.js.map +1 -1
  309. package/dist/utils/hook-command.d.ts +6 -0
  310. package/dist/utils/hook-command.d.ts.map +1 -1
  311. package/dist/utils/hook-command.js +40 -1
  312. package/dist/utils/hook-command.js.map +1 -1
  313. package/dist/utils/paths.d.ts +2 -2
  314. package/dist/utils/paths.d.ts.map +1 -1
  315. package/dist/utils/paths.js +11 -9
  316. package/dist/utils/paths.js.map +1 -1
  317. package/dist/utils/pricing.json +14 -6
  318. package/dist/utils/processes.d.ts +12 -0
  319. package/dist/utils/processes.d.ts.map +1 -1
  320. package/dist/utils/processes.js +15 -0
  321. package/dist/utils/processes.js.map +1 -1
  322. package/dist/utils/tips.d.ts +103 -0
  323. package/dist/utils/tips.d.ts.map +1 -0
  324. package/dist/utils/tips.js +221 -0
  325. package/dist/utils/tips.js.map +1 -0
  326. package/dist/utils/version-warnings.d.ts +41 -0
  327. package/dist/utils/version-warnings.d.ts.map +1 -0
  328. package/dist/utils/version-warnings.js +93 -0
  329. package/dist/utils/version-warnings.js.map +1 -0
  330. package/dist/utils/whatsnew.d.ts +83 -0
  331. package/dist/utils/whatsnew.d.ts.map +1 -0
  332. package/dist/utils/whatsnew.js +200 -0
  333. package/dist/utils/whatsnew.js.map +1 -0
  334. package/package.json +4 -1
  335. package/scripts/release.sh +6 -0
  336. package/src/utils/tips.json +806 -0
@@ -40,6 +40,12 @@
40
40
  if (n < 100) return '$' + n.toFixed(2);
41
41
  return '$' + Math.round(n).toLocaleString('en-US');
42
42
  }
43
+ function fmtExactUSD(n) {
44
+ return Number.isFinite(n) ? '$' + n.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 8 }) : '—';
45
+ }
46
+ function costSourceLabel(s) {
47
+ return s.costSource === 'authoritative' ? 'reported by source' : s.costSource === 'native-estimate' ? 'API-equivalent estimate' : 'source not recorded';
48
+ }
43
49
  function fmtDuration(ms) {
44
50
  var h = ms / 3600000;
45
51
  if (h >= 48) return Math.round(h / 24) + 'd';
@@ -798,7 +804,12 @@
798
804
 
799
805
  VIEWS.cost = function (host, fs) {
800
806
  host.appendChild(el('h2', 'view-title', 'Cost'));
801
- host.appendChild(el('p', 'view-sub', 'Estimated cost (API-equivalent) — token usage × model pricing. On a subscription you don’t pay per token; this is the equivalent metered API value.'));
807
+ var allEstimated = fs.length && fs.every(function (s) { return s.costSource === 'native-estimate'; });
808
+ var allReported = fs.length && fs.every(function (s) { return s.costSource === 'authoritative'; });
809
+ var costDescription = allEstimated ? 'API-equivalent estimates from token usage and standard model rates.'
810
+ : allReported ? 'Cost amounts reported by the telemetry source.'
811
+ : 'Available session costs, including API-equivalent estimates and source-reported amounts. Each session identifies its cost source when recorded.';
812
+ host.appendChild(el('p', 'view-sub', esc(costDescription)));
802
813
 
803
814
  var total = sum(fs, function (s) { return s.costUSD; });
804
815
  var priced = DATA.meta.totals.pricedSessions, totalSessions = DATA.meta.totals.sessions;
@@ -920,6 +931,7 @@
920
931
  // ---- session-detail modal ----------------------------------------------
921
932
  var modalCharts = []; // owned by the modal; NOT in the global charts[] (decoupled from destroyCharts()).
922
933
  var modalEsc = null;
934
+ var modalReturnFocus = null;
923
935
  function makeModalChart(canvas, config) {
924
936
  if (!window.Chart) return null;
925
937
  var c = new Chart(canvas, config);
@@ -931,6 +943,8 @@
931
943
  modalCharts = [];
932
944
  if (modalEsc) { document.removeEventListener('keydown', modalEsc); modalEsc = null; }
933
945
  var ov = document.getElementById('session-modal'); if (ov && ov.parentNode) ov.parentNode.removeChild(ov);
946
+ if (modalReturnFocus && modalReturnFocus.isConnected && typeof modalReturnFocus.focus === 'function') modalReturnFocus.focus();
947
+ modalReturnFocus = null;
934
948
  }
935
949
  var MODAL_MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
936
950
  function fmtWhen(ms) { var d = new Date(ms); return MODAL_MONTHS[d.getMonth()] + ' ' + d.getDate() + ', ' + String(d.getHours()).padStart(2, '0') + ':' + String(d.getMinutes()).padStart(2, '0'); }
@@ -952,17 +966,16 @@
952
966
  // source) so counts/chips stay consistent with it; falls back to the tracked named-invocation
953
967
  // counts when this session has no dispatch data (e.g. older/tracked-only sessions).
954
968
  function dispatchCounts(s, kind) {
969
+ var fallback = kind === 'agent' ? (s.agentInvocations || []) : kind === 'skill' ? (s.skillInvocations || []) : (s.commandInvocations || []);
970
+ if (!s.dispatchesComplete && fallback.length) return fallback;
955
971
  var disp = (s.dispatches || []).filter(function (d) { return d.kind === kind; });
956
- if (disp.length) {
957
- var m = {};
958
- disp.forEach(function (d) { m[d.name] = (m[d.name] || 0) + 1; });
959
- return Object.keys(m).map(function (n) { return { name: n, totalCalls: m[n] }; });
960
- }
961
- return kind === 'agent' ? (s.agentInvocations || []) : kind === 'skill' ? (s.skillInvocations || []) : (s.commandInvocations || []);
972
+ var counts = new Map();
973
+ disp.forEach(function (d) { counts.set(d.name, (counts.get(d.name) || 0) + 1); });
974
+ return Array.from(counts, function (entry) { return { name: entry[0], totalCalls: entry[1] }; });
962
975
  }
963
976
  function chipsEl(title, list) { // list: NamedInvocationStats[]
964
977
  var sec = el('div', 'dispatch-col');
965
- sec.appendChild(el('h4', null, esc(title) + ' (' + (list ? list.length : 0) + ')'));
978
+ sec.appendChild(el('h4', null, esc(title) + ' (' + fmtNum(sumCalls(list)) + ')'));
966
979
  if (!list || !list.length) { sec.appendChild(el('div', 'text-muted', '<span style="font-size:12px">none</span>')); return sec; }
967
980
  var wrap = el('div', 'modal-chips');
968
981
  list.slice().sort(function (a, b) { return b.totalCalls - a.totalCalls; }).forEach(function (n) {
@@ -972,18 +985,21 @@
972
985
  }
973
986
  // One timeline row: label + track with a positioned bar + a right-aligned duration. All text esc()'d.
974
987
  function tlRow(label, color, leftPct, wPct, durText, barText, strong) {
975
- var row = el('div', 'tl-row');
976
- row.appendChild(el('div', 'tl-label' + (strong ? ' tl-label-strong' : ''), esc(label)));
977
- var track = el('div', 'tl-track');
978
- var bar = el('div', 'tl-bar');
979
- bar.style.left = 'calc(min(' + leftPct + '%, 100% - 28px))'; bar.style.width = wPct + '%'; bar.style.background = color;
988
+ var row = el(strong ? 'div' : 'button', 'tl-row');
989
+ if (!strong) row.type = 'button';
990
+ var labelEl = el('span', 'tl-label' + (strong ? ' tl-label-strong' : ''), esc(label));
991
+ labelEl.title = label;
992
+ row.appendChild(labelEl);
993
+ var track = el('span', 'tl-track');
994
+ var bar = el('span', 'tl-bar');
995
+ bar.style.left = 'calc(min(' + leftPct + '%, 100% - 4px))'; bar.style.width = wPct + '%'; bar.style.background = color;
980
996
  if (barText) {
981
997
  bar.classList.add('tl-bar-has-text');
982
998
  bar.innerHTML = '<span class="tl-bar-text">' + esc(barText) + '</span>';
983
999
  }
984
1000
  bar.title = label + ' · ' + durText; // .title property = safe (not parsed as HTML)
985
1001
  track.appendChild(bar); row.appendChild(track);
986
- row.appendChild(el('div', 'tl-dur', esc(durText)));
1002
+ row.appendChild(el('span', 'tl-dur', esc(durText)));
987
1003
  return row;
988
1004
  }
989
1005
  // Precise wall-clock timing for short timeline steps. The general report formatter rounds
@@ -992,135 +1008,264 @@
992
1008
  ms = Math.max(0, ms || 0);
993
1009
  if (ms < 1000) return Math.round(ms) + 'ms';
994
1010
  if (ms < 60000) return (Math.round(ms / 100) / 10) + 's';
995
- if (ms < 3600000) return Math.floor(ms / 60000) + 'm ' + Math.round((ms % 60000) / 1000) + 's';
996
- return Math.floor(ms / 3600000) + 'h ' + Math.round((ms % 3600000) / 60000) + 'm';
1011
+ var seconds = Math.round(ms / 1000);
1012
+ if (seconds < 3600) return Math.floor(seconds / 60) + 'm ' + seconds % 60 + 's';
1013
+ return Math.floor(seconds / 3600) + 'h ' + Math.floor(seconds % 3600 / 60) + 'm ' + seconds % 60 + 's';
1014
+ }
1015
+ function traceElapsed(d) {
1016
+ if (Number.isFinite(d.elapsedMs)) return Math.max(0, d.elapsedMs);
1017
+ if (Number.isFinite(d.completedAt) && Number.isFinite(d.start)) return Math.max(0, d.completedAt - d.start);
1018
+ if (Number.isFinite(d.observedEnd) && Number.isFinite(d.start)) return Math.max(0, d.observedEnd - d.start);
1019
+ // An asynchronous acknowledgement is not a completion time.
1020
+ if (d.status === 'incomplete' || d.status === 'unknown') return 0;
1021
+ return Math.max(0, Number.isFinite(d.durationMs) ? d.durationMs : 0);
1022
+ }
1023
+ function traceStatus(d) {
1024
+ return { completed: 'Completed', failed: 'Failed', incomplete: 'Incomplete', unknown: 'Unknown' }[d.status] || 'Not recorded';
997
1025
  }
998
- // Side panel content for a selected timeline step.
999
- function tlDetailEl(d, sessionStart) {
1026
+ function exactWhen(ms) {
1027
+ var date = new Date(ms);
1028
+ return Number.isFinite(ms) && Number.isFinite(date.getTime()) ? date.toISOString().replace('T', ' ').replace('Z', ' UTC') : 'Not recorded';
1029
+ }
1030
+ function traceEntries(s) {
1031
+ var byId = new Map(), byAgent = new Map(), duplicateIds = new Set(), duplicateAgents = new Set();
1032
+ var counts = new Map(), occurrences = new Map();
1033
+ var entries = (s.dispatches || []).map(function (d, i) {
1034
+ var entry = { d: d, key: d.id != null ? String(d.id) : 'legacy:' + i, parent: null, children: [], level: 0, issue: '' };
1035
+ if (d.id != null) {
1036
+ if (byId.has(String(d.id))) { duplicateIds.add(String(d.id)); entry.key += ':duplicate:' + i; }
1037
+ else byId.set(String(d.id), entry);
1038
+ }
1039
+ if (d.kind === 'agent' && d.agentId) {
1040
+ if (byAgent.has(d.agentId)) duplicateAgents.add(d.agentId);
1041
+ else byAgent.set(d.agentId, entry);
1042
+ }
1043
+ var nameKey = d.kind + ':' + d.name;
1044
+ counts.set(nameKey, (counts.get(nameKey) || 0) + 1);
1045
+ return entry;
1046
+ }).sort(function (a, b) { return (a.d.start || 0) - (b.d.start || 0); });
1047
+ entries.forEach(function (entry) {
1048
+ var d = entry.d, nameKey = d.kind + ':' + d.name;
1049
+ occurrences.set(nameKey, (occurrences.get(nameKey) || 0) + 1);
1050
+ entry.label = d.kind + ' · ' + d.name + (counts.get(nameKey) > 1 ? ' #' + occurrences.get(nameKey) : '');
1051
+ if (duplicateIds.has(String(d.id))) entry.issue = 'Repeated invocation ID';
1052
+ else if (d.relationshipStatus === 'cycle') entry.issue = 'Ancestry cycle';
1053
+ else if (d.relationshipStatus === 'conflict') entry.issue = 'Conflicting parent evidence';
1054
+ else if (d.relationshipStatus === 'missing') entry.issue = 'Parent not resolved';
1055
+ if (entry.issue) return;
1056
+ if (d.parentId != null) {
1057
+ entry.parent = !duplicateIds.has(String(d.parentId)) && byId.get(String(d.parentId)) || null;
1058
+ if (!entry.parent) entry.issue = 'Parent not found';
1059
+ } else if (d.ownerAgentId && d.ownerAgentId !== s.sessionId && d.ownerAgentId !== 'root') {
1060
+ entry.parent = !duplicateAgents.has(d.ownerAgentId) && byAgent.get(d.ownerAgentId) || null;
1061
+ if (!entry.parent) entry.issue = 'Owner not found';
1062
+ } else if (d.depth > 1) entry.issue = 'Parent not recorded';
1063
+ });
1064
+ entries.forEach(function (entry) {
1065
+ var path = [], positions = new Map(), current = entry;
1066
+ while (current) {
1067
+ if (positions.has(current)) {
1068
+ path.slice(positions.get(current)).forEach(function (cyclic) { cyclic.issue = 'Ancestry cycle'; cyclic.parent = null; });
1069
+ break;
1070
+ }
1071
+ positions.set(current, path.length); path.push(current); current = current.parent;
1072
+ }
1073
+ });
1074
+ entries.forEach(function (entry) { if (entry.parent) entry.parent.children.push(entry); });
1075
+ var ordered = [], visited = new Set();
1076
+ function appendTree(rootEntry, unresolved) {
1077
+ var pending = [{ entry: rootEntry, level: 0 }];
1078
+ while (pending.length) {
1079
+ var next = pending.pop(), entry = next.entry;
1080
+ if (visited.has(entry)) continue;
1081
+ visited.add(entry); entry.level = next.level; entry.unresolved = unresolved; ordered.push(entry);
1082
+ for (var i = entry.children.length - 1; i >= 0; i--) pending.push({ entry: entry.children[i], level: next.level + 1 });
1083
+ }
1084
+ }
1085
+ entries.filter(function (entry) { return !entry.parent && !entry.issue; }).forEach(function (entry) { appendTree(entry, false); });
1086
+ entries.filter(function (entry) { return !entry.parent && entry.issue; }).forEach(function (entry) { appendTree(entry, true); });
1087
+ entries.forEach(function (entry) { if (!visited.has(entry)) appendTree(entry, true); });
1088
+ return ordered;
1089
+ }
1090
+ // Every link selects an invocation entry, never a potentially repeated display name.
1091
+ function tlDetailEl(entry, s, sessionStart, select) {
1000
1092
  var panel = el('div', '');
1001
- if (!d) {
1002
- panel.appendChild(el('div', 'tl-side-empty', 'Click a timeline step to see details.'));
1093
+ if (!entry) {
1094
+ panel.appendChild(el('div', 'tl-side-empty', 'Select a timeline step to see details.'));
1003
1095
  return panel;
1004
1096
  }
1097
+ var d = entry.d;
1005
1098
  var color = PALETTE[hashStr(d.kind + ':' + d.name) % PALETTE.length];
1006
1099
  var nameEl = el('div', 'tl-side-name');
1007
1100
  var dot = el('span', 'tl-side-dot'); dot.style.background = color;
1008
- nameEl.appendChild(dot);
1009
- nameEl.appendChild(document.createTextNode(d.kind + ' · ' + d.name));
1010
- panel.appendChild(nameEl);
1011
- var hasCost = d.costUSD != null;
1012
- var hasTok = d.tokens != null;
1013
- var startOffset = sessionStart != null && d.start != null ? Math.max(0, d.start - sessionStart) : null;
1101
+ nameEl.appendChild(dot); nameEl.appendChild(document.createTextNode(entry.label)); panel.appendChild(nameEl);
1102
+ var statusLine = el('div', 'tl-status', esc(traceStatus(d)));
1103
+ if (entry.issue) statusLine.appendChild(document.createTextNode(' · ' + entry.issue));
1104
+ panel.appendChild(statusLine);
1105
+ if (Number.isFinite(d.depth)) panel.appendChild(el('p', 'tl-note', 'Recorded nesting level: ' + esc(d.depth) + '.'));
1106
+ if (d.id != null) {
1107
+ var identity = el('div', 'tl-identity');
1108
+ identity.appendChild(el('span', 'modal-mono', esc(d.id)));
1109
+ identity.appendChild(copyButton(function () { return String(d.id); }, 'Copy step ID'));
1110
+ panel.appendChild(identity);
1111
+ }
1112
+ if (entry.parent) {
1113
+ var parentButton = el('button', 'tl-link', '↑ Parent: ' + esc(entry.parent.label)); parentButton.type = 'button';
1114
+ parentButton.addEventListener('click', function () { select(entry.parent, true); }); panel.appendChild(parentButton);
1115
+ } else if (entry.issue) panel.appendChild(el('p', 'tl-note tl-warning', 'This step remains separate because its parent relationship is unresolved.'));
1116
+ else if (d.ownerAgentId === s.sessionId || d.ownerAgentId === 'root' || d.relationshipStatus === 'root') panel.appendChild(el('p', 'tl-note', 'Owned by the session root.'));
1117
+ else if (d.relationshipStatus == null) panel.appendChild(el('p', 'tl-note', 'Parent relationship was not recorded.'));
1118
+ var estimated = d.attributionStatus === 'estimated';
1119
+ var hasOwn = d.attributionScope === 'own' || d.inclusiveTokens != null;
1120
+ var hasInclusive = d.inclusiveTokens != null || d.inclusiveCostUSD != null;
1121
+ var hasDescendants = hasInclusive && entry.children.length > 0;
1122
+ var totalCost = d.inclusiveCostUSD != null ? d.inclusiveCostUSD : d.costUSD;
1123
+ var totalTokens = d.inclusiveTokens || d.tokens;
1124
+ var incomplete = d.status === 'incomplete' || d.status === 'unknown';
1014
1125
  panel.appendChild(statsEl([
1015
- ['Cost', hasCost ? fmtUSD(d.costUSD) : '—', ''],
1016
- ['Tokens', hasTok ? fmtTokens(d.tokens.total) : '—', ''],
1017
- ['Duration', fmtTimelineDuration(d.durationMs), ''],
1018
- ['Started', startOffset != null ? fmtTimelineDuration(startOffset) : '—', 'into session'],
1126
+ [estimated ? 'Estimated cost' : hasInclusive ? 'Total cost' : 'Cost', totalCost != null ? fmtExactUSD(totalCost) : '—', costSourceLabel(s)],
1127
+ [estimated ? 'Estimated tokens' : hasInclusive ? 'Total tokens' : 'Tokens', totalTokens ? fmtNum(totalTokens.total) : '—', ''],
1128
+ [incomplete ? 'Observed elapsed' : 'Elapsed', d.status === 'unknown' && !d.observedEnd ? 'Unknown' : fmtTimelineDuration(traceElapsed(d)), d.status === 'unknown' && !d.observedEnd ? '' : fmtNum(traceElapsed(d)) + ' ms'],
1129
+ ['Started', Number.isFinite(d.start) ? fmtTimelineDuration(Math.max(0, d.start - sessionStart)) : '—', 'into session']
1019
1130
  ]));
1020
- if (hasTok) {
1021
- var tok = d.tokens;
1022
- var total = Math.max(tok.total, 1);
1131
+ if (hasDescendants) {
1132
+ var orchestration = el('div', 'tl-side-section');
1133
+ orchestration.appendChild(el('div', 'tl-side-label', 'Parent orchestration only'));
1134
+ orchestration.appendChild(statsEl([
1135
+ ['Orchestration cost', d.costUSD != null ? fmtExactUSD(d.costUSD) : '—', ''],
1136
+ ['Orchestration tokens', d.tokens ? fmtNum(d.tokens.total) : '—', '']
1137
+ ]));
1138
+ orchestration.appendChild(el('p', 'tl-note', 'The total above includes this parent and every descendant. Orchestration is the parent agent\'s direct model usage only. Child totals overlap the parent total; do not add them together.'));
1139
+ panel.appendChild(orchestration);
1140
+ }
1141
+ if (estimated) panel.appendChild(el('p', 'tl-note', 'Estimated from this owner’s activity during the step. Overlapping skill or command estimates are not additional session cost.'));
1142
+ else if (d.attributionStatus === 'ambiguous') panel.appendChild(el('p', 'tl-note tl-warning', 'Usage cannot be assigned confidently while the relationship is unresolved.'));
1143
+ else if (d.attributionStatus === 'unavailable') panel.appendChild(el('p', 'tl-note', 'Usage attribution is unavailable for this step.'));
1144
+ if (incomplete) panel.appendChild(el('p', 'tl-note tl-warning', 'Completion was not recorded. The bar shows only activity observed in this snapshot.'));
1145
+ if (entry.outside) panel.appendChild(el('p', 'tl-note tl-warning', 'Some timing evidence is outside the captured session bounds. The bar is clipped to those bounds.'));
1146
+ var timing = el('div', 'tl-side-section');
1147
+ timing.appendChild(el('div', 'tl-side-label', 'Timing evidence'));
1148
+ var timingRows = [['Started', d.start]];
1149
+ if (d.acknowledgedAt != null) timingRows.push(['Acknowledged', d.acknowledgedAt]);
1150
+ if (d.observedEnd != null) timingRows.push(['Last observed activity', d.observedEnd]);
1151
+ if (d.completedAt != null) timingRows.push(['Completion recorded', d.completedAt]);
1152
+ timingRows.forEach(function (item) { timing.appendChild(el('div', 'tl-evidence', '<span>' + esc(item[0]) + '</span><time>' + esc(exactWhen(item[1])) + '</time>')); });
1153
+ if (d.acknowledgedAt != null && Number.isFinite(d.start)) timing.appendChild(el('p', 'tl-note', 'Acknowledgement delay: ' + esc(fmtTimelineDuration(Math.max(0, d.acknowledgedAt - d.start))) + '.'));
1154
+ panel.appendChild(timing);
1155
+ if (d.tokens) {
1156
+ var tok = d.tokens, total = Math.max(tok.total, 1);
1023
1157
  var barEl = el('div', 'tl-tok-bar');
1024
- var segs = [
1025
- { val: tok.input, color: '#7C5CFC' },
1026
- { val: tok.output, color: '#F5A534' },
1027
- { val: tok.cacheRead, color: '#259F4C' },
1028
- { val: tok.cacheCreation, color: '#3B82F6' },
1029
- ].filter(function(s) { return s.val > 0; });
1030
- segs.forEach(function(s) {
1031
- var seg = el('div', 'tl-tok-seg');
1032
- seg.style.flex = String(s.val / total * 100);
1033
- seg.style.background = s.color;
1034
- barEl.appendChild(seg);
1158
+ [{ val: tok.input, color: '#7C5CFC' }, { val: tok.output, color: '#F5A534' }, { val: tok.cacheRead, color: '#259F4C' }, { val: tok.cacheCreation, color: '#3B82F6' }].filter(function (item) { return item.val > 0; }).forEach(function (item) {
1159
+ var segment = el('div', 'tl-tok-seg'); segment.style.flex = String(item.val / total * 100); segment.style.background = item.color; barEl.appendChild(segment);
1035
1160
  });
1036
1161
  var tokSec = el('div', 'tl-side-section');
1037
- tokSec.appendChild(el('div', 'tl-side-label', 'Token breakdown'));
1038
- tokSec.appendChild(barEl);
1039
- tokSec.appendChild(statsEl([
1040
- ['Input', fmtTokens(tok.input), ''],
1041
- ['Output', fmtTokens(tok.output), ''],
1042
- ['Cache read', fmtTokens(tok.cacheRead), ''],
1043
- ['Cache write', fmtTokens(tok.cacheCreation), ''],
1044
- ]));
1162
+ tokSec.appendChild(el('div', 'tl-side-label', hasDescendants ? 'Orchestration token breakdown' : hasOwn ? 'Direct token breakdown' : 'Token breakdown')); tokSec.appendChild(barEl);
1163
+ tokSec.appendChild(statsEl([['Input', fmtNum(tok.input), ''], ['Output', fmtNum(tok.output), ''], ['Cache read', fmtNum(tok.cacheRead), ''], ['Cache write', fmtNum(tok.cacheCreation), '']]));
1045
1164
  panel.appendChild(tokSec);
1046
1165
  }
1047
1166
  if (d.tools && d.tools.length) {
1048
- var toolSec = el('div', 'tl-side-section');
1049
- toolSec.appendChild(el('div', 'tl-side-label', 'Tools called'));
1167
+ var toolSec = el('div', 'tl-side-section'); toolSec.appendChild(el('div', 'tl-side-label', 'Tools called'));
1050
1168
  var chips = el('div', 'modal-chips');
1051
- d.tools.forEach(function(t) {
1052
- chips.appendChild(el('span', 'chip', esc(t.name) + '<b>\xd7' + fmtNum(t.calls) + '</b>'));
1169
+ d.tools.forEach(function (tool) { chips.appendChild(el('span', 'chip', esc(tool.name) + '<b>×' + fmtNum(tool.calls) + '</b>')); });
1170
+ toolSec.appendChild(chips); panel.appendChild(toolSec);
1171
+ }
1172
+ if (entry.children.length) {
1173
+ var children = el('div', 'tl-side-section'); children.appendChild(el('div', 'tl-side-label', 'Child steps (' + entry.children.length + ')'));
1174
+ entry.children.forEach(function (child) {
1175
+ var button = el('button', 'tl-link', '↳ ' + esc(child.label)); button.type = 'button';
1176
+ button.addEventListener('click', function () { select(child, true); }); children.appendChild(button);
1053
1177
  });
1054
- toolSec.appendChild(chips);
1055
- panel.appendChild(toolSec);
1178
+ panel.appendChild(children);
1056
1179
  }
1057
1180
  return panel;
1058
1181
  }
1059
- // Gantt of top-level dispatches: session span on top, then every agent/skill/command
1060
- // dispatch positioned by wall-clock start time across the activity window, so each bar
1061
- // sits where it actually ran. Short skills and 0ms commands fall back to the CSS
1062
- // min-width (28px) so they stay visible as markers without distorting the time scale.
1063
1182
  function timelineEl(s) {
1064
- var dispatches = (s.dispatches || []).slice().sort(function (a, b) { return a.start - b.start; });
1065
- // Window = union of the tracked session span and the dispatch activity span. Resumed or
1066
- // compacted sessions can carry transcript dispatches that fall OUTSIDE the tracked
1067
- // start→end window; scaling to the session window alone would clamp them all to left:0%
1068
- // (single-column pile-up). The union positions every bar correctly and collapses back to
1069
- // exactly the session window for the normal case (dispatches fully inside it).
1070
- var winStart = s.startTime;
1071
- var winEnd = s.startTime + (s.durationMs || 0);
1072
- dispatches.forEach(function (d) {
1073
- if (d.start < winStart) winStart = d.start;
1074
- var end = d.start + (d.durationMs || 0);
1075
- if (end > winEnd) winEnd = end;
1183
+ var entries = traceEntries(s);
1184
+ var collapsed = new Set();
1185
+ var capturedBounds = Number.isFinite(s.observedStart) && Number.isFinite(s.observedEnd) && s.observedEnd >= s.observedStart;
1186
+ var firstTimed = entries.find(function (entry) { return Number.isFinite(entry.d.start); });
1187
+ var winStart = capturedBounds ? s.observedStart : (Number.isFinite(s.startTime) ? s.startTime : firstTimed ? firstTimed.d.start : 0);
1188
+ var winEnd = capturedBounds ? s.observedEnd : winStart + Math.max(0, s.durationMs || 0);
1189
+ if (!capturedBounds) entries.forEach(function (entry) {
1190
+ if (!Number.isFinite(entry.d.start)) return;
1191
+ winStart = Math.min(winStart, entry.d.start); winEnd = Math.max(winEnd, entry.d.start + traceElapsed(entry.d));
1076
1192
  });
1077
- var ganttSpan = Math.max(1, winEnd - winStart);
1078
-
1193
+ var span = Math.max(1, winEnd - winStart);
1194
+ var wrap = el('div', 'tl-wrap');
1195
+ var summary = entries.length + ' steps · ' + sumCalls(dispatchCounts(s, 'agent')) + ' agents · ' + sumCalls(dispatchCounts(s, 'skill')) + ' skills · ' + sumCalls(dispatchCounts(s, 'command')) + ' commands';
1196
+ wrap.appendChild(el('p', 'tl-note tl-summary', esc(summary)));
1197
+ wrap.appendChild(el('p', 'tl-note', (capturedBounds ? 'Captured activity: ' : 'Activity window: ') + esc(exactWhen(winStart)) + ' to ' + esc(exactWhen(winEnd)) + '.'));
1198
+ if (!s.dispatchesComplete) wrap.appendChild(el('p', 'tl-note', 'This older source may contain only part of the timeline; invocation totals use the available session summaries.'));
1079
1199
  var container = el('div', 'tl-container');
1080
- var gantt = el('div', 'tl-gantt timeline');
1081
- var sidePane = el('div', 'tl-side');
1082
-
1083
- var selected = dispatches.filter(function (d) { return d.kind === 'agent'; })[0] || dispatches[0] || null;
1084
- sidePane.appendChild(tlDetailEl(selected, winStart));
1085
-
1086
- function selectDispatch(d, barEl) {
1087
- gantt.querySelectorAll('.tl-bar[data-dispatch]').forEach(function(b) {
1088
- b.style.outline = b === barEl ? '2px solid rgba(255,255,255,0.55)' : 'none';
1200
+ var gantt = el('div', 'tl-gantt timeline'); gantt.setAttribute('aria-label', 'Session timeline');
1201
+ var sidePane = el('div', 'tl-side'); sidePane.setAttribute('role', 'region'); sidePane.setAttribute('aria-label', 'Selected step details'); sidePane.setAttribute('aria-live', 'polite');
1202
+ var selected = entries.filter(function (entry) { return entry.d.kind === 'agent'; })[0] || entries[0] || null;
1203
+ var rowByEntry = new Map();
1204
+ function rowLabel(entry) {
1205
+ var disclosure = entry.children.length ? (collapsed.has(entry) ? '▸ ' : '▾ ') : (entry.level ? '↳ ' : '');
1206
+ return disclosure + entry.label + (entry.issue ? ' · unresolved' : '');
1207
+ }
1208
+ function refreshTreeVisibility() {
1209
+ entries.forEach(function (entry) {
1210
+ var ancestor = entry.parent, hidden = false;
1211
+ while (ancestor) {
1212
+ if (collapsed.has(ancestor)) { hidden = true; break; }
1213
+ ancestor = ancestor.parent;
1214
+ }
1215
+ var row = rowByEntry.get(entry);
1216
+ if (!row) return;
1217
+ row.hidden = hidden;
1218
+ var labelEl = row.querySelector('.tl-label');
1219
+ labelEl.textContent = rowLabel(entry);
1220
+ labelEl.title = entry.label;
1221
+ if (entry.children.length) row.setAttribute('aria-expanded', collapsed.has(entry) ? 'false' : 'true');
1089
1222
  });
1090
- sidePane.innerHTML = '';
1091
- sidePane.appendChild(tlDetailEl(d, winStart));
1092
1223
  }
1093
-
1094
- // Session bar spans the full window (the activity envelope). Its label shows the envelope
1095
- // span — equal to the tracked duration in the normal case, but revealing the true span when
1096
- // the tracked duration under-counts (e.g. dispatches predating a post-compaction window).
1097
- gantt.appendChild(tlRow('session', '#259F4C', 0, 100, fmtTimelineDuration(ganttSpan), fmtUSD(s.costUSD), true));
1098
-
1099
- var occ = {};
1100
- dispatches.forEach(function (d) {
1101
- var key = d.kind + ':' + d.name;
1102
- var total = dispatches.filter(function (x) { return x.kind === d.kind && x.name === d.name; }).length;
1103
- occ[key] = (occ[key] || 0) + 1;
1104
- var label = d.kind + ' · ' + d.name + (total > 1 ? ' #' + occ[key] : '');
1105
- var leftPct = Math.max(0, (d.start - winStart) / ganttSpan * 100);
1106
- var wPct = (d.durationMs || 0) / ganttSpan * 100;
1107
- if (leftPct + wPct > 100) wPct = Math.max(0, 100 - leftPct);
1108
- var barText = d.costUSD != null && wPct >= 8 ? fmtUSD(d.costUSD) : '';
1109
- var color = PALETTE[hashStr(key) % PALETTE.length];
1110
- var row = tlRow(label, color, leftPct, wPct, fmtTimelineDuration(d.durationMs), barText, false);
1111
- var bar = row.querySelector('.tl-bar');
1112
- if (bar) {
1113
- bar.setAttribute('data-dispatch', key);
1114
- if (d === selected) bar.style.outline = '2px solid rgba(255,255,255,0.55)';
1224
+ function selectDispatch(entry, focus) {
1225
+ if (focus) {
1226
+ var ancestor = entry.parent;
1227
+ while (ancestor) { collapsed.delete(ancestor); ancestor = ancestor.parent; }
1228
+ refreshTreeVisibility();
1229
+ }
1230
+ selected = entry;
1231
+ rowByEntry.forEach(function (row, candidate) { row.classList.toggle('tl-selected', candidate === entry); row.setAttribute('aria-pressed', candidate === entry ? 'true' : 'false'); });
1232
+ sidePane.innerHTML = ''; sidePane.appendChild(tlDetailEl(entry, s, winStart, selectDispatch));
1233
+ var row = rowByEntry.get(entry);
1234
+ if (focus && row) { row.focus({ preventScroll: true }); row.scrollIntoView({ block: 'nearest' }); }
1235
+ }
1236
+ gantt.appendChild(tlRow('session', '#259F4C', 0, 100, fmtTimelineDuration(Math.max(0, winEnd - winStart)), fmtUSD(s.costUSD), true));
1237
+ var unresolvedHeading = false;
1238
+ entries.forEach(function (entry) {
1239
+ var d = entry.d, duration = traceElapsed(d);
1240
+ if (entry.unresolved && !unresolvedHeading) {
1241
+ unresolvedHeading = true;
1242
+ gantt.appendChild(el('div', 'tl-group-label', 'Unresolved relationships (' + entries.filter(function (item) { return item.unresolved; }).length + ')'));
1115
1243
  }
1116
- row.style.cursor = 'pointer';
1117
- row.addEventListener('click', function () { selectDispatch(d, bar); });
1118
- gantt.appendChild(row);
1244
+ var start = Number.isFinite(d.start) ? d.start : winStart;
1245
+ entry.outside = start < winStart || start + duration > winEnd;
1246
+ var left = Math.max(0, Math.min(100, (start - winStart) / span * 100));
1247
+ var width = Math.max(0, (Math.min(winEnd, start + duration) - Math.max(winStart, start)) / span * 100);
1248
+ var label = rowLabel(entry);
1249
+ var durationText = d.status === 'unknown' && !d.observedEnd ? 'Unknown' : (d.status === 'incomplete' ? '≥ ' : '') + fmtTimelineDuration(duration);
1250
+ var displayedCost = d.kind === 'agent' && d.inclusiveCostUSD != null ? d.inclusiveCostUSD : d.costUSD;
1251
+ var row = tlRow(label, PALETTE[hashStr(d.kind + ':' + d.name) % PALETTE.length], left, width, durationText, displayedCost != null && width >= 10 ? fmtUSD(displayedCost) : '', false);
1252
+ row.setAttribute('data-dispatch', entry.key);
1253
+ row.setAttribute('aria-label', entry.label + ', level ' + (entry.level + 1) + ', ' + traceStatus(d) + (entry.children.length ? ', expandable' : '') + (entry.issue ? ', ' + entry.issue : ''));
1254
+ row.querySelector('.tl-label').style.paddingLeft = Math.min(72, entry.level * 12) + 'px';
1255
+ if (entry.unresolved) row.classList.add('tl-unresolved');
1256
+ row.addEventListener('click', function () {
1257
+ selectDispatch(entry, false);
1258
+ if (entry.children.length) {
1259
+ if (collapsed.has(entry)) collapsed.delete(entry); else collapsed.add(entry);
1260
+ refreshTreeVisibility();
1261
+ }
1262
+ });
1263
+ rowByEntry.set(entry, row); gantt.appendChild(row);
1119
1264
  });
1120
-
1121
- container.appendChild(gantt);
1122
- container.appendChild(sidePane);
1123
- return container;
1265
+ refreshTreeVisibility();
1266
+ selectDispatch(selected, false);
1267
+ container.appendChild(gantt); container.appendChild(sidePane); wrap.appendChild(container);
1268
+ return wrap;
1124
1269
  }
1125
1270
  /**
1126
1271
  * Rebuild a single-session ReportPayload matching what
@@ -1159,6 +1304,7 @@
1159
1304
  };
1160
1305
  // Same conditional-spread semantics as buildPayload: omit rather than emit null.
1161
1306
  if (DATA.meta && DATA.meta.userEmail !== undefined) meta.userEmail = DATA.meta.userEmail;
1307
+ if (s.capturedAt !== undefined) meta.capturedAt = s.capturedAt;
1162
1308
  if (Number.isFinite(s.startTime) && s.startTime > 0) {
1163
1309
  meta.periodStart = new Date(s.startTime).toISOString();
1164
1310
  meta.periodEnd = new Date(s.startTime + Math.max(Number.isFinite(s.durationMs) ? s.durationMs : 0, 0)).toISOString();
@@ -1169,8 +1315,10 @@
1169
1315
  function openSessionModal(s, onBack) {
1170
1316
  if (!s) return;
1171
1317
  closeSessionModal();
1318
+ modalReturnFocus = document.activeElement;
1172
1319
  var ov = el('div', 'modal-overlay'); ov.id = 'session-modal';
1173
- var modal = el('div', 'modal');
1320
+ var modal = el('div', 'modal timeline-modal');
1321
+ modal.setAttribute('role', 'dialog'); modal.setAttribute('aria-modal', 'true'); modal.setAttribute('aria-label', 'Session details');
1174
1322
 
1175
1323
  // header — every interpolation through esc(); title is arbitrary user text (XSS vector).
1176
1324
  var head = el('div', 'modal-head');
@@ -1240,15 +1388,16 @@
1240
1388
  // which bills in premium requests rather than tokens, and whose older CLI versions
1241
1389
  // recorded no telemetry at all). Appended so other agents' cards are unchanged.
1242
1390
  var costRows = [
1243
- ['Cost', s.usageUnavailableReason ? '—' : fmtUSD(s.costUSD), s.usageUnavailableReason ? 'not measurable' : 'API-equivalent'],
1391
+ ['Cost', s.usageUnavailableReason ? '—' : fmtExactUSD(s.costUSD), s.usageUnavailableReason ? 'not measurable' : costSourceLabel(s)],
1244
1392
  ['Cache-read', s.cacheReadCostUSD ? fmtUSD(s.cacheReadCostUSD) : '—', ''],
1245
- ['Duration', fmtDuration(s.durationMs || 0), ''],
1393
+ ['Duration', fmtTimelineDuration(s.durationMs || 0), fmtNum(s.durationMs) + ' ms'],
1246
1394
  ['Started', '<span class="mval-sm">' + esc(fmtWhen(s.startTime)) + '</span>', '']
1247
1395
  ];
1248
1396
  if (s.premiumRequests !== undefined) {
1249
1397
  costRows.push(['Premium requests', fmtNum(s.premiumRequests), 'provider billing unit']);
1250
1398
  }
1251
1399
  var costCard = card('Cost & Time'); costCard._body.appendChild(statsEl(costRows));
1400
+ if (s.capturedAt !== undefined) costCard._body.appendChild(el('p', 'tl-note', 'Captured ' + esc(exactWhen(s.capturedAt)) + '.'));
1252
1401
  if (s.usageUnavailableReason) {
1253
1402
  costCard._body.appendChild(el('div', 'text-muted', '<span style="font-size:12px">' + esc(s.usageUnavailableReason) + '</span>'));
1254
1403
  } else if (s.usagePartial) {
@@ -1269,6 +1418,26 @@
1269
1418
  grid3.appendChild(costCard); grid3.appendChild(tokCard); grid3.appendChild(actCard);
1270
1419
  body.appendChild(grid3);
1271
1420
 
1421
+ if (s.rootOwnTokens && s.unlinkedTokens) {
1422
+ var allocation = card('Usage allocation', 'each response belongs to one row; parent totals overlap child rows');
1423
+ var linkedTokens = Math.max(0, (t.total || 0) - s.rootOwnTokens.total - s.unlinkedTokens.total);
1424
+ var linkedCost = s.rootOwnCostUSD != null && s.unlinkedCostUSD != null ? Math.max(0, s.costUSD - s.rootOwnCostUSD - s.unlinkedCostUSD) : null;
1425
+ allocation._body.appendChild(el('div', 'tl-allocation', tableHTML(['Owner', 'Tokens', 'Cost'], [
1426
+ ['Session root', fmtNum(s.rootOwnTokens.total), fmtExactUSD(s.rootOwnCostUSD)],
1427
+ ['Linked agents · own usage across all levels', fmtNum(linkedTokens), fmtExactUSD(linkedCost)],
1428
+ ['Unlinked usage', fmtNum(s.unlinkedTokens.total), fmtExactUSD(s.unlinkedCostUSD)],
1429
+ ['Session total', fmtNum(t.total), fmtExactUSD(s.costUSD)]
1430
+ ], [false, true, true])));
1431
+ allocation._body.appendChild(el('p', 'tl-note', 'A parent agent’s total includes all descendants. Adding parent and child totals would count their usage again.'));
1432
+ if (s.unlinkedAgentIds && s.unlinkedAgentIds.length) {
1433
+ var unlinked = el('details', 'tl-unlinked-agents');
1434
+ unlinked.appendChild(el('summary', '', 'Unlinked agents (' + fmtNum(s.unlinkedAgentIds.length) + ')'));
1435
+ var list = el('ul', ''); s.unlinkedAgentIds.forEach(function (id) { list.appendChild(el('li', 'modal-mono', esc(id))); });
1436
+ unlinked.appendChild(list); allocation._body.appendChild(unlinked);
1437
+ }
1438
+ body.appendChild(allocation);
1439
+ }
1440
+
1272
1441
  // Code changes
1273
1442
  var ccCard = card('Code changes'); ccCard._body.appendChild(statsEl([
1274
1443
  ['Files changed', fmtNum(s.filesChanged || 0), 'written or edited'],
@@ -1279,7 +1448,7 @@
1279
1448
  body.appendChild(ccCard);
1280
1449
 
1281
1450
  // Token & cost growth chart (backfilled per-turn series; honest fallback when absent)
1282
- var growth = card('Token & cost growth', 'cumulative per turn — from the native log');
1451
+ var growth = card('Token & cost growth', 'cumulative cost and token usage across the session');
1283
1452
  var series = s.costSeries || [];
1284
1453
  if (series.length >= 2 && window.Chart) {
1285
1454
  var useTs = series[0].t > 1e12; // epoch ms vs turn ordinal
@@ -1289,7 +1458,7 @@
1289
1458
  makeModalChart(cv, {
1290
1459
  type: 'line',
1291
1460
  data: { labels: labels, datasets: [
1292
- { label: 'Cost ($)', data: series.map(function (p) { return Math.round(p.cost * 10000) / 10000; }), borderColor: '#7C5CFC', backgroundColor: 'rgba(124,92,252,0.12)', fill: true, yAxisID: 'y', tension: 0.25, pointRadius: 0 },
1461
+ { label: 'Cost ($)', data: series.map(function (p) { return p.cost; }), borderColor: '#7C5CFC', backgroundColor: 'rgba(124,92,252,0.12)', fill: true, yAxisID: 'y', tension: 0.25, pointRadius: 0 },
1293
1462
  { label: 'Tokens', data: series.map(function (p) { return p.tokens; }), borderColor: '#F5A534', backgroundColor: 'transparent', fill: false, yAxisID: 'y1', tension: 0.25, pointRadius: 0 }
1294
1463
  ] },
1295
1464
  options: { interaction: { mode: 'index', intersect: false }, plugins: { legend: { display: true } },
@@ -1302,10 +1471,9 @@
1302
1471
  }
1303
1472
  body.appendChild(growth);
1304
1473
 
1305
- // Timeline — Gantt of all top-level agent, skill, and command dispatches.
1474
+ // Timeline — every recorded invocation with exact parent/owner links when available.
1306
1475
  var hasDispatches = (s.dispatches || []).length > 0;
1307
- var hasCostData = (s.dispatches || []).some(function (d) { return d.costUSD != null; });
1308
- var tlSubtitle = hasDispatches ? (hasCostData ? 'click a step for cost, token & timing details · positioned across the session' : 'click a step for timing details · positioned across the session') : '';
1476
+ var tlSubtitle = hasDispatches ? 'select any step for ancestry, total and orchestration usage, and timing evidence' : '';
1309
1477
  var tlCard = card('Timeline', tlSubtitle);
1310
1478
  if (hasDispatches) {
1311
1479
  tlCard._body.appendChild(timelineEl(s));
@@ -1320,9 +1488,18 @@
1320
1488
  modal.appendChild(body);
1321
1489
  ov.appendChild(modal);
1322
1490
  ov.addEventListener('click', function (ev) { if (ev.target === ov) closeSessionModal(); });
1323
- modalEsc = function (ev) { if (ev.key === 'Escape') closeSessionModal(); };
1491
+ modalEsc = function (ev) {
1492
+ if (ev.key === 'Escape') { closeSessionModal(); return; }
1493
+ if (ev.key !== 'Tab') return;
1494
+ var focusable = Array.from(modal.querySelectorAll('button:not([disabled]), a[href], input, select, textarea, summary, [tabindex="0"]')).filter(function (node) { return node.offsetParent !== null; });
1495
+ if (!focusable.length) return;
1496
+ var first = focusable[0], last = focusable[focusable.length - 1];
1497
+ if (ev.shiftKey && (document.activeElement === first || !modal.contains(document.activeElement))) { ev.preventDefault(); last.focus(); }
1498
+ else if (!ev.shiftKey && (document.activeElement === last || !modal.contains(document.activeElement))) { ev.preventDefault(); first.focus(); }
1499
+ };
1324
1500
  document.addEventListener('keydown', modalEsc);
1325
1501
  document.body.appendChild(ov);
1502
+ close.focus();
1326
1503
  }
1327
1504
 
1328
1505
  // ---- project-sessions modal --------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"payload-builder.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/analytics/report/payload-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAiB,MAAM,kBAAkB,CAAC;AAErF,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,YAAY,CAAC;AAGjF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,cAAc,GAClB,aAAa,CA+Jf"}
1
+ {"version":3,"file":"payload-builder.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/analytics/report/payload-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAyD,MAAM,kBAAkB,CAAC;AAE7H,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,YAAY,CAAC;AAGjF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6CD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,cAAc,GAClB,aAAa,CAuKf"}