@ironbee-ai/cli 0.6.1 → 0.7.0

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 (381) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +167 -39
  3. package/dist/analysis/code-changes.js +3 -3
  4. package/dist/analysis/code-changes.js.map +1 -1
  5. package/dist/analysis/cross-session.js.map +1 -1
  6. package/dist/analysis/fix-effectiveness.js.map +1 -1
  7. package/dist/analysis/time-analysis.js.map +1 -1
  8. package/dist/analysis/verdict-details.js.map +1 -1
  9. package/dist/analysis/verification-quality.js.map +1 -1
  10. package/dist/analytics/classifier.d.ts +99 -0
  11. package/dist/analytics/classifier.d.ts.map +1 -0
  12. package/dist/analytics/classifier.js +380 -0
  13. package/dist/analytics/classifier.js.map +1 -0
  14. package/dist/analytics/emit.d.ts +67 -0
  15. package/dist/analytics/emit.d.ts.map +1 -0
  16. package/dist/analytics/emit.js +901 -0
  17. package/dist/analytics/emit.js.map +1 -0
  18. package/dist/analytics/errors.d.ts +33 -0
  19. package/dist/analytics/errors.d.ts.map +1 -0
  20. package/dist/analytics/errors.js +93 -0
  21. package/dist/analytics/errors.js.map +1 -0
  22. package/dist/analytics/hook-trigger.d.ts +39 -0
  23. package/dist/analytics/hook-trigger.d.ts.map +1 -0
  24. package/dist/analytics/hook-trigger.js +127 -0
  25. package/dist/analytics/hook-trigger.js.map +1 -0
  26. package/dist/analytics/log.d.ts +44 -0
  27. package/dist/analytics/log.d.ts.map +1 -0
  28. package/dist/analytics/log.js +158 -0
  29. package/dist/analytics/log.js.map +1 -0
  30. package/dist/analytics/merge.d.ts +40 -0
  31. package/dist/analytics/merge.d.ts.map +1 -0
  32. package/dist/analytics/merge.js +527 -0
  33. package/dist/analytics/merge.js.map +1 -0
  34. package/dist/analytics/pricing.d.ts +149 -0
  35. package/dist/analytics/pricing.d.ts.map +1 -0
  36. package/dist/analytics/pricing.js +179 -0
  37. package/dist/analytics/pricing.js.map +1 -0
  38. package/dist/analytics/projection.d.ts +356 -0
  39. package/dist/analytics/projection.d.ts.map +1 -0
  40. package/dist/analytics/projection.js +2281 -0
  41. package/dist/analytics/projection.js.map +1 -0
  42. package/dist/analytics/spawn.d.ts +28 -0
  43. package/dist/analytics/spawn.d.ts.map +1 -0
  44. package/dist/analytics/spawn.js +57 -0
  45. package/dist/analytics/spawn.js.map +1 -0
  46. package/dist/analytics/state.d.ts +58 -0
  47. package/dist/analytics/state.d.ts.map +1 -0
  48. package/dist/analytics/state.js +329 -0
  49. package/dist/analytics/state.js.map +1 -0
  50. package/dist/analytics/transcript.d.ts +150 -0
  51. package/dist/analytics/transcript.d.ts.map +1 -0
  52. package/dist/analytics/transcript.js +276 -0
  53. package/dist/analytics/transcript.js.map +1 -0
  54. package/dist/analytics/types.d.ts +875 -0
  55. package/dist/analytics/types.d.ts.map +1 -0
  56. package/dist/analytics/types.js +31 -0
  57. package/dist/analytics/types.js.map +1 -0
  58. package/dist/clients/base.d.ts +21 -2
  59. package/dist/clients/base.d.ts.map +1 -1
  60. package/dist/clients/claude/commands/ironbee-verify.md +15 -7
  61. package/dist/clients/claude/fragments/command-verify.node.md +33 -0
  62. package/dist/clients/claude/fragments/rule.node.md +29 -0
  63. package/dist/clients/claude/fragments/skill.node.md +77 -0
  64. package/dist/clients/claude/hooks/activity-end.d.ts +13 -0
  65. package/dist/clients/claude/hooks/activity-end.d.ts.map +1 -0
  66. package/dist/clients/claude/hooks/activity-end.js +42 -0
  67. package/dist/clients/claude/hooks/activity-end.js.map +1 -0
  68. package/dist/clients/claude/hooks/clear-verdict.d.ts +9 -4
  69. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
  70. package/dist/clients/claude/hooks/clear-verdict.js +50 -12
  71. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  72. package/dist/clients/claude/hooks/require-verdict.d.ts +8 -3
  73. package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
  74. package/dist/clients/claude/hooks/require-verdict.js +17 -6
  75. package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
  76. package/dist/clients/claude/hooks/require-verification.d.ts +7 -4
  77. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
  78. package/dist/clients/claude/hooks/require-verification.js +44 -22
  79. package/dist/clients/claude/hooks/require-verification.js.map +1 -1
  80. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  81. package/dist/clients/claude/hooks/session-end.js +17 -2
  82. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  83. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  84. package/dist/clients/claude/hooks/session-start.js +2 -1
  85. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  86. package/dist/clients/claude/hooks/track-action-monitor.d.ts +27 -0
  87. package/dist/clients/claude/hooks/track-action-monitor.d.ts.map +1 -0
  88. package/dist/clients/claude/hooks/track-action-monitor.js +126 -0
  89. package/dist/clients/claude/hooks/track-action-monitor.js.map +1 -0
  90. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  91. package/dist/clients/claude/hooks/track-action.js +29 -20
  92. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  93. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  94. package/dist/clients/claude/hooks/verify-gate.js +18 -1
  95. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  96. package/dist/clients/claude/index.d.ts +4 -1
  97. package/dist/clients/claude/index.d.ts.map +1 -1
  98. package/dist/clients/claude/index.js +185 -94
  99. package/dist/clients/claude/index.js.map +1 -1
  100. package/dist/clients/claude/rules/ironbee-verification.md +41 -33
  101. package/dist/clients/claude/skills/ironbee-verification.md +93 -76
  102. package/dist/clients/cursor/commands/ironbee-verify/SKILL.md +18 -10
  103. package/dist/clients/cursor/fragments/command-verify.node.md +33 -0
  104. package/dist/clients/cursor/fragments/rule.node.md +29 -0
  105. package/dist/clients/cursor/fragments/skill.node.md +77 -0
  106. package/dist/clients/cursor/hooks/activity-end.d.ts +14 -0
  107. package/dist/clients/cursor/hooks/activity-end.d.ts.map +1 -0
  108. package/dist/clients/cursor/hooks/activity-end.js +45 -0
  109. package/dist/clients/cursor/hooks/activity-end.js.map +1 -0
  110. package/dist/clients/cursor/hooks/clear-verdict.d.ts +13 -4
  111. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
  112. package/dist/clients/cursor/hooks/clear-verdict.js +59 -14
  113. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  114. package/dist/clients/cursor/hooks/require-verdict.d.ts +8 -3
  115. package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -1
  116. package/dist/clients/cursor/hooks/require-verdict.js +17 -6
  117. package/dist/clients/cursor/hooks/require-verdict.js.map +1 -1
  118. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
  119. package/dist/clients/cursor/hooks/require-verification.js +42 -16
  120. package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
  121. package/dist/clients/cursor/hooks/session-end.d.ts.map +1 -1
  122. package/dist/clients/cursor/hooks/session-end.js +18 -2
  123. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  124. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  125. package/dist/clients/cursor/hooks/session-start.js +2 -1
  126. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  127. package/dist/clients/cursor/hooks/track-action-monitor.d.ts +27 -0
  128. package/dist/clients/cursor/hooks/track-action-monitor.d.ts.map +1 -0
  129. package/dist/clients/cursor/hooks/track-action-monitor.js +133 -0
  130. package/dist/clients/cursor/hooks/track-action-monitor.js.map +1 -0
  131. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  132. package/dist/clients/cursor/hooks/track-action.js +51 -23
  133. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  134. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  135. package/dist/clients/cursor/hooks/verify-gate.js +14 -1
  136. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  137. package/dist/clients/cursor/index.d.ts +4 -1
  138. package/dist/clients/cursor/index.d.ts.map +1 -1
  139. package/dist/clients/cursor/index.js +131 -65
  140. package/dist/clients/cursor/index.js.map +1 -1
  141. package/dist/clients/cursor/rules/ironbee-verification.mdc +37 -29
  142. package/dist/clients/cursor/skills/ironbee-verification.md +93 -76
  143. package/dist/clients/registry.d.ts +14 -0
  144. package/dist/clients/registry.d.ts.map +1 -1
  145. package/dist/clients/registry.js +34 -0
  146. package/dist/clients/registry.js.map +1 -1
  147. package/dist/commands/analyze.d.ts.map +1 -1
  148. package/dist/commands/analyze.js +40 -0
  149. package/dist/commands/analyze.js.map +1 -1
  150. package/dist/commands/backend-toggle.d.ts +45 -0
  151. package/dist/commands/backend-toggle.d.ts.map +1 -0
  152. package/dist/commands/backend-toggle.js +192 -0
  153. package/dist/commands/backend-toggle.js.map +1 -0
  154. package/dist/commands/disable-backend.d.ts +14 -0
  155. package/dist/commands/disable-backend.d.ts.map +1 -0
  156. package/dist/commands/disable-backend.js +34 -0
  157. package/dist/commands/disable-backend.js.map +1 -0
  158. package/dist/commands/disable-verification.d.ts +16 -0
  159. package/dist/commands/disable-verification.d.ts.map +1 -0
  160. package/dist/commands/disable-verification.js +36 -0
  161. package/dist/commands/disable-verification.js.map +1 -0
  162. package/dist/commands/enable-backend.d.ts +15 -0
  163. package/dist/commands/enable-backend.d.ts.map +1 -0
  164. package/dist/commands/enable-backend.js +35 -0
  165. package/dist/commands/enable-backend.js.map +1 -0
  166. package/dist/commands/enable-verification.d.ts +14 -0
  167. package/dist/commands/enable-verification.d.ts.map +1 -0
  168. package/dist/commands/enable-verification.js +34 -0
  169. package/dist/commands/enable-verification.js.map +1 -0
  170. package/dist/commands/hook.d.ts.map +1 -1
  171. package/dist/commands/hook.js +60 -0
  172. package/dist/commands/hook.js.map +1 -1
  173. package/dist/commands/import.d.ts +39 -0
  174. package/dist/commands/import.d.ts.map +1 -0
  175. package/dist/commands/import.js +369 -0
  176. package/dist/commands/import.js.map +1 -0
  177. package/dist/commands/install.d.ts.map +1 -1
  178. package/dist/commands/install.js +15 -20
  179. package/dist/commands/install.js.map +1 -1
  180. package/dist/commands/process-analytics.d.ts +18 -0
  181. package/dist/commands/process-analytics.d.ts.map +1 -0
  182. package/dist/commands/process-analytics.js +57 -0
  183. package/dist/commands/process-analytics.js.map +1 -0
  184. package/dist/commands/queue.d.ts +2 -3
  185. package/dist/commands/queue.d.ts.map +1 -1
  186. package/dist/commands/queue.js +2 -3
  187. package/dist/commands/queue.js.map +1 -1
  188. package/dist/commands/status.d.ts.map +1 -1
  189. package/dist/commands/status.js +29 -1
  190. package/dist/commands/status.js.map +1 -1
  191. package/dist/commands/verification-toggle.d.ts +47 -0
  192. package/dist/commands/verification-toggle.d.ts.map +1 -0
  193. package/dist/commands/verification-toggle.js +113 -0
  194. package/dist/commands/verification-toggle.js.map +1 -0
  195. package/dist/commands/verify.d.ts.map +1 -1
  196. package/dist/commands/verify.js +28 -0
  197. package/dist/commands/verify.js.map +1 -1
  198. package/dist/hooks/core/actions.d.ts +77 -70
  199. package/dist/hooks/core/actions.d.ts.map +1 -1
  200. package/dist/hooks/core/actions.js +45 -30
  201. package/dist/hooks/core/actions.js.map +1 -1
  202. package/dist/hooks/core/activity-end.d.ts +20 -0
  203. package/dist/hooks/core/activity-end.d.ts.map +1 -0
  204. package/dist/hooks/core/activity-end.js +23 -0
  205. package/dist/hooks/core/activity-end.js.map +1 -0
  206. package/dist/hooks/core/file-diff.d.ts +19 -0
  207. package/dist/hooks/core/file-diff.d.ts.map +1 -0
  208. package/dist/hooks/core/file-diff.js +39 -0
  209. package/dist/hooks/core/file-diff.js.map +1 -0
  210. package/dist/hooks/core/required-tools.d.ts +30 -0
  211. package/dist/hooks/core/required-tools.d.ts.map +1 -0
  212. package/dist/hooks/core/required-tools.js +70 -0
  213. package/dist/hooks/core/required-tools.js.map +1 -0
  214. package/dist/hooks/core/session-state.d.ts +12 -3
  215. package/dist/hooks/core/session-state.d.ts.map +1 -1
  216. package/dist/hooks/core/session-state.js +59 -0
  217. package/dist/hooks/core/session-state.js.map +1 -1
  218. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  219. package/dist/hooks/core/submit-verdict.js +16 -12
  220. package/dist/hooks/core/submit-verdict.js.map +1 -1
  221. package/dist/hooks/core/tool-use-stash.d.ts +41 -0
  222. package/dist/hooks/core/tool-use-stash.d.ts.map +1 -0
  223. package/dist/hooks/core/tool-use-stash.js +82 -0
  224. package/dist/hooks/core/tool-use-stash.js.map +1 -0
  225. package/dist/hooks/core/verify-gate.d.ts +17 -3
  226. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  227. package/dist/hooks/core/verify-gate.js +315 -119
  228. package/dist/hooks/core/verify-gate.js.map +1 -1
  229. package/dist/import/claude/analytics-runner.d.ts +42 -0
  230. package/dist/import/claude/analytics-runner.d.ts.map +1 -0
  231. package/dist/import/claude/analytics-runner.js +213 -0
  232. package/dist/import/claude/analytics-runner.js.map +1 -0
  233. package/dist/import/claude/discovery.d.ts +22 -0
  234. package/dist/import/claude/discovery.d.ts.map +1 -0
  235. package/dist/import/claude/discovery.js +197 -0
  236. package/dist/import/claude/discovery.js.map +1 -0
  237. package/dist/import/claude/encoding.d.ts +50 -0
  238. package/dist/import/claude/encoding.d.ts.map +1 -0
  239. package/dist/import/claude/encoding.js +110 -0
  240. package/dist/import/claude/encoding.js.map +1 -0
  241. package/dist/import/claude/events/file-change.d.ts +28 -0
  242. package/dist/import/claude/events/file-change.d.ts.map +1 -0
  243. package/dist/import/claude/events/file-change.js +112 -0
  244. package/dist/import/claude/events/file-change.js.map +1 -0
  245. package/dist/import/claude/events/tool-call.d.ts +61 -0
  246. package/dist/import/claude/events/tool-call.d.ts.map +1 -0
  247. package/dist/import/claude/events/tool-call.js +119 -0
  248. package/dist/import/claude/events/tool-call.js.map +1 -0
  249. package/dist/import/claude/runner.d.ts +31 -0
  250. package/dist/import/claude/runner.d.ts.map +1 -0
  251. package/dist/import/claude/runner.js +280 -0
  252. package/dist/import/claude/runner.js.map +1 -0
  253. package/dist/import/claude/summary.d.ts +23 -0
  254. package/dist/import/claude/summary.d.ts.map +1 -0
  255. package/dist/import/claude/summary.js +186 -0
  256. package/dist/import/claude/summary.js.map +1 -0
  257. package/dist/import/claude/transcript-walk.d.ts +52 -0
  258. package/dist/import/claude/transcript-walk.d.ts.map +1 -0
  259. package/dist/import/claude/transcript-walk.js +187 -0
  260. package/dist/import/claude/transcript-walk.js.map +1 -0
  261. package/dist/import/concurrent-pool.d.ts +45 -0
  262. package/dist/import/concurrent-pool.d.ts.map +1 -0
  263. package/dist/import/concurrent-pool.js +95 -0
  264. package/dist/import/concurrent-pool.js.map +1 -0
  265. package/dist/import/emitter.d.ts +29 -0
  266. package/dist/import/emitter.d.ts.map +1 -0
  267. package/dist/import/emitter.js +66 -0
  268. package/dist/import/emitter.js.map +1 -0
  269. package/dist/import/events/activity.d.ts +23 -0
  270. package/dist/import/events/activity.d.ts.map +1 -0
  271. package/dist/import/events/activity.js +45 -0
  272. package/dist/import/events/activity.js.map +1 -0
  273. package/dist/import/events/session.d.ts +24 -0
  274. package/dist/import/events/session.d.ts.map +1 -0
  275. package/dist/import/events/session.js +47 -0
  276. package/dist/import/events/session.js.map +1 -0
  277. package/dist/import/filter.d.ts +47 -0
  278. package/dist/import/filter.d.ts.map +1 -0
  279. package/dist/import/filter.js +90 -0
  280. package/dist/import/filter.js.map +1 -0
  281. package/dist/import/ids.d.ts +56 -0
  282. package/dist/import/ids.d.ts.map +1 -0
  283. package/dist/import/ids.js +87 -0
  284. package/dist/import/ids.js.map +1 -0
  285. package/dist/import/index.d.ts +29 -0
  286. package/dist/import/index.d.ts.map +1 -0
  287. package/dist/import/index.js +52 -0
  288. package/dist/import/index.js.map +1 -0
  289. package/dist/import/marker.d.ts +20 -0
  290. package/dist/import/marker.d.ts.map +1 -0
  291. package/dist/import/marker.js +71 -0
  292. package/dist/import/marker.js.map +1 -0
  293. package/dist/import/pipeline.d.ts +41 -0
  294. package/dist/import/pipeline.d.ts.map +1 -0
  295. package/dist/import/pipeline.js +47 -0
  296. package/dist/import/pipeline.js.map +1 -0
  297. package/dist/import/progress.d.ts +20 -0
  298. package/dist/import/progress.d.ts.map +1 -0
  299. package/dist/import/progress.js +69 -0
  300. package/dist/import/progress.js.map +1 -0
  301. package/dist/import/skip.d.ts +13 -0
  302. package/dist/import/skip.d.ts.map +1 -0
  303. package/dist/import/skip.js +24 -0
  304. package/dist/import/skip.js.map +1 -0
  305. package/dist/import/types.d.ts +125 -0
  306. package/dist/import/types.d.ts.map +1 -0
  307. package/dist/import/types.js +28 -0
  308. package/dist/import/types.js.map +1 -0
  309. package/dist/index.js +21 -2
  310. package/dist/index.js.map +1 -1
  311. package/dist/lib/collector.d.ts +29 -3
  312. package/dist/lib/collector.d.ts.map +1 -1
  313. package/dist/lib/collector.js +118 -8
  314. package/dist/lib/collector.js.map +1 -1
  315. package/dist/lib/config.d.ts +240 -83
  316. package/dist/lib/config.d.ts.map +1 -1
  317. package/dist/lib/config.js +482 -89
  318. package/dist/lib/config.js.map +1 -1
  319. package/dist/lib/event.d.ts +72 -0
  320. package/dist/lib/event.d.ts.map +1 -0
  321. package/dist/lib/event.js +42 -0
  322. package/dist/lib/event.js.map +1 -0
  323. package/dist/lib/gitignore.d.ts +21 -0
  324. package/dist/lib/gitignore.d.ts.map +1 -0
  325. package/dist/lib/gitignore.js +54 -0
  326. package/dist/lib/gitignore.js.map +1 -0
  327. package/dist/lib/runtime-section.d.ts +118 -0
  328. package/dist/lib/runtime-section.d.ts.map +1 -0
  329. package/dist/lib/runtime-section.js +256 -0
  330. package/dist/lib/runtime-section.js.map +1 -0
  331. package/dist/lib/telemetry.d.ts +1 -1
  332. package/dist/lib/telemetry.d.ts.map +1 -1
  333. package/dist/lib/telemetry.js +4 -1
  334. package/dist/lib/telemetry.js.map +1 -1
  335. package/dist/queue/dead-letter.d.ts +5 -1
  336. package/dist/queue/dead-letter.d.ts.map +1 -1
  337. package/dist/queue/dead-letter.js +5 -1
  338. package/dist/queue/dead-letter.js.map +1 -1
  339. package/dist/queue/drain.d.ts +3 -2
  340. package/dist/queue/drain.d.ts.map +1 -1
  341. package/dist/queue/drain.js +3 -2
  342. package/dist/queue/drain.js.map +1 -1
  343. package/dist/queue/flush.d.ts +28 -12
  344. package/dist/queue/flush.d.ts.map +1 -1
  345. package/dist/queue/flush.js +43 -18
  346. package/dist/queue/flush.js.map +1 -1
  347. package/dist/queue/handlers/send-event.d.ts.map +1 -1
  348. package/dist/queue/handlers/send-event.js.map +1 -1
  349. package/dist/queue/index.d.ts +1 -2
  350. package/dist/queue/index.d.ts.map +1 -1
  351. package/dist/queue/index.js +2 -2
  352. package/dist/queue/index.js.map +1 -1
  353. package/dist/queue/paths.d.ts +4 -2
  354. package/dist/queue/paths.d.ts.map +1 -1
  355. package/dist/queue/paths.js +4 -2
  356. package/dist/queue/paths.js.map +1 -1
  357. package/dist/queue/process-file.d.ts +5 -1
  358. package/dist/queue/process-file.d.ts.map +1 -1
  359. package/dist/queue/process-file.js +5 -1
  360. package/dist/queue/process-file.js.map +1 -1
  361. package/dist/queue/snapshot.d.ts +4 -1
  362. package/dist/queue/snapshot.d.ts.map +1 -1
  363. package/dist/queue/snapshot.js +4 -1
  364. package/dist/queue/snapshot.js.map +1 -1
  365. package/dist/queue/spawn.d.ts +1 -3
  366. package/dist/queue/spawn.d.ts.map +1 -1
  367. package/dist/queue/spawn.js +1 -3
  368. package/dist/queue/spawn.js.map +1 -1
  369. package/dist/queue/submit.d.ts +6 -1
  370. package/dist/queue/submit.d.ts.map +1 -1
  371. package/dist/queue/submit.js +6 -1
  372. package/dist/queue/submit.js.map +1 -1
  373. package/dist/queue/types.d.ts +5 -1
  374. package/dist/queue/types.d.ts.map +1 -1
  375. package/dist/queue/types.js +5 -1
  376. package/dist/queue/types.js.map +1 -1
  377. package/dist/queue/worker-log.d.ts +3 -1
  378. package/dist/queue/worker-log.d.ts.map +1 -1
  379. package/dist/queue/worker-log.js +3 -1
  380. package/dist/queue/worker-log.js.map +1 -1
  381. package/package.json +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/analytics/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAiB,gBAAgB,EAAE,cAAc,EAAc,cAAc,EAAmD,oBAAoB,EAAE,wBAAwB,EAAa,MAAM,SAAS,CAAC;AAC7P,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAkC7C,UAAU,YAAY;IAClB,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC7C,mBAAmB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACjD,0BAA0B,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACnD,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IACxB,WAAW,EAAE,oBAAoB,CAAC;IAClC,QAAQ,EAAE,YAAY,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC5B,WAAW,EAAE,oBAAoB,EACjC,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,aAAa,GAC7B,WAAW,CA4Pb"}
