oh-my-claude-sisyphus 3.6.1 → 3.6.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 (308) hide show
  1. package/commands/doctor.md +1 -1
  2. package/commands/psm.md +180 -0
  3. package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
  4. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
  5. package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
  6. package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
  7. package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
  8. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
  9. package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
  10. package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
  11. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts +7 -0
  12. package/dist/__tests__/hooks/auto-slash-command/executor.test.d.ts.map +1 -0
  13. package/dist/__tests__/hooks/auto-slash-command/executor.test.js +374 -0
  14. package/dist/__tests__/hooks/auto-slash-command/executor.test.js.map +1 -0
  15. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
  16. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
  17. package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
  18. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
  19. package/dist/__tests__/installer.test.js +1 -1
  20. package/dist/__tests__/learned-skills/config.test.d.ts +2 -0
  21. package/dist/__tests__/learned-skills/config.test.d.ts.map +1 -0
  22. package/dist/__tests__/learned-skills/config.test.js +37 -0
  23. package/dist/__tests__/learned-skills/config.test.js.map +1 -0
  24. package/dist/__tests__/learned-skills/detector.test.d.ts +2 -0
  25. package/dist/__tests__/learned-skills/detector.test.d.ts.map +1 -0
  26. package/dist/__tests__/learned-skills/detector.test.js +99 -0
  27. package/dist/__tests__/learned-skills/detector.test.js.map +1 -0
  28. package/dist/__tests__/learned-skills/finder.test.d.ts +2 -0
  29. package/dist/__tests__/learned-skills/finder.test.d.ts.map +1 -0
  30. package/dist/__tests__/learned-skills/finder.test.js +59 -0
  31. package/dist/__tests__/learned-skills/finder.test.js.map +1 -0
  32. package/dist/__tests__/learned-skills/loader.test.d.ts +2 -0
  33. package/dist/__tests__/learned-skills/loader.test.d.ts.map +1 -0
  34. package/dist/__tests__/learned-skills/loader.test.js +69 -0
  35. package/dist/__tests__/learned-skills/loader.test.js.map +1 -0
  36. package/dist/__tests__/learned-skills/parser.test.d.ts +2 -0
  37. package/dist/__tests__/learned-skills/parser.test.d.ts.map +1 -0
  38. package/dist/__tests__/learned-skills/parser.test.js +81 -0
  39. package/dist/__tests__/learned-skills/parser.test.js.map +1 -0
  40. package/dist/__tests__/learned-skills/validator.test.d.ts +2 -0
  41. package/dist/__tests__/learned-skills/validator.test.d.ts.map +1 -0
  42. package/dist/__tests__/learned-skills/validator.test.js +85 -0
  43. package/dist/__tests__/learned-skills/validator.test.js.map +1 -0
  44. package/dist/__tests__/skills.test.js +6 -5
  45. package/dist/__tests__/skills.test.js.map +1 -1
  46. package/dist/agents/codex-agents.d.ts +20 -0
  47. package/dist/agents/codex-agents.d.ts.map +1 -0
  48. package/dist/agents/codex-agents.js +36 -0
  49. package/dist/agents/codex-agents.js.map +1 -0
  50. package/dist/agents/document-writer.d.ts +11 -0
  51. package/dist/agents/document-writer.d.ts.map +1 -0
  52. package/dist/agents/document-writer.js +209 -0
  53. package/dist/agents/document-writer.js.map +1 -0
  54. package/dist/agents/frontend-engineer.d.ts +11 -0
  55. package/dist/agents/frontend-engineer.d.ts.map +1 -0
  56. package/dist/agents/frontend-engineer.js +115 -0
  57. package/dist/agents/frontend-engineer.js.map +1 -0
  58. package/dist/agents/librarian.d.ts +12 -0
  59. package/dist/agents/librarian.d.ts.map +1 -0
  60. package/dist/agents/librarian.js +103 -0
  61. package/dist/agents/librarian.js.map +1 -0
  62. package/dist/agents/metis.d.ts +12 -0
  63. package/dist/agents/metis.d.ts.map +1 -0
  64. package/dist/agents/metis.js +117 -0
  65. package/dist/agents/metis.js.map +1 -0
  66. package/dist/agents/momus.d.ts +12 -0
  67. package/dist/agents/momus.d.ts.map +1 -0
  68. package/dist/agents/momus.js +128 -0
  69. package/dist/agents/momus.js.map +1 -0
  70. package/dist/agents/multimodal-looker.d.ts +11 -0
  71. package/dist/agents/multimodal-looker.d.ts.map +1 -0
  72. package/dist/agents/multimodal-looker.js +70 -0
  73. package/dist/agents/multimodal-looker.js.map +1 -0
  74. package/dist/agents/oracle.d.ts +13 -0
  75. package/dist/agents/oracle.d.ts.map +1 -0
  76. package/dist/agents/oracle.js +191 -0
  77. package/dist/agents/oracle.js.map +1 -0
  78. package/dist/agents/orchestrator-sisyphus.d.ts +11 -0
  79. package/dist/agents/orchestrator-sisyphus.d.ts.map +1 -0
  80. package/dist/agents/orchestrator-sisyphus.js +115 -0
  81. package/dist/agents/orchestrator-sisyphus.js.map +1 -0
  82. package/dist/agents/prometheus.d.ts +12 -0
  83. package/dist/agents/prometheus.d.ts.map +1 -0
  84. package/dist/agents/prometheus.js +195 -0
  85. package/dist/agents/prometheus.js.map +1 -0
  86. package/dist/agents/sisyphus-junior.d.ts +12 -0
  87. package/dist/agents/sisyphus-junior.d.ts.map +1 -0
  88. package/dist/agents/sisyphus-junior.js +93 -0
  89. package/dist/agents/sisyphus-junior.js.map +1 -0
  90. package/dist/cli/analytics.js +0 -0
  91. package/dist/cli/components/CostDashboard.d.ts +15 -0
  92. package/dist/cli/components/CostDashboard.d.ts.map +1 -0
  93. package/dist/cli/components/CostDashboard.js +15 -0
  94. package/dist/cli/components/CostDashboard.js.map +1 -0
  95. package/dist/cli/components/LiveStats.d.ts +16 -0
  96. package/dist/cli/components/LiveStats.d.ts.map +1 -0
  97. package/dist/cli/components/LiveStats.js +16 -0
  98. package/dist/cli/components/LiveStats.js.map +1 -0
  99. package/dist/cli/components/SessionBrowser.d.ts +14 -0
  100. package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
  101. package/dist/cli/components/SessionBrowser.js +14 -0
  102. package/dist/cli/components/SessionBrowser.js.map +1 -0
  103. package/dist/cli/index.js +0 -0
  104. package/dist/cli/tui.d.ts +21 -0
  105. package/dist/cli/tui.d.ts.map +1 -0
  106. package/dist/cli/tui.js +21 -0
  107. package/dist/cli/tui.js.map +1 -0
  108. package/dist/hooks/autopilot/signals.d.ts +20 -0
  109. package/dist/hooks/autopilot/signals.d.ts.map +1 -0
  110. package/dist/hooks/autopilot/signals.js +75 -0
  111. package/dist/hooks/autopilot/signals.js.map +1 -0
  112. package/dist/hooks/autopilot/summary.d.ts +27 -0
  113. package/dist/hooks/autopilot/summary.d.ts.map +1 -0
  114. package/dist/hooks/autopilot/summary.js +160 -0
  115. package/dist/hooks/autopilot/summary.js.map +1 -0
  116. package/dist/hooks/autopilot/transition.d.ts +39 -0
  117. package/dist/hooks/autopilot/transition.d.ts.map +1 -0
  118. package/dist/hooks/autopilot/transition.js +216 -0
  119. package/dist/hooks/autopilot/transition.js.map +1 -0
  120. package/dist/hooks/context-window-limit-recovery/constants.d.ts +28 -0
  121. package/dist/hooks/context-window-limit-recovery/constants.d.ts.map +1 -0
  122. package/dist/hooks/context-window-limit-recovery/constants.js +85 -0
  123. package/dist/hooks/context-window-limit-recovery/constants.js.map +1 -0
  124. package/dist/hooks/context-window-limit-recovery/index.d.ts +62 -0
  125. package/dist/hooks/context-window-limit-recovery/index.d.ts.map +1 -0
  126. package/dist/hooks/context-window-limit-recovery/index.js +201 -0
  127. package/dist/hooks/context-window-limit-recovery/index.js.map +1 -0
  128. package/dist/hooks/context-window-limit-recovery/parser.d.ts +31 -0
  129. package/dist/hooks/context-window-limit-recovery/parser.d.ts.map +1 -0
  130. package/dist/hooks/context-window-limit-recovery/parser.js +241 -0
  131. package/dist/hooks/context-window-limit-recovery/parser.js.map +1 -0
  132. package/dist/hooks/context-window-limit-recovery/types.d.ts +84 -0
  133. package/dist/hooks/context-window-limit-recovery/types.d.ts.map +1 -0
  134. package/dist/hooks/context-window-limit-recovery/types.js +34 -0
  135. package/dist/hooks/context-window-limit-recovery/types.js.map +1 -0
  136. package/dist/hooks/edit-error-recovery/index.d.ts +62 -0
  137. package/dist/hooks/edit-error-recovery/index.d.ts.map +1 -0
  138. package/dist/hooks/edit-error-recovery/index.js +89 -0
  139. package/dist/hooks/edit-error-recovery/index.js.map +1 -0
  140. package/dist/hooks/learned-skills/config.d.ts +53 -0
  141. package/dist/hooks/learned-skills/config.d.ts.map +1 -0
  142. package/dist/hooks/learned-skills/config.js +103 -0
  143. package/dist/hooks/learned-skills/config.js.map +1 -0
  144. package/dist/hooks/learned-skills/constants.d.ts +24 -0
  145. package/dist/hooks/learned-skills/constants.d.ts.map +1 -0
  146. package/dist/hooks/learned-skills/constants.js +26 -0
  147. package/dist/hooks/learned-skills/constants.js.map +1 -0
  148. package/dist/hooks/learned-skills/detection-hook.d.ts +39 -0
  149. package/dist/hooks/learned-skills/detection-hook.d.ts.map +1 -0
  150. package/dist/hooks/learned-skills/detection-hook.js +83 -0
  151. package/dist/hooks/learned-skills/detection-hook.js.map +1 -0
  152. package/dist/hooks/learned-skills/detector.d.ts +30 -0
  153. package/dist/hooks/learned-skills/detector.d.ts.map +1 -0
  154. package/dist/hooks/learned-skills/detector.js +150 -0
  155. package/dist/hooks/learned-skills/detector.js.map +1 -0
  156. package/dist/hooks/learned-skills/finder.d.ts +21 -0
  157. package/dist/hooks/learned-skills/finder.d.ts.map +1 -0
  158. package/dist/hooks/learned-skills/finder.js +117 -0
  159. package/dist/hooks/learned-skills/finder.js.map +1 -0
  160. package/dist/hooks/learned-skills/index.d.ts +62 -0
  161. package/dist/hooks/learned-skills/index.d.ts.map +1 -0
  162. package/dist/hooks/learned-skills/index.js +137 -0
  163. package/dist/hooks/learned-skills/index.js.map +1 -0
  164. package/dist/hooks/learned-skills/loader.d.ts +20 -0
  165. package/dist/hooks/learned-skills/loader.d.ts.map +1 -0
  166. package/dist/hooks/learned-skills/loader.js +107 -0
  167. package/dist/hooks/learned-skills/loader.js.map +1 -0
  168. package/dist/hooks/learned-skills/parser.d.ts +21 -0
  169. package/dist/hooks/learned-skills/parser.d.ts.map +1 -0
  170. package/dist/hooks/learned-skills/parser.js +190 -0
  171. package/dist/hooks/learned-skills/parser.js.map +1 -0
  172. package/dist/hooks/learned-skills/promotion.d.ts +29 -0
  173. package/dist/hooks/learned-skills/promotion.d.ts.map +1 -0
  174. package/dist/hooks/learned-skills/promotion.js +87 -0
  175. package/dist/hooks/learned-skills/promotion.js.map +1 -0
  176. package/dist/hooks/learned-skills/types.d.ts +109 -0
  177. package/dist/hooks/learned-skills/types.d.ts.map +1 -0
  178. package/dist/hooks/learned-skills/types.js +8 -0
  179. package/dist/hooks/learned-skills/types.js.map +1 -0
  180. package/dist/hooks/learned-skills/validator.d.ts +15 -0
  181. package/dist/hooks/learned-skills/validator.d.ts.map +1 -0
  182. package/dist/hooks/learned-skills/validator.js +87 -0
  183. package/dist/hooks/learned-skills/validator.js.map +1 -0
  184. package/dist/hooks/learned-skills/writer.d.ts +27 -0
  185. package/dist/hooks/learned-skills/writer.d.ts.map +1 -0
  186. package/dist/hooks/learned-skills/writer.js +126 -0
  187. package/dist/hooks/learned-skills/writer.js.map +1 -0
  188. package/dist/hooks/mnemosyne/config.d.ts +53 -0
  189. package/dist/hooks/mnemosyne/config.d.ts.map +1 -0
  190. package/dist/hooks/mnemosyne/config.js +103 -0
  191. package/dist/hooks/mnemosyne/config.js.map +1 -0
  192. package/dist/hooks/mnemosyne/constants.d.ts +24 -0
  193. package/dist/hooks/mnemosyne/constants.d.ts.map +1 -0
  194. package/dist/hooks/mnemosyne/constants.js +26 -0
  195. package/dist/hooks/mnemosyne/constants.js.map +1 -0
  196. package/dist/hooks/mnemosyne/detection-hook.d.ts +39 -0
  197. package/dist/hooks/mnemosyne/detection-hook.d.ts.map +1 -0
  198. package/dist/hooks/mnemosyne/detection-hook.js +83 -0
  199. package/dist/hooks/mnemosyne/detection-hook.js.map +1 -0
  200. package/dist/hooks/mnemosyne/detector.d.ts +30 -0
  201. package/dist/hooks/mnemosyne/detector.d.ts.map +1 -0
  202. package/dist/hooks/mnemosyne/detector.js +150 -0
  203. package/dist/hooks/mnemosyne/detector.js.map +1 -0
  204. package/dist/hooks/mnemosyne/finder.d.ts +21 -0
  205. package/dist/hooks/mnemosyne/finder.d.ts.map +1 -0
  206. package/dist/hooks/mnemosyne/finder.js +117 -0
  207. package/dist/hooks/mnemosyne/finder.js.map +1 -0
  208. package/dist/hooks/mnemosyne/index.d.ts +62 -0
  209. package/dist/hooks/mnemosyne/index.d.ts.map +1 -0
  210. package/dist/hooks/mnemosyne/index.js +137 -0
  211. package/dist/hooks/mnemosyne/index.js.map +1 -0
  212. package/dist/hooks/mnemosyne/loader.d.ts +20 -0
  213. package/dist/hooks/mnemosyne/loader.d.ts.map +1 -0
  214. package/dist/hooks/mnemosyne/loader.js +113 -0
  215. package/dist/hooks/mnemosyne/loader.js.map +1 -0
  216. package/dist/hooks/mnemosyne/parser.d.ts +21 -0
  217. package/dist/hooks/mnemosyne/parser.d.ts.map +1 -0
  218. package/dist/hooks/mnemosyne/parser.js +190 -0
  219. package/dist/hooks/mnemosyne/parser.js.map +1 -0
  220. package/dist/hooks/mnemosyne/promotion.d.ts +29 -0
  221. package/dist/hooks/mnemosyne/promotion.d.ts.map +1 -0
  222. package/dist/hooks/mnemosyne/promotion.js +87 -0
  223. package/dist/hooks/mnemosyne/promotion.js.map +1 -0
  224. package/dist/hooks/mnemosyne/types.d.ts +109 -0
  225. package/dist/hooks/mnemosyne/types.d.ts.map +1 -0
  226. package/dist/hooks/mnemosyne/types.js +8 -0
  227. package/dist/hooks/mnemosyne/types.js.map +1 -0
  228. package/dist/hooks/mnemosyne/validator.d.ts +15 -0
  229. package/dist/hooks/mnemosyne/validator.d.ts.map +1 -0
  230. package/dist/hooks/mnemosyne/validator.js +87 -0
  231. package/dist/hooks/mnemosyne/validator.js.map +1 -0
  232. package/dist/hooks/mnemosyne/writer.d.ts +27 -0
  233. package/dist/hooks/mnemosyne/writer.d.ts.map +1 -0
  234. package/dist/hooks/mnemosyne/writer.js +126 -0
  235. package/dist/hooks/mnemosyne/writer.js.map +1 -0
  236. package/dist/hooks/ralph-loop/index.d.ts +116 -0
  237. package/dist/hooks/ralph-loop/index.d.ts.map +1 -0
  238. package/dist/hooks/ralph-loop/index.js +322 -0
  239. package/dist/hooks/ralph-loop/index.js.map +1 -0
  240. package/dist/hooks/ralph-prd/index.d.ts +130 -0
  241. package/dist/hooks/ralph-prd/index.d.ts.map +1 -0
  242. package/dist/hooks/ralph-prd/index.js +310 -0
  243. package/dist/hooks/ralph-prd/index.js.map +1 -0
  244. package/dist/hooks/ralph-progress/index.d.ts +102 -0
  245. package/dist/hooks/ralph-progress/index.d.ts.map +1 -0
  246. package/dist/hooks/ralph-progress/index.js +408 -0
  247. package/dist/hooks/ralph-progress/index.js.map +1 -0
  248. package/dist/hooks/ralph-verifier/index.d.ts +72 -0
  249. package/dist/hooks/ralph-verifier/index.d.ts.map +1 -0
  250. package/dist/hooks/ralph-verifier/index.js +223 -0
  251. package/dist/hooks/ralph-verifier/index.js.map +1 -0
  252. package/dist/hooks/session-recovery/constants.d.ts +56 -0
  253. package/dist/hooks/session-recovery/constants.d.ts.map +1 -0
  254. package/dist/hooks/session-recovery/constants.js +78 -0
  255. package/dist/hooks/session-recovery/constants.js.map +1 -0
  256. package/dist/hooks/session-recovery/index.d.ts +53 -0
  257. package/dist/hooks/session-recovery/index.d.ts.map +1 -0
  258. package/dist/hooks/session-recovery/index.js +321 -0
  259. package/dist/hooks/session-recovery/index.js.map +1 -0
  260. package/dist/hooks/session-recovery/storage.d.ts +76 -0
  261. package/dist/hooks/session-recovery/storage.d.ts.map +1 -0
  262. package/dist/hooks/session-recovery/storage.js +383 -0
  263. package/dist/hooks/session-recovery/storage.js.map +1 -0
  264. package/dist/hooks/session-recovery/types.d.ts +145 -0
  265. package/dist/hooks/session-recovery/types.d.ts.map +1 -0
  266. package/dist/hooks/session-recovery/types.js +8 -0
  267. package/dist/hooks/session-recovery/types.js.map +1 -0
  268. package/dist/hooks/sisyphus-orchestrator/constants.d.ts +23 -0
  269. package/dist/hooks/sisyphus-orchestrator/constants.d.ts.map +1 -0
  270. package/dist/hooks/sisyphus-orchestrator/constants.js +142 -0
  271. package/dist/hooks/sisyphus-orchestrator/constants.js.map +1 -0
  272. package/dist/hooks/sisyphus-orchestrator/index.d.ts +113 -0
  273. package/dist/hooks/sisyphus-orchestrator/index.d.ts.map +1 -0
  274. package/dist/hooks/sisyphus-orchestrator/index.js +309 -0
  275. package/dist/hooks/sisyphus-orchestrator/index.js.map +1 -0
  276. package/dist/hooks/subagent-tracker/index.d.ts +83 -0
  277. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -0
  278. package/dist/hooks/subagent-tracker/index.js +207 -0
  279. package/dist/hooks/subagent-tracker/index.js.map +1 -0
  280. package/dist/hooks/ultraqa-loop/index.d.ts +94 -0
  281. package/dist/hooks/ultraqa-loop/index.d.ts.map +1 -0
  282. package/dist/hooks/ultraqa-loop/index.js +216 -0
  283. package/dist/hooks/ultraqa-loop/index.js.map +1 -0
  284. package/dist/hooks/ultrawork-state/index.d.ts +62 -0
  285. package/dist/hooks/ultrawork-state/index.d.ts.map +1 -0
  286. package/dist/hooks/ultrawork-state/index.js +208 -0
  287. package/dist/hooks/ultrawork-state/index.js.map +1 -0
  288. package/dist/hud/sisyphus-state.d.ts +31 -0
  289. package/dist/hud/sisyphus-state.d.ts.map +1 -0
  290. package/dist/hud/sisyphus-state.js +163 -0
  291. package/dist/hud/sisyphus-state.js.map +1 -0
  292. package/dist/installer/index.d.ts +1 -1
  293. package/dist/installer/index.js +1 -1
  294. package/docs/MIGRATION.md +2 -2
  295. package/docs/design/project-session-manager.md +1033 -0
  296. package/package.json +1 -1
  297. package/skills/doctor/SKILL.md +1 -1
  298. package/skills/project-session-manager/SKILL.md +410 -0
  299. package/skills/project-session-manager/lib/config.sh +86 -0
  300. package/skills/project-session-manager/lib/parse.sh +121 -0
  301. package/skills/project-session-manager/lib/session.sh +132 -0
  302. package/skills/project-session-manager/lib/tmux.sh +103 -0
  303. package/skills/project-session-manager/lib/worktree.sh +171 -0
  304. package/skills/project-session-manager/psm.sh +629 -0
  305. package/skills/project-session-manager/templates/feature.md +56 -0
  306. package/skills/project-session-manager/templates/issue-fix.md +57 -0
  307. package/skills/project-session-manager/templates/pr-review.md +65 -0
  308. package/skills/project-session-manager/templates/projects.json +19 -0
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Subagent Tracker Hook
3
+ *
4
+ * Tracks SubagentStart and SubagentStop events to maintain state of active agents.
5
+ * Useful for monitoring parallel execution in ultrapilot, swarm, and other multi-agent modes.
6
+ */
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
8
+ import { join } from 'path';
9
+ // ============================================================================
10
+ // State File Management
11
+ // ============================================================================
12
+ /**
13
+ * Get the path to the subagent tracking state file.
14
+ */
15
+ export function getStateFilePath(directory) {
16
+ return join(directory, '.omc', 'state', 'subagent-tracking.json');
17
+ }
18
+ /**
19
+ * Read the current subagent tracking state.
20
+ */
21
+ export function readTrackingState(directory) {
22
+ const filePath = getStateFilePath(directory);
23
+ if (!existsSync(filePath)) {
24
+ return null;
25
+ }
26
+ try {
27
+ const content = readFileSync(filePath, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch (error) {
31
+ console.error('[subagent-tracker] Failed to read state:', error);
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Write subagent tracking state to disk.
37
+ */
38
+ export function writeTrackingState(directory, state) {
39
+ const filePath = getStateFilePath(directory);
40
+ const stateDir = join(directory, '.omc', 'state');
41
+ if (!existsSync(stateDir)) {
42
+ mkdirSync(stateDir, { recursive: true });
43
+ }
44
+ try {
45
+ writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');
46
+ }
47
+ catch (error) {
48
+ console.error('[subagent-tracker] Failed to write state:', error);
49
+ }
50
+ }
51
+ /**
52
+ * Get or initialize tracking state.
53
+ */
54
+ function getOrInitState(directory) {
55
+ const existing = readTrackingState(directory);
56
+ if (existing) {
57
+ return existing;
58
+ }
59
+ return {
60
+ active_agents: {},
61
+ completed_agents: {},
62
+ total_spawned: 0,
63
+ total_completed: 0,
64
+ };
65
+ }
66
+ // ============================================================================
67
+ // Hook Event Processors
68
+ // ============================================================================
69
+ /**
70
+ * Process SubagentStart event - track new agent spawn.
71
+ */
72
+ export function processSubagentStart(input) {
73
+ const { cwd, agent_id, agent_type } = input;
74
+ try {
75
+ const state = getOrInitState(cwd);
76
+ // Add to active agents
77
+ state.active_agents[agent_id] = {
78
+ agent_id,
79
+ agent_type,
80
+ started_at: new Date().toISOString(),
81
+ };
82
+ state.total_spawned++;
83
+ writeTrackingState(cwd, state);
84
+ return {
85
+ status: 'success',
86
+ message: `Tracking started for agent ${agent_id} (${agent_type})`,
87
+ data: { agent_id, agent_type },
88
+ };
89
+ }
90
+ catch (error) {
91
+ return {
92
+ status: 'error',
93
+ message: `Failed to process SubagentStart: ${error}`,
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * Process SubagentStop event - mark agent as completed.
99
+ */
100
+ export function processSubagentStop(input) {
101
+ const { cwd, agent_id, agent_transcript_path } = input;
102
+ try {
103
+ const state = getOrInitState(cwd);
104
+ // Find the active agent
105
+ const activeAgent = state.active_agents[agent_id];
106
+ if (!activeAgent) {
107
+ return {
108
+ status: 'error',
109
+ message: `Agent ${agent_id} not found in active agents`,
110
+ };
111
+ }
112
+ // Calculate duration
113
+ const startTime = new Date(activeAgent.started_at).getTime();
114
+ const endTime = Date.now();
115
+ const duration_ms = endTime - startTime;
116
+ // Move to completed agents
117
+ state.completed_agents[agent_id] = {
118
+ agent_id,
119
+ agent_type: activeAgent.agent_type,
120
+ duration_ms,
121
+ success: true, // Default to true; could be enhanced with exit code
122
+ output_summary: agent_transcript_path,
123
+ };
124
+ // Remove from active agents
125
+ delete state.active_agents[agent_id];
126
+ state.total_completed++;
127
+ writeTrackingState(cwd, state);
128
+ return {
129
+ status: 'success',
130
+ message: `Agent ${agent_id} completed in ${duration_ms}ms`,
131
+ data: { agent_id, duration_ms },
132
+ };
133
+ }
134
+ catch (error) {
135
+ return {
136
+ status: 'error',
137
+ message: `Failed to process SubagentStop: ${error}`,
138
+ };
139
+ }
140
+ }
141
+ // ============================================================================
142
+ // Utility Functions
143
+ // ============================================================================
144
+ /**
145
+ * Remove agents that have been active for longer than maxAgeMs.
146
+ * Useful for cleaning up stale agents that may have crashed.
147
+ */
148
+ export function cleanupStaleAgents(directory, maxAgeMs = 300000 // 5 minutes default
149
+ ) {
150
+ const state = readTrackingState(directory);
151
+ if (!state) {
152
+ return;
153
+ }
154
+ const now = Date.now();
155
+ let cleaned = 0;
156
+ for (const [agent_id, info] of Object.entries(state.active_agents)) {
157
+ const startTime = new Date(info.started_at).getTime();
158
+ const age = now - startTime;
159
+ if (age > maxAgeMs) {
160
+ // Move to completed as failed
161
+ state.completed_agents[agent_id] = {
162
+ agent_id,
163
+ agent_type: info.agent_type,
164
+ duration_ms: age,
165
+ success: false,
166
+ output_summary: 'Cleaned up as stale',
167
+ };
168
+ delete state.active_agents[agent_id];
169
+ state.total_completed++;
170
+ cleaned++;
171
+ }
172
+ }
173
+ if (cleaned > 0) {
174
+ writeTrackingState(directory, state);
175
+ console.log(`[subagent-tracker] Cleaned up ${cleaned} stale agent(s)`);
176
+ }
177
+ }
178
+ /**
179
+ * Get the count of currently active agents.
180
+ */
181
+ export function getActiveAgentCount(directory) {
182
+ const state = readTrackingState(directory);
183
+ if (!state) {
184
+ return 0;
185
+ }
186
+ return Object.keys(state.active_agents).length;
187
+ }
188
+ /**
189
+ * Get a count of agents by type (both active and completed).
190
+ */
191
+ export function getAgentsByType(directory) {
192
+ const state = readTrackingState(directory);
193
+ if (!state) {
194
+ return {};
195
+ }
196
+ const counts = {};
197
+ // Count active agents
198
+ for (const info of Object.values(state.active_agents)) {
199
+ counts[info.agent_type] = (counts[info.agent_type] || 0) + 1;
200
+ }
201
+ // Count completed agents
202
+ for (const info of Object.values(state.completed_agents)) {
203
+ counts[info.agent_type] = (counts[info.agent_type] || 0) + 1;
204
+ }
205
+ return counts;
206
+ }
207
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/subagent-tracker/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * UltraQA Loop Hook
3
+ *
4
+ * QA cycling workflow that runs test → architect verify → fix → repeat
5
+ * until the QA goal is met or max cycles reached.
6
+ */
7
+ export type UltraQAGoalType = 'tests' | 'build' | 'lint' | 'typecheck' | 'custom';
8
+ export interface UltraQAState {
9
+ /** Whether the loop is currently active */
10
+ active: boolean;
11
+ /** Type of QA goal */
12
+ goal_type: UltraQAGoalType;
13
+ /** Custom pattern to match (for custom goal type) */
14
+ goal_pattern: string | null;
15
+ /** Current cycle number */
16
+ cycle: number;
17
+ /** Maximum cycles before stopping */
18
+ max_cycles: number;
19
+ /** Array of failure descriptions for pattern detection */
20
+ failures: string[];
21
+ /** When the loop started */
22
+ started_at: string;
23
+ /** Session ID the loop is bound to */
24
+ session_id?: string;
25
+ }
26
+ export interface UltraQAOptions {
27
+ /** Maximum cycles (default: 5) */
28
+ maxCycles?: number;
29
+ /** Custom pattern for custom goal type */
30
+ customPattern?: string;
31
+ }
32
+ export interface UltraQAResult {
33
+ /** Whether the goal was met */
34
+ success: boolean;
35
+ /** Number of cycles taken */
36
+ cycles: number;
37
+ /** Reason for exit */
38
+ reason: 'goal_met' | 'max_cycles' | 'same_failure' | 'env_error' | 'cancelled';
39
+ /** Diagnosis message if failed */
40
+ diagnosis?: string;
41
+ }
42
+ /**
43
+ * Read UltraQA state from disk
44
+ */
45
+ export declare function readUltraQAState(directory: string): UltraQAState | null;
46
+ /**
47
+ * Write UltraQA state to disk
48
+ */
49
+ export declare function writeUltraQAState(directory: string, state: UltraQAState): boolean;
50
+ /**
51
+ * Clear UltraQA state
52
+ */
53
+ export declare function clearUltraQAState(directory: string): boolean;
54
+ /**
55
+ * Check if Ralph Loop is active (mutual exclusion check)
56
+ */
57
+ export declare function isRalphLoopActive(directory: string): boolean;
58
+ /**
59
+ * Start a new UltraQA cycle
60
+ * Returns false if Ralph Loop is already active (mutual exclusion)
61
+ */
62
+ export declare function startUltraQA(directory: string, goalType: UltraQAGoalType, sessionId: string, options?: UltraQAOptions): {
63
+ success: boolean;
64
+ error?: string;
65
+ };
66
+ /**
67
+ * Record a failure and increment cycle
68
+ */
69
+ export declare function recordFailure(directory: string, failureDescription: string): {
70
+ state: UltraQAState | null;
71
+ shouldExit: boolean;
72
+ reason?: string;
73
+ };
74
+ /**
75
+ * Mark UltraQA as successful
76
+ */
77
+ export declare function completeUltraQA(directory: string): UltraQAResult | null;
78
+ /**
79
+ * Stop UltraQA with failure
80
+ */
81
+ export declare function stopUltraQA(directory: string, reason: 'max_cycles' | 'same_failure' | 'env_error', diagnosis: string): UltraQAResult | null;
82
+ /**
83
+ * Cancel UltraQA
84
+ */
85
+ export declare function cancelUltraQA(directory: string): boolean;
86
+ /**
87
+ * Get goal command based on goal type
88
+ */
89
+ export declare function getGoalCommand(goalType: UltraQAGoalType): string;
90
+ /**
91
+ * Format progress message
92
+ */
93
+ export declare function formatProgressMessage(cycle: number, maxCycles: number, status: string): string;
94
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/ultraqa-loop/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElF,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,MAAM,EAAE,OAAO,CAAC;IAChB,sBAAsB;IACtB,SAAS,EAAE,eAAe,CAAC;IAC3B,qDAAqD;IACrD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,cAAc,GAAG,WAAW,GAAG,WAAW,CAAC;IAC/E,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAavE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CASjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAa5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,EACzB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBtC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,GACzB;IAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAqCtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAevE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,GAAG,cAAc,GAAG,WAAW,EACnD,SAAS,EAAE,MAAM,GAChB,aAAa,GAAG,IAAI,CAgBtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAExD;AAgBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAahE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,MAAM,CAER"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * UltraQA Loop Hook
3
+ *
4
+ * QA cycling workflow that runs test → architect verify → fix → repeat
5
+ * until the QA goal is met or max cycles reached.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { readRalphState } from '../ralph-loop/index.js';
10
+ const DEFAULT_MAX_CYCLES = 5;
11
+ const SAME_FAILURE_THRESHOLD = 3;
12
+ /**
13
+ * Get the state file path for UltraQA
14
+ */
15
+ function getStateFilePath(directory) {
16
+ const omcDir = join(directory, '.omc');
17
+ return join(omcDir, 'ultraqa-state.json');
18
+ }
19
+ /**
20
+ * Ensure the .omc directory exists
21
+ */
22
+ function ensureStateDir(directory) {
23
+ const omcDir = join(directory, '.omc');
24
+ if (!existsSync(omcDir)) {
25
+ mkdirSync(omcDir, { recursive: true });
26
+ }
27
+ }
28
+ /**
29
+ * Read UltraQA state from disk
30
+ */
31
+ export function readUltraQAState(directory) {
32
+ const stateFile = getStateFilePath(directory);
33
+ if (!existsSync(stateFile)) {
34
+ return null;
35
+ }
36
+ try {
37
+ const content = readFileSync(stateFile, 'utf-8');
38
+ return JSON.parse(content);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /**
45
+ * Write UltraQA state to disk
46
+ */
47
+ export function writeUltraQAState(directory, state) {
48
+ try {
49
+ ensureStateDir(directory);
50
+ const stateFile = getStateFilePath(directory);
51
+ writeFileSync(stateFile, JSON.stringify(state, null, 2));
52
+ return true;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * Clear UltraQA state
60
+ */
61
+ export function clearUltraQAState(directory) {
62
+ const stateFile = getStateFilePath(directory);
63
+ if (!existsSync(stateFile)) {
64
+ return true;
65
+ }
66
+ try {
67
+ unlinkSync(stateFile);
68
+ return true;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Check if Ralph Loop is active (mutual exclusion check)
76
+ */
77
+ export function isRalphLoopActive(directory) {
78
+ const ralphState = readRalphState(directory);
79
+ return ralphState !== null && ralphState.active === true;
80
+ }
81
+ /**
82
+ * Start a new UltraQA cycle
83
+ * Returns false if Ralph Loop is already active (mutual exclusion)
84
+ */
85
+ export function startUltraQA(directory, goalType, sessionId, options) {
86
+ // Mutual exclusion check: cannot start UltraQA if Ralph Loop is active
87
+ if (isRalphLoopActive(directory)) {
88
+ return {
89
+ success: false,
90
+ error: 'Cannot start UltraQA while Ralph Loop is active. Cancel Ralph Loop first with /oh-my-claudecode:cancel-ralph.'
91
+ };
92
+ }
93
+ const state = {
94
+ active: true,
95
+ goal_type: goalType,
96
+ goal_pattern: options?.customPattern ?? null,
97
+ cycle: 1,
98
+ max_cycles: options?.maxCycles ?? DEFAULT_MAX_CYCLES,
99
+ failures: [],
100
+ started_at: new Date().toISOString(),
101
+ session_id: sessionId
102
+ };
103
+ const written = writeUltraQAState(directory, state);
104
+ return { success: written };
105
+ }
106
+ /**
107
+ * Record a failure and increment cycle
108
+ */
109
+ export function recordFailure(directory, failureDescription) {
110
+ const state = readUltraQAState(directory);
111
+ if (!state || !state.active) {
112
+ return { state: null, shouldExit: true, reason: 'not_active' };
113
+ }
114
+ // Add failure to array
115
+ state.failures.push(failureDescription);
116
+ // Check for repeated same failure
117
+ const recentFailures = state.failures.slice(-SAME_FAILURE_THRESHOLD);
118
+ if (recentFailures.length >= SAME_FAILURE_THRESHOLD) {
119
+ const allSame = recentFailures.every(f => normalizeFailure(f) === normalizeFailure(recentFailures[0]));
120
+ if (allSame) {
121
+ return {
122
+ state,
123
+ shouldExit: true,
124
+ reason: `Same failure detected ${SAME_FAILURE_THRESHOLD} times: ${recentFailures[0]}`
125
+ };
126
+ }
127
+ }
128
+ // Increment cycle
129
+ state.cycle += 1;
130
+ // Check max cycles
131
+ if (state.cycle > state.max_cycles) {
132
+ return {
133
+ state,
134
+ shouldExit: true,
135
+ reason: `Max cycles (${state.max_cycles}) reached`
136
+ };
137
+ }
138
+ writeUltraQAState(directory, state);
139
+ return { state, shouldExit: false };
140
+ }
141
+ /**
142
+ * Mark UltraQA as successful
143
+ */
144
+ export function completeUltraQA(directory) {
145
+ const state = readUltraQAState(directory);
146
+ if (!state) {
147
+ return null;
148
+ }
149
+ const result = {
150
+ success: true,
151
+ cycles: state.cycle,
152
+ reason: 'goal_met'
153
+ };
154
+ clearUltraQAState(directory);
155
+ return result;
156
+ }
157
+ /**
158
+ * Stop UltraQA with failure
159
+ */
160
+ export function stopUltraQA(directory, reason, diagnosis) {
161
+ const state = readUltraQAState(directory);
162
+ if (!state) {
163
+ return null;
164
+ }
165
+ const result = {
166
+ success: false,
167
+ cycles: state.cycle,
168
+ reason,
169
+ diagnosis
170
+ };
171
+ clearUltraQAState(directory);
172
+ return result;
173
+ }
174
+ /**
175
+ * Cancel UltraQA
176
+ */
177
+ export function cancelUltraQA(directory) {
178
+ return clearUltraQAState(directory);
179
+ }
180
+ /**
181
+ * Normalize failure description for comparison
182
+ */
183
+ function normalizeFailure(failure) {
184
+ // Remove timestamps, line numbers, and other variable parts
185
+ return failure
186
+ .replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/g, '') // ISO timestamps
187
+ .replace(/:\d+:\d+/g, '') // line:col numbers
188
+ .replace(/\d+ms/g, '') // timing
189
+ .replace(/\s+/g, ' ')
190
+ .trim()
191
+ .toLowerCase();
192
+ }
193
+ /**
194
+ * Get goal command based on goal type
195
+ */
196
+ export function getGoalCommand(goalType) {
197
+ switch (goalType) {
198
+ case 'tests':
199
+ return 'npm test';
200
+ case 'build':
201
+ return 'npm run build';
202
+ case 'lint':
203
+ return 'npm run lint';
204
+ case 'typecheck':
205
+ return 'npm run typecheck || tsc --noEmit';
206
+ case 'custom':
207
+ return '# Custom command based on goal pattern';
208
+ }
209
+ }
210
+ /**
211
+ * Format progress message
212
+ */
213
+ export function formatProgressMessage(cycle, maxCycles, status) {
214
+ return `[ULTRAQA Cycle ${cycle}/${maxCycles}] ${status}`;
215
+ }
216
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/ultraqa-loop/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Ultrawork State Management
3
+ *
4
+ * Manages persistent ultrawork mode state across sessions.
5
+ * When ultrawork is activated and todos remain incomplete,
6
+ * this module ensures the mode persists until all work is done.
7
+ */
8
+ export interface UltraworkState {
9
+ /** Whether ultrawork mode is currently active */
10
+ active: boolean;
11
+ /** When ultrawork was activated */
12
+ started_at: string;
13
+ /** The original prompt that triggered ultrawork */
14
+ original_prompt: string;
15
+ /** Session ID the mode is bound to */
16
+ session_id?: string;
17
+ /** Number of times the mode has been reinforced (for metrics) */
18
+ reinforcement_count: number;
19
+ /** Last time the mode was checked/reinforced */
20
+ last_checked_at: string;
21
+ /** Whether this ultrawork session is linked to a ralph-loop session */
22
+ linked_to_ralph?: boolean;
23
+ }
24
+ /**
25
+ * Read Ultrawork state from disk (checks both local and global)
26
+ */
27
+ export declare function readUltraworkState(directory?: string): UltraworkState | null;
28
+ /**
29
+ * Write Ultrawork state to disk (both local and global for redundancy)
30
+ */
31
+ export declare function writeUltraworkState(state: UltraworkState, directory?: string): boolean;
32
+ /**
33
+ * Activate ultrawork mode
34
+ */
35
+ export declare function activateUltrawork(prompt: string, sessionId?: string, directory?: string, linkedToRalph?: boolean): boolean;
36
+ /**
37
+ * Deactivate ultrawork mode
38
+ */
39
+ export declare function deactivateUltrawork(directory?: string): boolean;
40
+ /**
41
+ * Increment reinforcement count (called when mode is reinforced on stop)
42
+ */
43
+ export declare function incrementReinforcement(directory?: string): UltraworkState | null;
44
+ /**
45
+ * Check if ultrawork should be reinforced (active with pending todos)
46
+ */
47
+ export declare function shouldReinforceUltrawork(sessionId?: string, directory?: string): boolean;
48
+ /**
49
+ * Get ultrawork persistence message for injection
50
+ */
51
+ export declare function getUltraworkPersistenceMessage(state: UltraworkState): string;
52
+ /**
53
+ * Create an Ultrawork State hook instance
54
+ */
55
+ export declare function createUltraworkStateHook(directory: string): {
56
+ activate: (prompt: string, sessionId?: string) => boolean;
57
+ deactivate: () => boolean;
58
+ getState: () => UltraworkState | null;
59
+ shouldReinforce: (sessionId?: string) => boolean;
60
+ incrementReinforcement: () => UltraworkState | null;
61
+ };
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/ultrawork-state/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,cAAc;IAC7B,iDAAiD;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,eAAe,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA+CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAwB5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAgBtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,OAAO,GACtB,OAAO,CAYT;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAuB/D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAehF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAuB5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM;uBAEnC,MAAM,cAAc,MAAM;;;kCAIf,MAAM;;EAIvC"}