@@ -0,0 +1,527 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — Analytics Merge
4
+ *
5
+ * Merges a delta `SessionAnalytics` into the accumulated state. Type-aware
6
+ * — additive counters, counter maps, boolean OR, array append, distinct-set,
7
+ * top-K, bounds, recomputed, static, counter map of objects, replace-if-newer,
8
+ * max. Each field's rule is annotated inline in the merged-object literal.
9
+ *
10
+ * Determinism is a hard requirement: given the same inputs, this function
11
+ * must produce the same output. Unit tests verify repeatability +
12
+ * incremental/one-shot composition equivalence.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.mergeAccumulated = mergeAccumulated;
16
+ const pricing_1 = require("./pricing");
17
+ const logger_1 = require("../lib/logger");
18
+ const HOT_FILES_TOP_K = 5;
19
+ /**
20
+ * Hard cap on the in-state pending event queues. When the collector is
21
+ * persistently failing (e.g., backend reject due to an unknown enum
22
+ * value), the queues would otherwise grow without bound until SessionEnd
23
+ * — and then orphan on disk forever (no operator drain command exists for
24
+ * them). Cap protects state.json size and OOM risk on long sessions.
25
+ *
26
+ * Drop policy: FIFO — oldest entries are dropped first. The newest entries
27
+ * have the best chance of carrying recoverable data once the backend is
28
+ * fixed (since backend dedupes via deterministic id, dropped-then-redelivered
29
+ * entries are also safe — but only if the user re-runs analytics over the
30
+ * same transcript, which doesn't happen automatically).
31
+ */
32
+ const PENDING_QUEUE_MAX = 1000;
33
+ function capQueueFifo(queue, max, label) {
34
+ if (queue.length <= max) {
35
+ return queue;
36
+ }
37
+ const dropCount = queue.length - max;
38
+ logger_1.logger.error(`analytics: ${label} exceeded max=${max} (size=${queue.length}); `
39
+ + `dropping ${dropCount} oldest entries (FIFO). Indicates a persistently `
40
+ + `failing collector — check session.log + analytics.log for HTTP errors.`);
41
+ return queue.slice(dropCount);
42
+ }
43
+ /**
44
+ * Merge `delta` (and the per-delta internal maps) into `accumulated`.
45
+ * Returns the new accumulated state plus updated internal maps.
46
+ *
47
+ * Pure function — does not mutate inputs.
48
+ */
49
+ function mergeAccumulated(accumulated, internal, delta, deltaInternal) {
50
+ // ── 1. Update internal maps first (top-K and distinct-set need them) ──
51
+ const filePathCounts = sumCounterMap(internal.file_path_change_counts, deltaInternal.file_path_change_counts);
52
+ const distinctPaths = unionSorted(internal.distinct_file_paths_seen, deltaInternal.distinct_file_paths_seen);
53
+ // last_assistant_ts_ms: take the max (latest) across accumulated and delta.
54
+ let mergedLastAssistantTs = internal.last_assistant_ts_ms;
55
+ if (deltaInternal.last_assistant_ts_ms !== undefined) {
56
+ if (mergedLastAssistantTs === undefined || deltaInternal.last_assistant_ts_ms > mergedLastAssistantTs) {
57
+ mergedLastAssistantTs = deltaInternal.last_assistant_ts_ms;
58
+ }
59
+ }
60
+ // pending_tool_uses: replace with delta's closing snapshot. The delta
61
+ // already seeded itself from `internal.pending_tool_uses` and walked the
62
+ // slice forward; its closing map is the authoritative new state. Only
63
+ // persist when non-empty to keep state.json minimal.
64
+ const closingPending = delta.closing_pending_tool_uses;
65
+ // idle_ms_total: cumulative user-idle ms, accumulated additively across
66
+ // deltas. The delta's contribution comes from `deltaInternal.idle_ms_delta`
67
+ // — projectDeltaInternal computes it via the same algorithm projectDelta
68
+ // uses for `delta.idle_minutes`, but at ms precision so we don't lose
69
+ // accuracy across long sessions with many small gaps.
70
+ const newIdleMsTotal = (internal.idle_ms_total ?? 0) + (deltaInternal.idle_ms_delta ?? 0);
71
+ // Per-turn pending queue — append every SessionTurnAnalytics that
72
+ // closed during this slice. Emit drains and POSTs; on success the
73
+ // queue is cleared. On failure the queue stays so the next trigger
74
+ // retries (turn_id is deterministic, so backend LWW dedupes).
75
+ const priorPending = internal.pending_turn_events ?? [];
76
+ const mergedPending = capQueueFifo(delta.completed_turns.length > 0
77
+ ? [...priorPending, ...delta.completed_turns]
78
+ : priorPending, PENDING_QUEUE_MAX, "pending_turn_events");
79
+ // Per-step pending queue — same semantics as turn pending. Each closed
80
+ // turn contributes N step events (N = step count in the turn). Last
81
+ // step in the batch carries `is_last_step=true` + the turn-bookend
82
+ // fields. Backend LWW per `(session_id, step_id)` dedupes re-sends.
83
+ const priorPendingSteps = internal.pending_step_events ?? [];
84
+ const mergedPendingSteps = capQueueFifo(delta.completed_steps.length > 0
85
+ ? [...priorPendingSteps, ...delta.completed_steps]
86
+ : priorPendingSteps, PENDING_QUEUE_MAX, "pending_step_events");
87
+ // Per-API-request pending queue — append every APIRequestAnalytics body
88
+ // produced by this slice's projection. Same FIFO + cap semantics as turn
89
+ // / step queues. Backend dedup key: `(session_id, request_id)` for
90
+ // successes; failures have null request_id and rely on (session_id, id)
91
+ // best-effort.
92
+ const priorPendingApiRequests = internal.pending_api_request_events ?? [];
93
+ const mergedPendingApiRequests = capQueueFifo(delta.api_request_events.length > 0
94
+ ? [...priorPendingApiRequests, ...delta.api_request_events]
95
+ : priorPendingApiRequests, PENDING_QUEUE_MAX, "pending_api_request_events");
96
+ // Monotonic per-session turn index — projection reports the post-walk
97
+ // value; we just persist what it computed.
98
+ const mergedNextTurnIndex = deltaInternal.next_turn_index ?? internal.next_turn_index;
99
+ // Anthropic msg_id dedup state — append the IDs newly counted in this
100
+ // slice to the running list. Projection seeds itself from this on the
101
+ // next slice so cross-slice duplicate API responses are still skipped.
102
+ const priorSeenIds = internal.seen_assistant_message_ids ?? [];
103
+ const newSeenIds = deltaInternal.new_assistant_message_ids ?? [];
104
+ const mergedSeenAssistantIds = newSeenIds.length > 0
105
+ ? [...priorSeenIds, ...newSeenIds]
106
+ : priorSeenIds;
107
+ const newInternal = {
108
+ file_path_change_counts: filePathCounts,
109
+ distinct_file_paths_seen: distinctPaths,
110
+ last_assistant_ts_ms: mergedLastAssistantTs,
111
+ idle_ms_total: newIdleMsTotal,
112
+ ...(Object.keys(closingPending).length > 0 ? { pending_tool_uses: closingPending } : {}),
113
+ // current_turn (per-turn classifier in-flight state). Persist when
114
+ // an open turn straddles the slice boundary; cleared when the turn
115
+ // closed inside the delta.
116
+ ...(delta.closing_current_turn !== null ? { current_turn: delta.closing_current_turn } : {}),
117
+ ...(mergedNextTurnIndex !== undefined ? { next_turn_index: mergedNextTurnIndex } : {}),
118
+ ...(mergedPending.length > 0 ? { pending_turn_events: mergedPending } : {}),
119
+ ...(mergedPendingSteps.length > 0 ? { pending_step_events: mergedPendingSteps } : {}),
120
+ ...(mergedPendingApiRequests.length > 0 ? { pending_api_request_events: mergedPendingApiRequests } : {}),
121
+ ...(mergedSeenAssistantIds.length > 0 ? { seen_assistant_message_ids: mergedSeenAssistantIds } : {}),
122
+ };
123
+ // ── 2. Compose merged accumulated (logical group structure) ───────────
124
+ // Field order mirrors the SessionAnalytics interface so the on-disk
125
+ // state.json (which is pretty-printed) groups related fields together.
126
+ // Per-group merge rules:
127
+ // time — bounds (max ISO) + recomputed minutes/hour
128
+ // turns — additive
129
+ // classification — category_breakdown element-wise additive; session_type recomputed
130
+ // usage — additive (Anthropic-exact tokens/cost)
131
+ // user_messages — additive (count, size; approximated_tokens recomputed)
132
+ // tool_meta — counter map + boolean OR
133
+ // code_changes — additive + distinct-set + top-K + counter map
134
+ // errors — additive + counter map
135
+ // user_activity — counter-map per-key sum (no per-msg arrays)
136
+ // context_tokens — bucket map sum + recompute avg + replace-if-newer + max
137
+ // process_errors — element-wise dedup; `has` recomputed
138
+ const mergedFilesModified = distinctPaths.length;
139
+ const mergedLinesAdded = accumulated.code_changes.lines_added + delta.code_changes.lines_added;
140
+ const mergedLinesRemoved = accumulated.code_changes.lines_removed + delta.code_changes.lines_removed;
141
+ const mergedHotFiles = topKHotFiles(filePathCounts, HOT_FILES_TOP_K);
142
+ const mergedUserMessagesCount = accumulated.user_messages.count + delta.user_messages.count;
143
+ const mergedUserMessagesSize = accumulated.user_messages.size + delta.user_messages.size;
144
+ const mergedCategoryBreakdown = mergeCategoryBreakdown(accumulated.classification.category_breakdown, delta.classification.category_breakdown);
145
+ const mergedProcessErrorItems = mergeProcessErrors(accumulated.process_errors.items, delta.process_errors.items);
146
+ const mergedProcessErrors = {
147
+ has: Object.keys(mergedProcessErrorItems).length > 0,
148
+ items: mergedProcessErrorItems,
149
+ };
150
+ const mergedStartTime = accumulated.start_time !== "" ? accumulated.start_time : delta.start_time;
151
+ const mergedLastActivityTime = maxIsoTimestamp(accumulated.last_activity_time, delta.last_activity_time);
152
+ const mergedDurationMinutes = computeDurationMinutes(mergedStartTime, mergedLastActivityTime);
153
+ const mergedIdleMinutes = Math.round(newIdleMsTotal / 60000);
154
+ const mergedActiveMinutes = Math.max(0, mergedDurationMinutes - mergedIdleMinutes);
155
+ const merged = {
156
+ // Identity / provenance — Static rule: first non-empty wins
157
+ session_id: accumulated.session_id || delta.session_id,
158
+ project_name: accumulated.project_name || delta.project_name,
159
+ schema_version: accumulated.schema_version || delta.schema_version,
160
+ transcript_source: accumulated.transcript_source || delta.transcript_source,
161
+ // Time bounds (flat ISO strings)
162
+ start_time: mergedStartTime,
163
+ last_activity_time: mergedLastActivityTime,
164
+ // Time group
165
+ time: {
166
+ duration_minutes: mergedDurationMinutes,
167
+ active_minutes: mergedActiveMinutes,
168
+ idle_minutes: mergedIdleMinutes,
169
+ start_hour: isoToHour(mergedStartTime),
170
+ last_activity_hour: isoToHour(mergedLastActivityTime),
171
+ },
172
+ // Turns group — additive
173
+ turns: {
174
+ user_count: accumulated.turns.user_count + delta.turns.user_count,
175
+ assistant_count: accumulated.turns.assistant_count + delta.turns.assistant_count,
176
+ with_retry: accumulated.turns.with_retry + delta.turns.with_retry,
177
+ one_shot: accumulated.turns.one_shot + delta.turns.one_shot,
178
+ },
179
+ // Classification group — element-wise additive + session_type recomputed below
180
+ classification: {
181
+ category_breakdown: mergedCategoryBreakdown,
182
+ session_type: "general",
183
+ },
184
+ // Usage group — additive (Anthropic-exact)
185
+ usage: {
186
+ input_tokens: accumulated.usage.input_tokens + delta.usage.input_tokens,
187
+ output_tokens: accumulated.usage.output_tokens + delta.usage.output_tokens,
188
+ cache_creation_tokens: accumulated.usage.cache_creation_tokens + delta.usage.cache_creation_tokens,
189
+ cache_read_tokens: accumulated.usage.cache_read_tokens + delta.usage.cache_read_tokens,
190
+ cost_usd: accumulated.usage.cost_usd + delta.usage.cost_usd,
191
+ },
192
+ // Models — counter map of objects
193
+ models: mergeModelUsage(accumulated.models, delta.models),
194
+ // User messages aggregate — additive; approximated_tokens recomputed from size
195
+ user_messages: {
196
+ count: mergedUserMessagesCount,
197
+ size: mergedUserMessagesSize,
198
+ approximated_tokens: mergedUserMessagesSize / pricing_1.BYTES_PER_TOKEN,
199
+ },
200
+ // Tool breakdown maps (top-level)
201
+ tools: mergeToolUsage(accumulated.tools, delta.tools),
202
+ mcp_servers: mergeToolUsage(accumulated.mcp_servers, delta.mcp_servers),
203
+ skills: mergeToolUsage(accumulated.skills, delta.skills),
204
+ sub_agents: mergeToolUsage(accumulated.sub_agents, delta.sub_agents),
205
+ bash_binaries: mergeToolUsage(accumulated.bash_binaries, delta.bash_binaries),
206
+ // Tool meta — counter map + boolean OR
207
+ tool_meta: {
208
+ ...(mergeOptionalCounterMap(accumulated.tool_meta.bash_subcommands, delta.tool_meta.bash_subcommands) !== undefined
209
+ ? { bash_subcommands: mergeOptionalCounterMap(accumulated.tool_meta.bash_subcommands, delta.tool_meta.bash_subcommands) }
210
+ : {}),
211
+ uses_sub_agent: accumulated.tool_meta.uses_sub_agent || delta.tool_meta.uses_sub_agent,
212
+ uses_skill: accumulated.tool_meta.uses_skill || delta.tool_meta.uses_skill,
213
+ uses_mcp: accumulated.tool_meta.uses_mcp || delta.tool_meta.uses_mcp,
214
+ uses_web_search: accumulated.tool_meta.uses_web_search || delta.tool_meta.uses_web_search,
215
+ uses_web_fetch: accumulated.tool_meta.uses_web_fetch || delta.tool_meta.uses_web_fetch,
216
+ },
217
+ // Code changes — additive + distinct-set + top-K + counter map
218
+ code_changes: {
219
+ files_modified: mergedFilesModified,
220
+ lines_added: mergedLinesAdded,
221
+ lines_removed: mergedLinesRemoved,
222
+ hot_files: mergedHotFiles,
223
+ languages: sumCounterMap(accumulated.code_changes.languages, delta.code_changes.languages),
224
+ },
225
+ // Errors — additive + counter map
226
+ errors: {
227
+ tool_errors_total: accumulated.errors.tool_errors_total + delta.errors.tool_errors_total,
228
+ tool_error_categories: sumCounterMap(accumulated.errors.tool_error_categories, delta.errors.tool_error_categories),
229
+ user_interruptions: accumulated.errors.user_interruptions + delta.errors.user_interruptions,
230
+ },
231
+ // User activity — counter-map per-key sum (no per-msg arrays)
232
+ user_activity: {
233
+ response_time_buckets: sumCounterMap(accumulated.user_activity.response_time_buckets, delta.user_activity.response_time_buckets),
234
+ messages_by_hour: sumCounterMap(accumulated.user_activity.messages_by_hour, delta.user_activity.messages_by_hour),
235
+ messages_by_date: sumCounterMap(accumulated.user_activity.messages_by_date, delta.user_activity.messages_by_date),
236
+ messages_by_weekday: sumCounterMap(accumulated.user_activity.messages_by_weekday, delta.user_activity.messages_by_weekday),
237
+ },
238
+ // Context tokens — bucket map sum (avg recomputed) + replace-if-newer + max
239
+ context_tokens: {
240
+ latest: delta.has_assistant_with_usage
241
+ ? delta.context_tokens.latest
242
+ : accumulated.context_tokens.latest,
243
+ peak: Math.max(accumulated.context_tokens.peak, delta.context_tokens.peak),
244
+ buckets: mergeBucketMapWithAvg(accumulated.context_tokens.buckets, delta.context_tokens.buckets),
245
+ },
246
+ // Process errors — element-wise dedup; `has` set above
247
+ process_errors: mergedProcessErrors,
248
+ };
249
+ // Session type — derived from classification.category_breakdown + time + code_changes.
250
+ merged.classification.session_type = deriveSessionType(merged);
251
+ return { accumulated: merged, internal: newInternal };
252
+ }
253
+ // ─────────────────────────────────────────────────────────────────────────
254
+ // Helpers
255
+ // ─────────────────────────────────────────────────────────────────────────
256
+ function sumCounterMap(a, b) {
257
+ const out = { ...a };
258
+ for (const k of Object.keys(b)) {
259
+ out[k] = (out[k] ?? 0) + b[k];
260
+ }
261
+ return out;
262
+ }
263
+ function mergeOptionalCounterMap(a, b) {
264
+ if (a === undefined && b === undefined) {
265
+ return undefined;
266
+ }
267
+ const merged = sumCounterMap(a ?? {}, b ?? {});
268
+ return Object.keys(merged).length === 0 ? undefined : merged;
269
+ }
270
+ /**
271
+ * Element-wise sum of two `Record<modelId, ModelUsage>` maps. Same shape
272
+ * as `mergeBucketMap` but for the richer per-model usage struct. Used for
273
+ * `SessionAnalytics.models` (per-model token + cost breakdown).
274
+ */
275
+ function mergeModelUsage(a, b) {
276
+ const out = {};
277
+ for (const k of Object.keys(a)) {
278
+ out[k] = { ...a[k] };
279
+ }
280
+ for (const k of Object.keys(b)) {
281
+ const slot = out[k] ?? {
282
+ count: 0,
283
+ input_tokens: 0,
284
+ output_tokens: 0,
285
+ cache_creation_tokens: 0,
286
+ cache_read_tokens: 0,
287
+ cost_usd: 0,
288
+ };
289
+ out[k] = {
290
+ count: slot.count + b[k].count,
291
+ input_tokens: slot.input_tokens + b[k].input_tokens,
292
+ output_tokens: slot.output_tokens + b[k].output_tokens,
293
+ cache_creation_tokens: slot.cache_creation_tokens + b[k].cache_creation_tokens,
294
+ cache_read_tokens: slot.cache_read_tokens + b[k].cache_read_tokens,
295
+ cost_usd: slot.cost_usd + b[k].cost_usd,
296
+ };
297
+ }
298
+ return out;
299
+ }
300
+ /**
301
+ * Element-wise sum of two `Record<toolName, ToolUsage>` maps. Sums raw
302
+ * `count`, `errors`, `input_size`, `output_size`; recomputes
303
+ * `approximated_*_tokens` from the merged sizes (avoids drift across many
304
+ * deltas). Used for `tools`, `mcp_servers`, `bash_binaries`, `skills`,
305
+ * `sub_agents`.
306
+ */
307
+ function mergeToolUsage(a, b) {
308
+ const out = {};
309
+ for (const k of Object.keys(a)) {
310
+ out[k] = { ...a[k] };
311
+ }
312
+ for (const k of Object.keys(b)) {
313
+ const slot = out[k] ?? {
314
+ count: 0,
315
+ errors: 0,
316
+ input_size: 0,
317
+ output_size: 0,
318
+ approximated_input_tokens: 0,
319
+ approximated_output_tokens: 0,
320
+ };
321
+ const mergedInputSize = slot.input_size + b[k].input_size;
322
+ const mergedOutputSize = slot.output_size + b[k].output_size;
323
+ out[k] = {
324
+ count: slot.count + b[k].count,
325
+ errors: slot.errors + b[k].errors,
326
+ input_size: mergedInputSize,
327
+ output_size: mergedOutputSize,
328
+ approximated_input_tokens: mergedInputSize / pricing_1.BYTES_PER_TOKEN,
329
+ approximated_output_tokens: mergedOutputSize / pricing_1.BYTES_PER_TOKEN,
330
+ };
331
+ }
332
+ return out;
333
+ }
334
+ /**
335
+ * Element-wise merge of two `Record<errorSignature, ProcessError>` maps.
336
+ * Same signature in both → count sums, first_seen=min ISO, last_seen=max ISO,
337
+ * static fields (error_type, error_message, stack_first_lines, sample_context)
338
+ * keep the first occurrence's value. New signatures pass through.
339
+ */
340
+ function mergeProcessErrors(a, b) {
341
+ const out = {};
342
+ for (const k of Object.keys(a)) {
343
+ out[k] = { ...a[k] };
344
+ }
345
+ for (const k of Object.keys(b)) {
346
+ const incoming = b[k];
347
+ const existing = out[k];
348
+ if (existing === undefined) {
349
+ out[k] = { ...incoming };
350
+ continue;
351
+ }
352
+ out[k] = {
353
+ error_type: existing.error_type, // first occurrence wins
354
+ error_message: existing.error_message,
355
+ stack_first_lines: existing.stack_first_lines,
356
+ count: existing.count + incoming.count,
357
+ first_seen: minIso(existing.first_seen, incoming.first_seen),
358
+ last_seen: maxIso(existing.last_seen, incoming.last_seen),
359
+ ...(existing.sample_context !== undefined ? { sample_context: existing.sample_context }
360
+ : incoming.sample_context !== undefined ? { sample_context: incoming.sample_context }
361
+ : {}),
362
+ };
363
+ }
364
+ return out;
365
+ }
366
+ function minIso(a, b) {
367
+ if (a === "" || a.length === 0) {
368
+ return b;
369
+ }
370
+ if (b === "" || b.length === 0) {
371
+ return a;
372
+ }
373
+ return a <= b ? a : b;
374
+ }
375
+ function maxIso(a, b) {
376
+ if (a === "" || a.length === 0) {
377
+ return b;
378
+ }
379
+ if (b === "" || b.length === 0) {
380
+ return a;
381
+ }
382
+ return a >= b ? a : b;
383
+ }
384
+ /**
385
+ * Element-wise additive merge of category breakdown maps. Same shape as
386
+ * `mergeModelUsage`/`mergeToolUsage` — per-key sum on every numeric field.
387
+ */
388
+ function mergeCategoryBreakdown(a, b) {
389
+ const out = {};
390
+ for (const k of Object.keys(a)) {
391
+ out[k] = { ...a[k] };
392
+ }
393
+ for (const k of Object.keys(b)) {
394
+ const slot = out[k] ?? {
395
+ turns: 0, turns_with_edit: 0, turns_with_retry: 0,
396
+ total_retries: 0, cost_usd: 0,
397
+ };
398
+ out[k] = {
399
+ turns: slot.turns + b[k].turns,
400
+ turns_with_edit: slot.turns_with_edit + b[k].turns_with_edit,
401
+ turns_with_retry: slot.turns_with_retry + b[k].turns_with_retry,
402
+ total_retries: slot.total_retries + b[k].total_retries,
403
+ cost_usd: slot.cost_usd + b[k].cost_usd,
404
+ };
405
+ }
406
+ return out;
407
+ }
408
+ /**
409
+ * Derive the session-wide `session_type` label from accumulated state.
410
+ *
411
+ * Decision tree (first matching rule wins):
412
+ * 1. `quick_question` — duration_minutes < 5 AND user_turns ≤ 2 AND files_modified == 0
413
+ * 2. `exploration` — read/research-heavy: no edit turns, OR
414
+ * explore-category turns dominate (≥ 60% of total)
415
+ * 3. `iterative_refinement` — heavy concentration on a small file set:
416
+ * `hot_files[0].change_count` ≥ 5 AND ≥ 50% of total file-change events
417
+ * 4. `multi_task` — user_turns ≥ 3 (multiple distinct human prompts)
418
+ * 5. `single_task` — has at least one edit, focused
419
+ * 6. `general` — default / no signal
420
+ */
421
+ function deriveSessionType(acc) {
422
+ const totalTurns = Object.values(acc.classification.category_breakdown).reduce((s, c) => s + c.turns, 0);
423
+ const editTurns = Object.values(acc.classification.category_breakdown).reduce((s, c) => s + c.turns_with_edit, 0);
424
+ const explorationTurns = (acc.classification.category_breakdown["exploration"]?.turns ?? 0)
425
+ + (acc.classification.category_breakdown["brainstorming"]?.turns ?? 0);
426
+ // 1. Quick question
427
+ if (acc.time.duration_minutes < 5 && acc.turns.user_count <= 2 && acc.code_changes.files_modified === 0) {
428
+ return "quick_question";
429
+ }
430
+ // 2. Exploration-dominant
431
+ if (totalTurns >= 2 && editTurns === 0) {
432
+ return "exploration";
433
+ }
434
+ if (totalTurns >= 3 && explorationTurns / totalTurns >= 0.6) {
435
+ return "exploration";
436
+ }
437
+ // 3. Iterative refinement — hot_files concentration
438
+ if (acc.code_changes.hot_files.length > 0) {
439
+ const top = acc.code_changes.hot_files[0];
440
+ const totalChanges = acc.code_changes.hot_files.reduce((s, f) => s + f.change_count, 0);
441
+ if (top.change_count >= 5 && totalChanges > 0 && top.change_count / totalChanges >= 0.5) {
442
+ return "iterative_refinement";
443
+ }
444
+ }
445
+ // 4. Multi-task
446
+ if (acc.turns.user_count >= 3) {
447
+ return "multi_task";
448
+ }
449
+ // 5. Single task — has edit
450
+ if (editTurns > 0) {
451
+ return "single_task";
452
+ }
453
+ return "general";
454
+ }
455
+ /**
456
+ * Element-wise sum of context_tokens.buckets maps. Includes `avg` field,
457
+ * recomputed from merged sum/count. Bucket value shape:
458
+ * `{ sum, count, avg }` where `avg = sum/count` (or 0 when count===0).
459
+ */
460
+ function mergeBucketMapWithAvg(a, b) {
461
+ const out = {};
462
+ for (const k of Object.keys(a)) {
463
+ out[k] = { sum: a[k].sum, count: a[k].count, avg: a[k].avg };
464
+ }
465
+ for (const k of Object.keys(b)) {
466
+ const slot = out[k] ?? { sum: 0, count: 0, avg: 0 };
467
+ const mergedSum = slot.sum + b[k].sum;
468
+ const mergedCount = slot.count + b[k].count;
469
+ out[k] = {
470
+ sum: mergedSum,
471
+ count: mergedCount,
472
+ avg: mergedCount > 0 ? mergedSum / mergedCount : 0,
473
+ };
474
+ }
475
+ return out;
476
+ }
477
+ function unionSorted(a, b) {
478
+ const set = new Set(a);
479
+ for (const x of b) {
480
+ set.add(x);
481
+ }
482
+ return Array.from(set).sort();
483
+ }
484
+ function maxIsoTimestamp(a, b) {
485
+ if (a === "" || a.length === 0) {
486
+ return b;
487
+ }
488
+ if (b === "" || b.length === 0) {
489
+ return a;
490
+ }
491
+ return a >= b ? a : b;
492
+ }
493
+ function isoToHour(iso) {
494
+ if (iso === "" || iso.length === 0) {
495
+ return 0;
496
+ }
497
+ const ms = Date.parse(iso);
498
+ if (Number.isNaN(ms)) {
499
+ return 0;
500
+ }
501
+ return new Date(ms).getHours();
502
+ }
503
+ function computeDurationMinutes(startIso, endIso) {
504
+ if (startIso === "" || endIso === "") {
505
+ return 0;
506
+ }
507
+ const start = Date.parse(startIso);
508
+ const end = Date.parse(endIso);
509
+ if (Number.isNaN(start) || Number.isNaN(end) || end <= start) {
510
+ return 0;
511
+ }
512
+ return Math.round((end - start) / 60000);
513
+ }
514
+ function topKHotFiles(counts, k) {
515
+ const entries = Object.entries(counts);
516
+ entries.sort((x, y) => {
517
+ if (y[1] !== x[1]) {
518
+ return y[1] - x[1];
519
+ }
520
+ return x[0].localeCompare(y[0]);
521
+ });
522
+ return entries.slice(0, k).map(([path, count]) => ({
523
+ path,
524
+ change_count: count,
525
+ }));
526
+ }
527
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/analytics/merge.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AA8DH,4CAiQC;AA3TD,uCAA4C;AAC5C,0CAAuC;AAEvC,MAAM,eAAe,GAAW,CAAC,CAAC;AAElC;;;;;;;;;;;;GAYG;AACH,MAAM,iBAAiB,GAAW,IAAI,CAAC;AAEvC,SAAS,YAAY,CAAI,KAAU,EAAE,GAAW,EAAE,KAAa;IAC3D,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,SAAS,GAAW,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IAC7C,eAAM,CAAC,KAAK,CACR,cAAc,KAAK,iBAAiB,GAAG,UAAU,KAAK,CAAC,MAAM,KAAK;UAChE,YAAY,SAAS,mDAAmD;UACxE,wEAAwE,CAC7E,CAAC;IACF,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAqBD;;;;;GAKG;AACH,SAAgB,gBAAgB,CAC5B,WAAiC,EACjC,QAAsB,EACtB,KAAqB,EACrB,aAA4B;IAE5B,yEAAyE;IACzE,MAAM,cAAc,GAA2B,aAAa,CACxD,QAAQ,CAAC,uBAAuB,EAChC,aAAa,CAAC,uBAAuB,CACxC,CAAC;IACF,MAAM,aAAa,GAAa,WAAW,CACvC,QAAQ,CAAC,wBAAwB,EACjC,aAAa,CAAC,wBAAwB,CACzC,CAAC;IACF,4EAA4E;IAC5E,IAAI,qBAAqB,GAAuB,QAAQ,CAAC,oBAAoB,CAAC;IAC9E,IAAI,aAAa,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACnD,IAAI,qBAAqB,KAAK,SAAS,IAAI,aAAa,CAAC,oBAAoB,GAAG,qBAAqB,EAAE,CAAC;YACpG,qBAAqB,GAAG,aAAa,CAAC,oBAAoB,CAAC;QAC/D,CAAC;IACL,CAAC;IAED,sEAAsE;IACtE,yEAAyE;IACzE,sEAAsE;IACtE,qDAAqD;IACrD,MAAM,cAAc,GAAmC,KAAK,CAAC,yBAAyB,CAAC;IACvF,wEAAwE;IACxE,4EAA4E;IAC5E,yEAAyE;IACzE,sEAAsE;IACtE,sDAAsD;IACtD,MAAM,cAAc,GAAW,CAAC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;IAClG,kEAAkE;IAClE,kEAAkE;IAClE,mEAAmE;IACnE,8DAA8D;IAC9D,MAAM,YAAY,GAA2B,QAAQ,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAChF,MAAM,aAAa,GAA2B,YAAY,CACtD,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC;QAC7C,CAAC,CAAC,YAAY,EAClB,iBAAiB,EACjB,qBAAqB,CACxB,CAAC;IACF,uEAAuE;IACvE,oEAAoE;IACpE,mEAAmE;IACnE,oEAAoE;IACpE,MAAM,iBAAiB,GAA+B,QAAQ,CAAC,mBAAmB,IAAI,EAAE,CAAC;IACzF,MAAM,kBAAkB,GAA+B,YAAY,CAC/D,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,CAAC,CAAC,GAAG,iBAAiB,EAAE,GAAG,KAAK,CAAC,eAAe,CAAC;QAClD,CAAC,CAAC,iBAAiB,EACvB,iBAAiB,EACjB,qBAAqB,CACxB,CAAC;IACF,wEAAwE;IACxE,yEAAyE;IACzE,mEAAmE;IACnE,wEAAwE;IACxE,eAAe;IACf,MAAM,uBAAuB,GAA0B,QAAQ,CAAC,0BAA0B,IAAI,EAAE,CAAC;IACjG,MAAM,wBAAwB,GAA0B,YAAY,CAChE,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,CAAC,GAAG,uBAAuB,EAAE,GAAG,KAAK,CAAC,kBAAkB,CAAC;QAC3D,CAAC,CAAC,uBAAuB,EAC7B,iBAAiB,EACjB,4BAA4B,CAC/B,CAAC;IACF,sEAAsE;IACtE,2CAA2C;IAC3C,MAAM,mBAAmB,GAAuB,aAAa,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC;IAE1G,sEAAsE;IACtE,sEAAsE;IACtE,uEAAuE;IACvE,MAAM,YAAY,GAAa,QAAQ,CAAC,0BAA0B,IAAI,EAAE,CAAC;IACzE,MAAM,UAAU,GAAa,aAAa,CAAC,yBAAyB,IAAI,EAAE,CAAC;IAC3E,MAAM,sBAAsB,GAAa,UAAU,CAAC,MAAM,GAAG,CAAC;QAC1D,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,CAAC;QAClC,CAAC,CAAC,YAAY,CAAC;IAEnB,MAAM,WAAW,GAAiB;QAC9B,uBAAuB,EAAE,cAAc;QACvC,wBAAwB,EAAE,aAAa;QACvC,oBAAoB,EAAE,qBAAqB;QAC3C,aAAa,EAAE,cAAc;QAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,mEAAmE;QACnE,mEAAmE;QACnE,2BAA2B;QAC3B,GAAG,CAAC,KAAK,CAAC,oBAAoB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,wBAAwB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,GAAG,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvG,CAAC;IAEF,yEAAyE;IACzE,oEAAoE;IACpE,uEAAuE;IACvE,yBAAyB;IACzB,gEAAgE;IAChE,8BAA8B;IAC9B,uFAAuF;IACvF,4DAA4D;IAC5D,4EAA4E;IAC5E,8CAA8C;IAC9C,mEAAmE;IACnE,4CAA4C;IAC5C,iEAAiE;IACjE,6EAA6E;IAC7E,0DAA0D;IAC1D,MAAM,mBAAmB,GAAW,aAAa,CAAC,MAAM,CAAC;IACzD,MAAM,gBAAgB,GAAW,WAAW,CAAC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC;IACvG,MAAM,kBAAkB,GAAW,WAAW,CAAC,YAAY,CAAC,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC;IAC7G,MAAM,cAAc,GAAkD,YAAY,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAEpH,MAAM,uBAAuB,GAAW,WAAW,CAAC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;IACpG,MAAM,sBAAsB,GAAW,WAAW,CAAC,aAAa,CAAC,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;IAEjG,MAAM,uBAAuB,GAAkC,sBAAsB,CACjF,WAAW,CAAC,cAAc,CAAC,kBAAkB,EAC7C,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAC1C,CAAC;IAEF,MAAM,uBAAuB,GAAiC,kBAAkB,CAC5E,WAAW,CAAC,cAAc,CAAC,KAAK,EAChC,KAAK,CAAC,cAAc,CAAC,KAAK,CAC7B,CAAC;IACF,MAAM,mBAAmB,GAAyB;QAC9C,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,MAAM,GAAG,CAAC;QACpD,KAAK,EAAE,uBAAuB;KACjC,CAAC;IAEF,MAAM,eAAe,GAAW,WAAW,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;IAC1G,MAAM,sBAAsB,GAAW,eAAe,CAAC,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjH,MAAM,qBAAqB,GAAW,sBAAsB,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;IACtG,MAAM,iBAAiB,GAAW,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC;IACrE,MAAM,mBAAmB,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,GAAG,iBAAiB,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAyB;QACjC,4DAA4D;QAC5D,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU;QACtD,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY;QAC5D,cAAc,EAAE,WAAW,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc;QAClE,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB;QAE3E,iCAAiC;QACjC,UAAU,EAAE,eAAe;QAC3B,kBAAkB,EAAE,sBAAsB;QAE1C,aAAa;QACb,IAAI,EAAE;YACF,gBAAgB,EAAE,qBAAqB;YACvC,cAAc,EAAE,mBAAmB;YACnC,YAAY,EAAE,iBAAiB;YAC/B,UAAU,EAAE,SAAS,CAAC,eAAe,CAAC;YACtC,kBAAkB,EAAE,SAAS,CAAC,sBAAsB,CAAC;SACxD;QAED,yBAAyB;QACzB,KAAK,EAAE;YACH,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU;YACjE,eAAe,EAAE,WAAW,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe;YAChF,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU;YACjE,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ;SAC9D;QAED,+EAA+E;QAC/E,cAAc,EAAE;YACZ,kBAAkB,EAAE,uBAAuB;YAC3C,YAAY,EAAE,SAAS;SAC1B;QAED,2CAA2C;QAC3C,KAAK,EAAE;YACH,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY;YACvE,aAAa,EAAE,WAAW,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa;YAC1E,qBAAqB,EAAE,WAAW,CAAC,KAAK,CAAC,qBAAqB,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB;YAClG,iBAAiB,EAAE,WAAW,CAAC,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB;YACtF,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ;SAC9D;QAED,kCAAkC;QAClC,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;QAEzD,+EAA+E;QAC/E,aAAa,EAAE;YACX,KAAK,EAAE,uBAAuB;YAC9B,IAAI,EAAE,sBAAsB;YAC5B,mBAAmB,EAAE,sBAAsB,GAAG,yBAAe;SAChE;QAED,kCAAkC;QAClC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;QACrD,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC;QACvE,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;QACxD,UAAU,EAAE,cAAc,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC;QACpE,aAAa,EAAE,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC;QAE7E,uCAAuC;QACvC,SAAS,EAAE;YACP,GAAG,CAAC,uBAAuB,CAAC,WAAW,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,SAAS;gBAC/G,CAAC,CAAC,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,WAAW,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAA2B,EAAE;gBACnJ,CAAC,CAAC,EAAE,CAAC;YACT,cAAc,EAAE,WAAW,CAAC,SAAS,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,CAAC,cAAc;YACtF,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU;YAC1E,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ;YACpE,eAAe,EAAE,WAAW,CAAC,SAAS,CAAC,eAAe,IAAI,KAAK,CAAC,SAAS,CAAC,eAAe;YACzF,cAAc,EAAE,WAAW,CAAC,SAAS,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,CAAC,cAAc;SACzF;QAED,+DAA+D;QAC/D,YAAY,EAAE;YACV,cAAc,EAAE,mBAAmB;YACnC,WAAW,EAAE,gBAAgB;YAC7B,aAAa,EAAE,kBAAkB;YACjC,SAAS,EAAE,cAAc;YACzB,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC;SAC7F;QAED,kCAAkC;QAClC,MAAM,EAAE;YACJ,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB;YACxF,qBAAqB,EAAE,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC;YAClH,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB;SAC9F;QAED,8DAA8D;QAC9D,aAAa,EAAE;YACX,qBAAqB,EAAE,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,qBAAqB,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC;YAChI,gBAAgB,EAAE,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC;YACjH,gBAAgB,EAAE,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC;YACjH,mBAAmB,EAAE,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,mBAAmB,EAAE,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC;SAC7H;QAED,4EAA4E;QAC5E,cAAc,EAAE;YACZ,MAAM,EAAE,KAAK,CAAC,wBAAwB;gBAClC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM;gBAC7B,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM;YACvC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;YAC1E,OAAO,EAAE,qBAAqB,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC;SACnG;QAED,uDAAuD;QACvD,cAAc,EAAE,mBAAmB;KACtC,CAAC;IAEF,uFAAuF;IACvF,MAAM,CAAC,cAAc,CAAC,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC1D,CAAC;AAED,4EAA4E;AAC5E,UAAU;AACV,4EAA4E;AAE5E,SAAS,aAAa,CAAC,CAAyB,EAAE,CAAyB;IACvE,MAAM,GAAG,GAA2B,EAAE,GAAG,CAAC,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAC5B,CAAqC,EACrC,CAAqC;IAErC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAA2B,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CACpB,CAA6B,EAC7B,CAA6B;IAE7B,MAAM,GAAG,GAA+B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAe,GAAG,CAAC,CAAC,CAAC,IAAI;YAC/B,KAAK,EAAE,CAAC;YACR,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,qBAAqB,EAAE,CAAC;YACxB,iBAAiB,EAAE,CAAC;YACpB,QAAQ,EAAE,CAAC;SACd,CAAC;QACF,GAAG,CAAC,CAAC,CAAC,GAAG;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YAC9B,YAAY,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;YACnD,aAAa,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;YACtD,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;YAC9E,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;YAClE,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;SAC1C,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CACnB,CAA4B,EAC5B,CAA4B;IAE5B,MAAM,GAAG,GAA8B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAc,GAAG,CAAC,CAAC,CAAC,IAAI;YAC9B,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,yBAAyB,EAAE,CAAC;YAC5B,0BAA0B,EAAE,CAAC;SAChC,CAAC;QACF,MAAM,eAAe,GAAW,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAClE,MAAM,gBAAgB,GAAW,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QACrE,GAAG,CAAC,CAAC,CAAC,GAAG;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;YACjC,UAAU,EAAE,eAAe;YAC3B,WAAW,EAAE,gBAAgB;YAC7B,yBAAyB,EAAE,eAAe,GAAG,yBAAe;YAC5D,0BAA0B,EAAE,gBAAgB,GAAG,yBAAe;SACjE,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CACvB,CAA+B,EAC/B,CAA+B;IAE/B,MAAM,GAAG,GAAiC,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,QAAQ,GAA6B,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YACzB,SAAS;QACb,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,GAAG;YACL,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,wBAAwB;YACzD,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK;YACtC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;YAC5D,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC;YACzD,GAAG,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE;gBACnF,CAAC,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE;oBACjF,CAAC,CAAC,EAAE,CAAC;SAChB,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,CAAS,EAAE,CAAS;IAChC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AACD,SAAS,MAAM,CAAC,CAAS,EAAE,CAAS;IAChC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAC3B,CAAgC,EAChC,CAAgC;IAEhC,MAAM,GAAG,GAAkC,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAkB,GAAG,CAAC,CAAC,CAAC,IAAI;YAClC,KAAK,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC;YACjD,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;SAChC,CAAC;QACF,GAAG,CAAC,CAAC,CAAC,GAAG;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YAC9B,eAAe,EAAE,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;YAC5D,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;YAC/D,aAAa,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;YACtD,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;SAC1C,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,iBAAiB,CAAC,GAAyB;IAChD,MAAM,UAAU,GAAW,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAClF,CAAC,CAAS,EAAE,CAAgB,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAC1D,CAAC;IACF,MAAM,SAAS,GAAW,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,MAAM,CACjF,CAAC,CAAS,EAAE,CAAgB,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CACpE,CAAC;IACF,MAAM,gBAAgB,GAClB,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;UAChE,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAE3E,oBAAoB;IACpB,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QACtG,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IACD,0BAA0B;IAC1B,IAAI,UAAU,IAAI,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,IAAI,UAAU,IAAI,CAAC,IAAI,gBAAgB,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC;QAC1D,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,oDAAoD;IACpD,IAAI,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAA6B,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,YAAY,GAAW,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAC1D,CAAC,CAAS,EAAE,CAA2B,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAC5E,CAAC;QACF,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,GAAG,CAAC,YAAY,GAAG,YAAY,IAAI,GAAG,EAAE,CAAC;YACtF,OAAO,sBAAsB,CAAC;QAClC,CAAC;IACL,CAAC;IACD,gBAAgB;IAChB,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC;IACxB,CAAC;IACD,4BAA4B;IAC5B,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAC1B,CAA8D,EAC9D,CAA8D;IAE9D,MAAM,GAAG,GAAgE,EAAE,CAAC;IAC5E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACjE,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAgD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACjG,MAAM,SAAS,GAAW,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,MAAM,WAAW,GAAW,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACpD,GAAG,CAAC,CAAC,CAAC,GAAG;YACL,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,WAAW;YAClB,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;SACrD,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,CAAW,EAAE,CAAW;IACzC,MAAM,GAAG,GAAgB,IAAI,GAAG,CAAS,CAAC,CAAC,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,CAAS,EAAE,CAAS;IACzC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC1B,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,CAAC;IACb,CAAC;IACD,MAAM,EAAE,GAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAgB,EAAE,MAAc;IAC5D,IAAI,QAAQ,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACnC,OAAO,CAAC,CAAC;IACb,CAAC;IACD,MAAM,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAW,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QAC3D,OAAO,CAAC,CAAC;IACb,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CACjB,MAA8B,EAC9B,CAAS;IAET,MAAM,OAAO,GAA4B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,CAAmB,EAAU,EAAE;QAC9D,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAC1B,CAAC,CAAC,IAAI,EAAE,KAAK,CAAmB,EAA0C,EAAE,CAAC,CAAC;QAC1E,IAAI;QACJ,YAAY,EAAE,KAAK;KACtB,CAAC,CACL,CAAC;AACN,CAAC"}