sisyphi 1.1.18 → 1.1.19

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 (231) hide show
  1. package/README.md +195 -75
  2. package/dist/chunk-36VJ7ZBD.js +1898 -0
  3. package/dist/chunk-36VJ7ZBD.js.map +1 -0
  4. package/dist/{chunk-C2XKXERJ.js → chunk-M6Z3KHOH.js} +159 -46
  5. package/dist/chunk-M6Z3KHOH.js.map +1 -0
  6. package/dist/chunk-O4ZHSQ5R.js +544 -0
  7. package/dist/chunk-O4ZHSQ5R.js.map +1 -0
  8. package/dist/chunk-P2HHTIPM.js +478 -0
  9. package/dist/chunk-P2HHTIPM.js.map +1 -0
  10. package/dist/{chunk-TMBAVPHH.js → chunk-PNDCVKBN.js} +73 -1
  11. package/dist/chunk-PNDCVKBN.js.map +1 -0
  12. package/dist/chunk-SVGIQ2G4.js +1076 -0
  13. package/dist/chunk-SVGIQ2G4.js.map +1 -0
  14. package/dist/cli.js +4405 -892
  15. package/dist/cli.js.map +1 -1
  16. package/dist/daemon.js +4340 -1990
  17. package/dist/daemon.js.map +1 -1
  18. package/dist/{paths-XRDEEJ5R.js → paths-JXFLR5BN.js} +38 -2
  19. package/dist/single-ask-6G4BIVY2.js +132 -0
  20. package/dist/single-ask-6G4BIVY2.js.map +1 -0
  21. package/dist/templates/CLAUDE.md +1 -56
  22. package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -65
  23. package/dist/templates/agent-plugin/agents/debug.md +43 -6
  24. package/dist/templates/agent-plugin/agents/debug.settings.json +57 -0
  25. package/dist/templates/agent-plugin/agents/explore.md +28 -1
  26. package/dist/templates/agent-plugin/agents/explore.settings.json +57 -0
  27. package/dist/templates/agent-plugin/agents/implementor.md +94 -0
  28. package/dist/templates/agent-plugin/agents/implementor.settings.json +57 -0
  29. package/dist/templates/agent-plugin/agents/operator.md +43 -1
  30. package/dist/templates/agent-plugin/agents/operator.settings.json +57 -0
  31. package/dist/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  32. package/dist/templates/agent-plugin/agents/plan.md +176 -86
  33. package/dist/templates/agent-plugin/agents/plan.settings.json +57 -0
  34. package/dist/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  35. package/dist/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  36. package/dist/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  37. package/dist/templates/agent-plugin/agents/problem/precedent.md +25 -0
  38. package/dist/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  39. package/dist/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  40. package/dist/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  41. package/dist/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  42. package/dist/templates/agent-plugin/agents/problem.md +334 -79
  43. package/dist/templates/agent-plugin/agents/problem.settings.json +57 -0
  44. package/dist/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  45. package/dist/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  46. package/dist/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  47. package/dist/templates/agent-plugin/agents/research-lead.md +184 -0
  48. package/dist/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  49. package/dist/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  50. package/dist/templates/agent-plugin/agents/review/compliance.md +14 -3
  51. package/dist/templates/agent-plugin/agents/review/efficiency.md +15 -4
  52. package/dist/templates/agent-plugin/agents/review/quality.md +20 -6
  53. package/dist/templates/agent-plugin/agents/review/reuse.md +17 -5
  54. package/dist/templates/agent-plugin/agents/review/security.md +10 -3
  55. package/dist/templates/agent-plugin/agents/review/tests.md +58 -0
  56. package/dist/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  57. package/dist/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  58. package/dist/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  59. package/dist/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  60. package/dist/templates/agent-plugin/agents/review-plan/security.md +5 -2
  61. package/dist/templates/agent-plugin/agents/review-plan.md +52 -5
  62. package/dist/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  63. package/dist/templates/agent-plugin/agents/review.md +89 -16
  64. package/dist/templates/agent-plugin/agents/review.settings.json +57 -0
  65. package/dist/templates/agent-plugin/agents/spec/engineer.md +175 -0
  66. package/dist/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  67. package/dist/templates/agent-plugin/agents/spec.md +444 -0
  68. package/dist/templates/agent-plugin/agents/spec.settings.json +57 -0
  69. package/dist/templates/agent-plugin/agents/test-spec.md +58 -2
  70. package/dist/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  71. package/dist/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  72. package/dist/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  73. package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  74. package/dist/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  75. package/dist/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  76. package/dist/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  77. package/dist/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  78. package/dist/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  79. package/dist/templates/agent-plugin/hooks/require-submit.sh +51 -42
  80. package/dist/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  81. package/dist/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  82. package/dist/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  83. package/dist/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  84. package/dist/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  85. package/dist/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  86. package/dist/templates/agent-suffix.md +7 -4
  87. package/dist/templates/baleia.lua +42 -0
  88. package/dist/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  89. package/dist/templates/dashboard-claude.md +7 -3
  90. package/dist/templates/orchestrator-base.md +89 -52
  91. package/dist/templates/orchestrator-completion.md +47 -24
  92. package/dist/templates/orchestrator-discovery.md +183 -0
  93. package/dist/templates/orchestrator-impl.md +47 -18
  94. package/dist/templates/orchestrator-planning.md +109 -20
  95. package/dist/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  96. package/dist/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  97. package/dist/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  98. package/dist/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  99. package/dist/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  100. package/dist/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  101. package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  102. package/dist/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  103. package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  104. package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  105. package/dist/templates/orchestrator-settings.json +55 -0
  106. package/dist/templates/orchestrator-validation.md +17 -14
  107. package/dist/templates/sisyphus-init.lua +30 -0
  108. package/dist/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  109. package/dist/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  110. package/dist/templates/termrender-haiku-system.md +82 -0
  111. package/dist/templates/whip-animation.sh +345 -0
  112. package/dist/tui.js +3242 -2189
  113. package/dist/tui.js.map +1 -1
  114. package/native/SisyphusNotify/main.swift +15 -5
  115. package/package.json +8 -6
  116. package/templates/CLAUDE.md +1 -56
  117. package/templates/agent-plugin/agents/CLAUDE.md +2 -65
  118. package/templates/agent-plugin/agents/debug.md +43 -6
  119. package/templates/agent-plugin/agents/debug.settings.json +57 -0
  120. package/templates/agent-plugin/agents/explore.md +28 -1
  121. package/templates/agent-plugin/agents/explore.settings.json +57 -0
  122. package/templates/agent-plugin/agents/implementor.md +94 -0
  123. package/templates/agent-plugin/agents/implementor.settings.json +57 -0
  124. package/templates/agent-plugin/agents/operator.md +43 -1
  125. package/templates/agent-plugin/agents/operator.settings.json +57 -0
  126. package/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
  127. package/templates/agent-plugin/agents/plan.md +176 -86
  128. package/templates/agent-plugin/agents/plan.settings.json +57 -0
  129. package/templates/agent-plugin/agents/problem/adversarial.md +26 -0
  130. package/templates/agent-plugin/agents/problem/contrarian.md +26 -0
  131. package/templates/agent-plugin/agents/problem/first-principles.md +26 -0
  132. package/templates/agent-plugin/agents/problem/precedent.md +25 -0
  133. package/templates/agent-plugin/agents/problem/simplifier.md +26 -0
  134. package/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
  135. package/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
  136. package/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
  137. package/templates/agent-plugin/agents/problem.md +334 -79
  138. package/templates/agent-plugin/agents/problem.settings.json +57 -0
  139. package/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
  140. package/templates/agent-plugin/agents/research-lead/critic.md +61 -0
  141. package/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
  142. package/templates/agent-plugin/agents/research-lead.md +184 -0
  143. package/templates/agent-plugin/agents/research-lead.settings.json +57 -0
  144. package/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
  145. package/templates/agent-plugin/agents/review/compliance.md +14 -3
  146. package/templates/agent-plugin/agents/review/efficiency.md +15 -4
  147. package/templates/agent-plugin/agents/review/quality.md +20 -6
  148. package/templates/agent-plugin/agents/review/reuse.md +17 -5
  149. package/templates/agent-plugin/agents/review/security.md +10 -3
  150. package/templates/agent-plugin/agents/review/tests.md +58 -0
  151. package/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
  152. package/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
  153. package/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
  154. package/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
  155. package/templates/agent-plugin/agents/review-plan/security.md +5 -2
  156. package/templates/agent-plugin/agents/review-plan.md +52 -5
  157. package/templates/agent-plugin/agents/review-plan.settings.json +57 -0
  158. package/templates/agent-plugin/agents/review.md +89 -16
  159. package/templates/agent-plugin/agents/review.settings.json +57 -0
  160. package/templates/agent-plugin/agents/spec/engineer.md +175 -0
  161. package/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
  162. package/templates/agent-plugin/agents/spec.md +444 -0
  163. package/templates/agent-plugin/agents/spec.settings.json +57 -0
  164. package/templates/agent-plugin/agents/test-spec.md +58 -2
  165. package/templates/agent-plugin/agents/test-spec.settings.json +57 -0
  166. package/templates/agent-plugin/hooks/CLAUDE.md +9 -57
  167. package/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
  168. package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
  169. package/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
  170. package/templates/agent-plugin/hooks/plan-validate.sh +97 -0
  171. package/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
  172. package/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
  173. package/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
  174. package/templates/agent-plugin/hooks/require-submit.sh +51 -42
  175. package/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
  176. package/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
  177. package/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
  178. package/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
  179. package/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
  180. package/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
  181. package/templates/agent-suffix.md +7 -4
  182. package/templates/baleia.lua +42 -0
  183. package/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
  184. package/templates/dashboard-claude.md +7 -3
  185. package/templates/orchestrator-base.md +89 -52
  186. package/templates/orchestrator-completion.md +47 -24
  187. package/templates/orchestrator-discovery.md +183 -0
  188. package/templates/orchestrator-impl.md +47 -18
  189. package/templates/orchestrator-planning.md +109 -20
  190. package/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
  191. package/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
  192. package/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
  193. package/templates/orchestrator-plugin/hooks/hooks.json +0 -10
  194. package/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
  195. package/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
  196. package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
  197. package/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
  198. package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
  199. package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
  200. package/templates/orchestrator-settings.json +55 -0
  201. package/templates/orchestrator-validation.md +17 -14
  202. package/templates/sisyphus-init.lua +30 -0
  203. package/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
  204. package/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
  205. package/templates/termrender-haiku-system.md +82 -0
  206. package/templates/whip-animation.sh +345 -0
  207. package/dist/chunk-22ZGZTGY.js +0 -67
  208. package/dist/chunk-22ZGZTGY.js.map +0 -1
  209. package/dist/chunk-6PJVJEYQ.js +0 -46
  210. package/dist/chunk-6PJVJEYQ.js.map +0 -1
  211. package/dist/chunk-C2XKXERJ.js.map +0 -1
  212. package/dist/chunk-TMBAVPHH.js.map +0 -1
  213. package/dist/chunk-V36NXMHP.js +0 -299
  214. package/dist/chunk-V36NXMHP.js.map +0 -1
  215. package/dist/templates/agent-plugin/agents/design.md +0 -134
  216. package/dist/templates/agent-plugin/agents/requirements.md +0 -138
  217. package/dist/templates/begin.md +0 -22
  218. package/dist/templates/nvim-tutorial.txt +0 -68
  219. package/dist/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  220. package/dist/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  221. package/dist/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  222. package/dist/templates/orchestrator-strategy.md +0 -238
  223. package/templates/agent-plugin/agents/design.md +0 -134
  224. package/templates/agent-plugin/agents/requirements.md +0 -138
  225. package/templates/begin.md +0 -22
  226. package/templates/nvim-tutorial.txt +0 -68
  227. package/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
  228. package/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
  229. package/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
  230. package/templates/orchestrator-strategy.md +0 -238
  231. /package/dist/{paths-XRDEEJ5R.js.map → paths-JXFLR5BN.js.map} +0 -0
@@ -1,56 +1,158 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ACHIEVEMENTS
4
- } from "./chunk-V36NXMHP.js";
4
+ } from "./chunk-36VJ7ZBD.js";
5
5
  import {
6
6
  goalPath,
7
7
  roadmapPath,
8
8
  sessionsDir,
9
9
  socketPath,
10
10
  statePath
11
- } from "./chunk-TMBAVPHH.js";
11
+ } from "./chunk-PNDCVKBN.js";
12
12
 
13
- // src/shared/utils.ts
14
- function computeActiveTimeMs(session) {
15
- return session.activeMs;
16
- }
17
-
18
- // src/shared/format.ts
19
- function formatDuration(startOrMs, endIso) {
20
- let totalMs;
21
- if (typeof startOrMs === "number") {
22
- totalMs = startOrMs;
23
- } else {
24
- const start = new Date(startOrMs).getTime();
25
- const end = endIso ? new Date(endIso).getTime() : Date.now();
26
- totalMs = end - start;
13
+ // src/shared/keymap.ts
14
+ function formatHelpForKeymap(km) {
15
+ const COL1 = 20;
16
+ const MAX_W = 78;
17
+ function shortLabel(raw, max) {
18
+ return raw.trimStart().replace(/\s*\([^)]*\)\s*/g, "").replace(/\s+--\S*/g, "").trimEnd().slice(0, max).trimEnd();
19
+ }
20
+ const lines = [];
21
+ lines.push(" Sisyphus Keybindings (Ctrl-s + key)");
22
+ lines.push("");
23
+ lines.push(" \u2500\u2500 Direct \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
24
+ for (const item of km.topLevel.items) {
25
+ if (item.action.type === "submenu" || item.action.type === "tui" || item.hidden) continue;
26
+ const key = item.key.trim() === "" ? "spc" : item.key;
27
+ lines.push(` ${key.padEnd(4)} ${shortLabel(item.label, 30)}`);
28
+ }
29
+ lines.push("");
30
+ lines.push(" \u2500\u2500 Submenus \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
31
+ for (const topItem of km.topLevel.items) {
32
+ if (topItem.action.type !== "submenu") continue;
33
+ const { ref } = topItem.action;
34
+ const sub = km.submenus[ref];
35
+ if (!sub) continue;
36
+ const prefix = topItem.key;
37
+ const col1Text = ` ${prefix} \u203A ${sub.title.trim()}`.padEnd(COL1);
38
+ let cur = col1Text;
39
+ for (const si of sub.items) {
40
+ const lbl = shortLabel(si.label, 13);
41
+ const tok = `${prefix} ${si.key} ${lbl}`;
42
+ const sep = cur.length === COL1 ? "" : " ";
43
+ if (cur.length !== COL1 && cur.length + 2 + tok.length > MAX_W) {
44
+ lines.push(cur);
45
+ cur = " ".repeat(COL1) + tok;
46
+ } else {
47
+ cur += sep + tok;
48
+ }
49
+ }
50
+ if (cur.length > COL1) lines.push(cur);
27
51
  }
28
- const totalSeconds = Math.floor(totalMs / 1e3);
29
- if (totalSeconds < 0) return "0s";
30
- const hours = Math.floor(totalSeconds / 3600);
31
- const minutes = Math.floor(totalSeconds % 3600 / 60);
32
- const seconds = totalSeconds % 60;
33
- if (hours > 0) return `${hours}h${minutes}m`;
34
- if (minutes > 0) return `${minutes}m${seconds}s`;
35
- return `${seconds}s`;
52
+ return lines.join("\n");
36
53
  }
37
- function statusColor(status) {
38
- switch (status) {
39
- case "active":
40
- case "running":
41
- return "green";
42
- case "completed":
43
- return "cyan";
44
- case "paused":
45
- return "yellow";
46
- case "killed":
47
- case "crashed":
48
- return "red";
49
- case "lost":
50
- return "gray";
51
- default:
52
- return "white";
54
+ var MENU_FOR_MODE = {
55
+ "leader": "topLevel",
56
+ "copy-menu": "copy",
57
+ "open-menu": "open",
58
+ "agent-menu": "agent",
59
+ "session-menu": "session",
60
+ "go-menu": "go"
61
+ };
62
+ var KEYMAP = {
63
+ version: 1,
64
+ topLevel: {
65
+ title: " Sisyphus ",
66
+ items: [
67
+ { key: "s", label: " Cycle session", action: { type: "script", name: "sisyphus-cycle" } },
68
+ { key: "h", label: " Home / dashboard", action: { type: "script", name: "sisyphus-home" } },
69
+ { key: "n", label: " New session", action: { type: "popup", name: "sisyphus-new", popup: { w: "80%", h: "60%", cwd: "current" } } },
70
+ { key: "m", label: " Message orchestrator", action: { type: "popup", name: "sisyphus-msg", popup: { w: "80%", h: "60%", cwd: "current" } } },
71
+ { key: "t", label: " Status (where am I?)", action: { type: "popup", name: "sisyphus-status-popup", popup: { w: "90%", h: "90%", cwd: "current" } } },
72
+ { key: "l", label: " Session picker", action: { type: "popup", name: "sisyphus-pick-session", popup: { w: "60%", h: "60%", cwd: "current" } } },
73
+ { key: "z", label: " Zoom pane", action: { type: "tmux", cmd: "resize-pane -Z" } },
74
+ { key: "x", label: " Kill pane (smart)", action: { type: "script", name: "sisyphus-kill-pane" } },
75
+ { key: "?", label: " Full help reference", action: { type: "popup", name: "sisyphus-help", popup: { w: "80", h: "32", title: " Keybindings " } } },
76
+ { key: "/", label: " Search / filter", action: { type: "script", name: "sisyphus-search-reports" }, tuiAction: "search" },
77
+ { key: " ", label: " Open popup explicitly", action: { type: "tui", action: "show-leader" } },
78
+ { key: "c", label: " Copy \u203A", action: { type: "submenu", ref: "copy" } },
79
+ { key: "o", label: " Open \u203A", action: { type: "submenu", ref: "open" } },
80
+ { key: "a", label: " Agent \u203A", action: { type: "submenu", ref: "agent" } },
81
+ { key: "S", label: " Session \u203A", action: { type: "submenu", ref: "session" } },
82
+ { key: "g", label: " Go \u203A", action: { type: "submenu", ref: "go" } }
83
+ ]
84
+ },
85
+ submenus: {
86
+ copy: {
87
+ title: " Copy ",
88
+ items: [
89
+ { key: "p", label: " session dir path", action: { type: "script", name: "sisyphus-copy-path" } },
90
+ { key: "i", label: " session UUID", action: { type: "script", name: "sisyphus-copy-id" } },
91
+ { key: "c", label: " full session context XML", action: { type: "script", name: "sisyphus-copy-context" } },
92
+ { key: "l", label: " logs (last 200 lines)", action: { type: "script", name: "sisyphus-copy-logs" } },
93
+ { key: "r", label: " latest report content", action: { type: "script", name: "sisyphus-copy-latest-report" } },
94
+ { key: "a", label: " agent ID (picker)", action: { type: "script", name: "sisyphus-copy-agent-id" } }
95
+ ]
96
+ },
97
+ open: {
98
+ title: " Open ",
99
+ items: [
100
+ { key: "g", label: " goal.md", action: { type: "popup", name: "sisyphus-open-goal", popup: { w: "95%", h: "95%", cwd: "current" } } },
101
+ { key: "r", label: " roadmap.md", action: { type: "popup", name: "sisyphus-open-roadmap", popup: { w: "95%", h: "95%", cwd: "current" } } },
102
+ { key: "s", label: " strategy.md", action: { type: "popup", name: "sisyphus-open-strategy", popup: { w: "95%", h: "95%", cwd: "current" } } },
103
+ { key: "l", label: " logs popup (tail)", action: { type: "popup", name: "sisyphus-open-logs", popup: { w: "90%", h: "90%", cwd: "current" } } },
104
+ { key: "d", label: " session dir in file mgr", action: { type: "script", name: "sisyphus-open-dir" } },
105
+ { key: "R", label: " latest report file", action: { type: "popup", name: "sisyphus-open-latest-report", popup: { w: "95%", h: "95%", cwd: "current" } } },
106
+ { key: "c", label: " scratch", action: { type: "popup", name: "sisyphus-open-scratch", popup: { w: "95%", h: "95%", cwd: "current" } } },
107
+ { key: "e", label: " edit context file", action: { type: "popup", name: "sisyphus-edit-context-file", popup: { w: "95%", h: "95%", cwd: "current" } }, tuiAction: "edit-context-file" }
108
+ ]
109
+ },
110
+ agent: {
111
+ title: " Agent ",
112
+ items: [
113
+ { key: "s", label: " spawn agent", action: { type: "popup", name: "sisyphus-spawn-agent", popup: { w: "80%", h: "70%", cwd: "current" } } },
114
+ { key: "m", label: " message agent (picker)", action: { type: "popup", name: "sisyphus-msg-agent", popup: { w: "80%", h: "60%", cwd: "current" } } },
115
+ { key: "r", label: " restart agent (picker)", action: { type: "popup", name: "sisyphus-restart-agent-popup", popup: { w: "70%", h: "50%", cwd: "current" } } },
116
+ { key: "R", label: " re-run agent (picker)", action: { type: "popup", name: "sisyphus-rerun-agent", popup: { w: "70%", h: "50%", cwd: "current" } } },
117
+ { key: "j", label: " jump to agent's pane", action: { type: "popup", name: "sisyphus-jump-to-pane", popup: { w: "60%", h: "60%" } } },
118
+ { key: "o", label: " open claude --resume", action: { type: "popup", name: "sisyphus-open-claude-agent", popup: { w: "60%", h: "60%", cwd: "current" } } },
119
+ { key: "t", label: " tail agent logs (picker)", action: { type: "popup", name: "sisyphus-tail-agent-logs", popup: { w: "90%", h: "90%", cwd: "current" } } },
120
+ { key: "k", label: " kill agent (picker)", action: { type: "popup", name: "sisyphus-kill-agent", popup: { w: "60%", h: "40%", cwd: "current" } } },
121
+ { key: "e", label: " quick-spawn Explore", action: { type: "script", name: "sisyphus-quick-spawn-explore" } },
122
+ { key: "d", label: " quick-spawn Debug", action: { type: "script", name: "sisyphus-quick-spawn-debug" } }
123
+ ]
124
+ },
125
+ session: {
126
+ title: " Session ",
127
+ items: [
128
+ { key: "n", label: " new session", action: { type: "popup", name: "sisyphus-new", popup: { w: "80%", h: "60%", cwd: "current" } } },
129
+ { key: "r", label: " resume", action: { type: "popup", name: "sisyphus-resume-session", popup: { w: "80%", h: "60%", cwd: "current" } } },
130
+ { key: "c", label: " continue", action: { type: "popup", name: "sisyphus-continue-session", popup: { w: "50", h: "5", borderStyle: "fg=yellow", title: " Continue Session ", cwd: "current" } } },
131
+ { key: "b", label: " rollback (prompts cycle)", action: { type: "popup", name: "sisyphus-rollback-session", popup: { w: "50", h: "5", title: " Rollback ", cwd: "current" } } },
132
+ { key: "k", label: " kill", action: { type: "popup", name: "sisyphus-kill-session", popup: { w: "40", h: "5", borderStyle: "fg=red", title: " Kill Session ", cwd: "current" } } },
133
+ { key: "d", label: " delete (confirms)", action: { type: "popup", name: "sisyphus-delete-session", popup: { w: "40", h: "5", borderStyle: "fg=red", title: " Delete Session ", cwd: "current" } } },
134
+ { key: "e", label: " export to ~/Downloads", action: { type: "popup", name: "sisyphus-export-session", popup: { w: "60", h: "8", title: " Export Session ", cwd: "current" } } },
135
+ { key: "w", label: " go to session window", action: { type: "popup", name: "sisyphus-go-to-window", popup: { w: "70%", h: "60%", cwd: "current" } } },
136
+ { key: "C", label: " clone (sisyphus session clone)", action: { type: "popup", name: "sisyphus-clone-session", popup: { w: "60%", h: "60%", cwd: "current" } } },
137
+ { key: "i", label: " history", action: { type: "popup", name: "sisyphus-history", popup: { w: "95%", h: "95%", cwd: "current" } } }
138
+ ]
139
+ },
140
+ go: {
141
+ title: " Go ",
142
+ items: [
143
+ { key: "w", label: " go to session window", action: { type: "popup", name: "sisyphus-go-to-window", popup: { w: "70%", h: "60%", cwd: "current" } } },
144
+ { key: "p", label: " jump to pane (picker)", action: { type: "popup", name: "sisyphus-jump-to-pane", popup: { w: "60%", h: "60%" } } },
145
+ { key: "s", label: " session picker", action: { type: "popup", name: "sisyphus-pick-session", popup: { w: "60%", h: "60%", cwd: "current" } } },
146
+ { key: "n", label: " next session", action: { type: "script", name: "sisyphus-cycle" } },
147
+ { key: "r", label: " reconnect", action: { type: "popup", name: "sisyphus-reconnect", popup: { w: "80%", h: "40%", cwd: "current" } } }
148
+ ]
149
+ }
53
150
  }
151
+ };
152
+
153
+ // src/shared/utils.ts
154
+ function computeActiveTimeMs(session) {
155
+ return session.activeMs;
54
156
  }
55
157
 
56
158
  // src/tui/lib/reports.ts
@@ -509,12 +611,22 @@ var BADGE_ART = {
509
611
  " \u2726 \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u2726 ",
510
612
  " \u2726 \u2726 "
511
613
  ],
614
+ "speed-demon": [
615
+ " ",
616
+ " \u2571\u2571 ",
617
+ " \u2571\u2571 ",
618
+ " \u2571\u2571\u2571\u2571\u2571\u2571 ",
619
+ " \u2571\u2571 ",
620
+ " \u2571\u2571 ",
621
+ " \u26A1 \u22643 \u26A1 ",
622
+ " x10 streak "
623
+ ],
512
624
  "iron-will": [
513
625
  " \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557 ",
514
626
  " \u2551 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2551 ",
515
627
  " \u2551 \u2502\u2554\u2550\u2550\u2550\u2550\u2550\u2557\u2502 \u2551 ",
516
- " \u2551 \u2502\u2551 \u25C6\u25C6\u25C6 \u2551\u2502 \u2551 ",
517
- " \u2551 \u2502\u2551 \u25C6\u25C6\u25C6 \u2551\u2502 \u2551 ",
628
+ " \u2551 \u2502\u2551 8+ \u2551\u2502 \u2551 ",
629
+ " \u2551 \u2502\u2551cycle\u2551\u2502 \u2551 ",
518
630
  " \u2551 \u2502\u255A\u2550\u2550\u2550\u2550\u2550\u255D\u2502 \u2551 ",
519
631
  " \u2551 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2551 ",
520
632
  " \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D "
@@ -1009,7 +1121,7 @@ function rawSend(request, timeoutMs = 1e4) {
1009
1121
  const timeout = setTimeout(() => {
1010
1122
  socket.destroy();
1011
1123
  reject(new Error(`Request timed out after ${(timeoutMs / 1e3).toFixed(0)}s. The daemon may be overloaded.
1012
- Check: sisyphus doctor
1124
+ Check: sisyphus admin doctor
1013
1125
  Logs: tail -20 ~/.sisyphus/daemon.log`));
1014
1126
  }, timeoutMs);
1015
1127
  socket.on("connect", () => {
@@ -1038,9 +1150,10 @@ function rawSend(request, timeoutMs = 1e4) {
1038
1150
 
1039
1151
  export {
1040
1152
  rawSend,
1153
+ formatHelpForKeymap,
1154
+ MENU_FOR_MODE,
1155
+ KEYMAP,
1041
1156
  computeActiveTimeMs,
1042
- formatDuration,
1043
- statusColor,
1044
1157
  resolveReports,
1045
1158
  buildCompanionContext,
1046
1159
  buildSessionContext,
@@ -1049,4 +1162,4 @@ export {
1049
1162
  galleryNext,
1050
1163
  galleryPrev
1051
1164
  };
1052
- //# sourceMappingURL=chunk-C2XKXERJ.js.map
1165
+ //# sourceMappingURL=chunk-M6Z3KHOH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/keymap.ts","../src/shared/utils.ts","../src/tui/lib/reports.ts","../src/tui/lib/context.ts","../src/shared/companion-badges.ts","../src/shared/client.ts"],"sourcesContent":["export type KeyMap = {\n version: 1;\n topLevel: MenuDef;\n submenus: Record<string, MenuDef>;\n};\n\nexport type MenuDef = {\n title: string;\n items: MenuItem[];\n};\n\nexport type MenuItem = {\n key: string;\n label: string;\n action: Action;\n tuiAction?: string;\n hidden?: boolean;\n};\n\nexport type Action =\n | { type: 'submenu'; ref: string }\n | { type: 'script'; name: string }\n | { type: 'popup'; name: string; popup: PopupOpts }\n | { type: 'tmux'; cmd: string }\n | { type: 'tui'; action: string };\n\nexport type PopupOpts = {\n w?: string;\n h?: string;\n borderStyle?: string;\n title?: string;\n cwd?: 'current';\n};\n\nexport function formatHelpForKeymap(km: KeyMap): string {\n const COL1 = 20;\n const MAX_W = 78;\n\n function shortLabel(raw: string, max: number): string {\n return raw.trimStart()\n .replace(/\\s*\\([^)]*\\)\\s*/g, '')\n .replace(/\\s+--\\S*/g, '')\n .trimEnd()\n .slice(0, max)\n .trimEnd();\n }\n\n const lines: string[] = [];\n\n lines.push(' Sisyphus Keybindings (Ctrl-s + key)');\n lines.push('');\n lines.push(' ── Direct ─────────────────────────────────');\n\n for (const item of km.topLevel.items) {\n if (item.action.type === 'submenu' || item.action.type === 'tui' || item.hidden) continue;\n const key = item.key.trim() === '' ? 'spc' : item.key;\n lines.push(` ${key.padEnd(4)} ${shortLabel(item.label, 30)}`);\n }\n\n lines.push('');\n lines.push(' ── Submenus ───────────────────────────────');\n\n for (const topItem of km.topLevel.items) {\n if (topItem.action.type !== 'submenu') continue;\n const { ref } = topItem.action;\n const sub = km.submenus[ref];\n if (!sub) continue;\n\n const prefix = topItem.key;\n const col1Text = ` ${prefix} › ${sub.title.trim()}`.padEnd(COL1);\n let cur = col1Text;\n\n for (const si of sub.items) {\n const lbl = shortLabel(si.label, 13);\n const tok = `${prefix} ${si.key} ${lbl}`;\n const sep = cur.length === COL1 ? '' : ' ';\n if (cur.length !== COL1 && cur.length + 2 + tok.length > MAX_W) {\n lines.push(cur);\n cur = ' '.repeat(COL1) + tok;\n } else {\n cur += sep + tok;\n }\n }\n if (cur.length > COL1) lines.push(cur);\n }\n\n return lines.join('\\n');\n}\n\n// Maps TUI overlay mode → KEYMAP menu key. Shared between input dispatcher and renderer.\nexport const MENU_FOR_MODE: Record<string, string | undefined> = {\n 'leader': 'topLevel',\n 'copy-menu': 'copy',\n 'open-menu': 'open',\n 'agent-menu': 'agent',\n 'session-menu': 'session',\n 'go-menu': 'go',\n};\n\nexport const KEYMAP: KeyMap = {\n version: 1,\n topLevel: {\n title: ' Sisyphus ',\n items: [\n { key: 's', label: ' Cycle session', action: { type: 'script', name: 'sisyphus-cycle' } },\n { key: 'h', label: ' Home / dashboard', action: { type: 'script', name: 'sisyphus-home' } },\n { key: 'n', label: ' New session', action: { type: 'popup', name: 'sisyphus-new', popup: { w: '80%', h: '60%', cwd: 'current' } } },\n { key: 'm', label: ' Message orchestrator', action: { type: 'popup', name: 'sisyphus-msg', popup: { w: '80%', h: '60%', cwd: 'current' } } },\n { key: 't', label: ' Status (where am I?)', action: { type: 'popup', name: 'sisyphus-status-popup', popup: { w: '90%', h: '90%', cwd: 'current' } } },\n { key: 'l', label: ' Session picker', action: { type: 'popup', name: 'sisyphus-pick-session', popup: { w: '60%', h: '60%', cwd: 'current' } } },\n { key: 'z', label: ' Zoom pane', action: { type: 'tmux', cmd: 'resize-pane -Z' } },\n { key: 'x', label: ' Kill pane (smart)', action: { type: 'script', name: 'sisyphus-kill-pane' } },\n { key: '?', label: ' Full help reference', action: { type: 'popup', name: 'sisyphus-help', popup: { w: '80', h: '32', title: ' Keybindings ' } } },\n { key: '/', label: ' Search / filter', action: { type: 'script', name: 'sisyphus-search-reports' }, tuiAction: 'search' },\n { key: ' ', label: ' Open popup explicitly', action: { type: 'tui', action: 'show-leader' } },\n { key: 'c', label: ' Copy ›', action: { type: 'submenu', ref: 'copy' } },\n { key: 'o', label: ' Open ›', action: { type: 'submenu', ref: 'open' } },\n { key: 'a', label: ' Agent ›', action: { type: 'submenu', ref: 'agent' } },\n { key: 'S', label: ' Session ›', action: { type: 'submenu', ref: 'session' } },\n { key: 'g', label: ' Go ›', action: { type: 'submenu', ref: 'go' } },\n ],\n },\n submenus: {\n copy: {\n title: ' Copy ',\n items: [\n { key: 'p', label: ' session dir path', action: { type: 'script', name: 'sisyphus-copy-path' } },\n { key: 'i', label: ' session UUID', action: { type: 'script', name: 'sisyphus-copy-id' } },\n { key: 'c', label: ' full session context XML', action: { type: 'script', name: 'sisyphus-copy-context' } },\n { key: 'l', label: ' logs (last 200 lines)', action: { type: 'script', name: 'sisyphus-copy-logs' } },\n { key: 'r', label: ' latest report content', action: { type: 'script', name: 'sisyphus-copy-latest-report' } },\n { key: 'a', label: ' agent ID (picker)', action: { type: 'script', name: 'sisyphus-copy-agent-id' } },\n ],\n },\n open: {\n title: ' Open ',\n items: [\n { key: 'g', label: ' goal.md', action: { type: 'popup', name: 'sisyphus-open-goal', popup: { w: '95%', h: '95%', cwd: 'current' } } },\n { key: 'r', label: ' roadmap.md', action: { type: 'popup', name: 'sisyphus-open-roadmap', popup: { w: '95%', h: '95%', cwd: 'current' } } },\n { key: 's', label: ' strategy.md', action: { type: 'popup', name: 'sisyphus-open-strategy', popup: { w: '95%', h: '95%', cwd: 'current' } } },\n { key: 'l', label: ' logs popup (tail)', action: { type: 'popup', name: 'sisyphus-open-logs', popup: { w: '90%', h: '90%', cwd: 'current' } } },\n { key: 'd', label: ' session dir in file mgr', action: { type: 'script', name: 'sisyphus-open-dir' } },\n { key: 'R', label: ' latest report file', action: { type: 'popup', name: 'sisyphus-open-latest-report', popup: { w: '95%', h: '95%', cwd: 'current' } } },\n { key: 'c', label: ' scratch', action: { type: 'popup', name: 'sisyphus-open-scratch', popup: { w: '95%', h: '95%', cwd: 'current' } } },\n { key: 'e', label: ' edit context file', action: { type: 'popup', name: 'sisyphus-edit-context-file', popup: { w: '95%', h: '95%', cwd: 'current' } }, tuiAction: 'edit-context-file' },\n ],\n },\n agent: {\n title: ' Agent ',\n items: [\n { key: 's', label: ' spawn agent', action: { type: 'popup', name: 'sisyphus-spawn-agent', popup: { w: '80%', h: '70%', cwd: 'current' } } },\n { key: 'm', label: ' message agent (picker)', action: { type: 'popup', name: 'sisyphus-msg-agent', popup: { w: '80%', h: '60%', cwd: 'current' } } },\n { key: 'r', label: ' restart agent (picker)', action: { type: 'popup', name: 'sisyphus-restart-agent-popup', popup: { w: '70%', h: '50%', cwd: 'current' } } },\n { key: 'R', label: ' re-run agent (picker)', action: { type: 'popup', name: 'sisyphus-rerun-agent', popup: { w: '70%', h: '50%', cwd: 'current' } } },\n { key: 'j', label: \" jump to agent's pane\", action: { type: 'popup', name: 'sisyphus-jump-to-pane', popup: { w: '60%', h: '60%' } } },\n { key: 'o', label: ' open claude --resume', action: { type: 'popup', name: 'sisyphus-open-claude-agent', popup: { w: '60%', h: '60%', cwd: 'current' } } },\n { key: 't', label: ' tail agent logs (picker)', action: { type: 'popup', name: 'sisyphus-tail-agent-logs', popup: { w: '90%', h: '90%', cwd: 'current' } } },\n { key: 'k', label: ' kill agent (picker)', action: { type: 'popup', name: 'sisyphus-kill-agent', popup: { w: '60%', h: '40%', cwd: 'current' } } },\n { key: 'e', label: ' quick-spawn Explore', action: { type: 'script', name: 'sisyphus-quick-spawn-explore' } },\n { key: 'd', label: ' quick-spawn Debug', action: { type: 'script', name: 'sisyphus-quick-spawn-debug' } },\n ],\n },\n session: {\n title: ' Session ',\n items: [\n { key: 'n', label: ' new session', action: { type: 'popup', name: 'sisyphus-new', popup: { w: '80%', h: '60%', cwd: 'current' } } },\n { key: 'r', label: ' resume', action: { type: 'popup', name: 'sisyphus-resume-session', popup: { w: '80%', h: '60%', cwd: 'current' } } },\n { key: 'c', label: ' continue', action: { type: 'popup', name: 'sisyphus-continue-session', popup: { w: '50', h: '5', borderStyle: 'fg=yellow', title: ' Continue Session ', cwd: 'current' } } },\n { key: 'b', label: ' rollback (prompts cycle)', action: { type: 'popup', name: 'sisyphus-rollback-session', popup: { w: '50', h: '5', title: ' Rollback ', cwd: 'current' } } },\n { key: 'k', label: ' kill', action: { type: 'popup', name: 'sisyphus-kill-session', popup: { w: '40', h: '5', borderStyle: 'fg=red', title: ' Kill Session ', cwd: 'current' } } },\n { key: 'd', label: ' delete (confirms)', action: { type: 'popup', name: 'sisyphus-delete-session', popup: { w: '40', h: '5', borderStyle: 'fg=red', title: ' Delete Session ', cwd: 'current' } } },\n { key: 'e', label: ' export to ~/Downloads', action: { type: 'popup', name: 'sisyphus-export-session', popup: { w: '60', h: '8', title: ' Export Session ', cwd: 'current' } } },\n { key: 'w', label: ' go to session window', action: { type: 'popup', name: 'sisyphus-go-to-window', popup: { w: '70%', h: '60%', cwd: 'current' } } },\n { key: 'C', label: ' clone (sisyphus session clone)', action: { type: 'popup', name: 'sisyphus-clone-session', popup: { w: '60%', h: '60%', cwd: 'current' } } },\n { key: 'i', label: ' history', action: { type: 'popup', name: 'sisyphus-history', popup: { w: '95%', h: '95%', cwd: 'current' } } },\n ],\n },\n go: {\n title: ' Go ',\n items: [\n { key: 'w', label: ' go to session window', action: { type: 'popup', name: 'sisyphus-go-to-window', popup: { w: '70%', h: '60%', cwd: 'current' } } },\n { key: 'p', label: ' jump to pane (picker)', action: { type: 'popup', name: 'sisyphus-jump-to-pane', popup: { w: '60%', h: '60%' } } },\n { key: 's', label: ' session picker', action: { type: 'popup', name: 'sisyphus-pick-session', popup: { w: '60%', h: '60%', cwd: 'current' } } },\n { key: 'n', label: ' next session', action: { type: 'script', name: 'sisyphus-cycle' } },\n { key: 'r', label: ' reconnect', action: { type: 'popup', name: 'sisyphus-reconnect', popup: { w: '80%', h: '40%', cwd: 'current' } } },\n ],\n },\n },\n};\n","import type { Session } from './types.js';\n\n/**\n * Return the tracked active time for a session.\n * Active time is accumulated by the daemon's pane monitor, excluding sleep/idle gaps.\n */\nexport function computeActiveTimeMs(session: Session): number {\n return session.activeMs;\n}\n","import { readFileSync } from 'node:fs';\nimport type { AgentReport } from '../../shared/types.js';\n\nexport interface ReportBlock {\n type: 'update' | 'final';\n timestamp: string;\n content: string;\n summary: string;\n}\n\nfunction loadReportContent(report: AgentReport): string {\n try {\n return readFileSync(report.filePath, 'utf-8');\n } catch {\n return report.summary;\n }\n}\n\nexport function resolveReports(reports: AgentReport[]): ReportBlock[] {\n return [...reports].reverse().map((r) => ({\n type: r.type as 'update' | 'final',\n timestamp: r.timestamp,\n content: loadReportContent(r),\n summary: r.summary,\n }));\n}\n","import { readFileSync, readdirSync } from 'node:fs';\nimport { goalPath, roadmapPath, sessionsDir, statePath } from '../../shared/paths.js';\nimport { resolveReports } from './reports.js';\nimport type { Session, AgentStatus } from '../../shared/types.js';\n\nfunction readFileSafe(filePath: string): string | null {\n try {\n return readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nexport function buildCompanionContext(cwd: string): string {\n let sessionDirs: string[];\n try {\n sessionDirs = readdirSync(sessionsDir(cwd));\n } catch {\n return '<sessions>No sessions found.</sessions>';\n }\n\n const now = Date.now();\n const sevenDaysMs = 7 * 24 * 60 * 60 * 1000;\n const sessionBlocks: string[] = [];\n\n for (const sessionId of sessionDirs) {\n const stateRaw = readFileSafe(statePath(cwd, sessionId));\n if (!stateRaw) continue;\n\n let session: Session;\n try {\n session = JSON.parse(stateRaw) as Session;\n } catch {\n continue;\n }\n\n // Skip completed sessions older than 7 days\n if (session.status === 'completed' && session.completedAt) {\n if (now - new Date(session.completedAt).getTime() > sevenDaysMs) continue;\n }\n\n const lines: string[] = [];\n const nameAttr = session.name ? ` name=\"${escapeXml(session.name)}\"` : '';\n lines.push(` <session id=\"${escapeXml(session.id)}\"${nameAttr} status=\"${escapeXml(session.status)}\">`);\n lines.push(` <task>${escapeXml(session.task)}</task>`);\n lines.push(` <created>${escapeXml(session.createdAt)}</created>`);\n lines.push(` <cycles>${session.orchestratorCycles.length}</cycles>`);\n\n if (session.status === 'completed') {\n if (session.completionReport) {\n const snippet = session.completionReport.slice(0, 300).replace(/\\n+/g, ' ').trim();\n lines.push(` <completion-report>${escapeXml(snippet)}${session.completionReport.length > 300 ? '…' : ''}</completion-report>`);\n }\n } else {\n // Agent summary by status\n if (session.agents.length > 0) {\n const counts = new Map<AgentStatus, number>();\n for (const agent of session.agents) {\n counts.set(agent.status, (counts.get(agent.status) ?? 0) + 1);\n }\n const summary = [...counts.entries()].map(([status, n]) => `${n} ${status}`).join(', ');\n lines.push(` <agents>${escapeXml(summary)}</agents>`);\n }\n\n // Goal: first meaningful line\n const goalContent = readFileSafe(goalPath(cwd, session.id));\n if (goalContent) {\n const firstLine = goalContent.split('\\n').map(l => l.trim()).find(l => l.length > 0 && !l.startsWith('#'));\n if (firstLine) lines.push(` <goal>${escapeXml(firstLine)}</goal>`);\n }\n\n // Roadmap unchecked todos (up to 5)\n const roadmapContent = readFileSafe(roadmapPath(cwd, session.id));\n if (roadmapContent) {\n const todos = roadmapContent\n .split('\\n')\n .filter(l => l.includes('- [ ]'))\n .slice(0, 5)\n .map(l => l.trim());\n if (todos.length > 0) {\n lines.push(' <todos>');\n for (const todo of todos) lines.push(` ${escapeXml(todo)}`);\n lines.push(' </todos>');\n }\n }\n }\n\n lines.push(' </session>');\n sessionBlocks.push(lines.join('\\n'));\n }\n\n if (sessionBlocks.length === 0) {\n return '<sessions>No sessions found.</sessions>';\n }\n\n return ['<sessions>', ...sessionBlocks, '</sessions>'].join('\\n');\n}\n\nexport function buildSessionContext(session: Session, cwd: string): string {\n const goal = readFileSafe(goalPath(cwd, session.id));\n const roadmap = readFileSafe(roadmapPath(cwd, session.id));\n\n const agentsXml = session.agents.map((agent) => {\n const reportBlocks = resolveReports(agent.reports);\n // resolveReports returns newest-first; reverse to chronological for context\n const reportsXml = [...reportBlocks].reverse().map((block) => {\n return ` <report type=\"${block.type}\" time=\"${escapeXml(block.timestamp)}\">${escapeXml(block.content)}</report>`;\n }).join('\\n');\n\n return [\n ` <agent id=\"${escapeXml(agent.id)}\" name=\"${escapeXml(agent.name)}\" type=\"${escapeXml(agent.agentType)}\" status=\"${escapeXml(agent.status)}\">`,\n ` <instruction>${escapeXml(agent.instruction)}</instruction>`,\n ...(reportsXml ? [reportsXml] : []),\n ` </agent>`,\n ].join('\\n');\n }).join('\\n');\n\n const cyclesXml = session.orchestratorCycles.map((cycle) => {\n const agents = cycle.agentsSpawned.join(', ');\n const mode = cycle.mode ? ` mode=\"${escapeXml(cycle.mode)}\"` : '';\n return ` <cycle number=\"${cycle.cycle}\"${mode} agents=\"${escapeXml(agents)}\" />`;\n }).join('\\n');\n\n const lines: string[] = [\n '<context>',\n `<session id=\"${escapeXml(session.id)}\" status=\"${escapeXml(session.status)}\">`,\n ` <task>${escapeXml(session.task)}</task>`,\n ` <cwd>${escapeXml(session.cwd)}</cwd>`,\n ];\n\n if (goal) lines.push(` <goal>${escapeXml(goal)}</goal>`);\n if (roadmap) lines.push(` <roadmap>${escapeXml(roadmap)}</roadmap>`);\n\n if (session.agents.length > 0) {\n lines.push(' <agents>');\n lines.push(agentsXml);\n lines.push(' </agents>');\n }\n\n if (session.orchestratorCycles.length > 0) {\n lines.push(' <cycles>');\n lines.push(cyclesXml);\n lines.push(' </cycles>');\n }\n\n if (session.completionReport) {\n lines.push(` <completion-report>${escapeXml(session.completionReport)}</completion-report>`);\n }\n\n lines.push('</session>');\n lines.push('</context>');\n\n return lines.join('\\n');\n}\n","import type { AchievementId, AchievementDef, UnlockedAchievement } from './companion-types.js';\nimport { ACHIEVEMENTS } from './companion-types.js';\n\n// ---------------------------------------------------------------------------\n// Badge art — large-format ASCII art for achievement cards\n// Each art block is an array of strings, rendered centered in the card.\n// ---------------------------------------------------------------------------\n\nconst BADGE_ART: Record<AchievementId, string[]> = {\n // ── Milestone ─────────────────────────────────────────────────────────────\n 'first-blood': [\n ' ╱╲ ',\n ' ╱ ╲ ',\n ' ╱ ◆◆ ╲ ',\n ' ╱ ◆◆ ╲ ',\n ' ╱ ◆◆ ╲ ',\n ' ╱ ◆◆ ╲ ',\n ' ╱─────◆◆─────╲ ',\n ' ╲ ◆◆ ╱ ',\n ' ╲ ◆◆ ╱ ',\n ' ╲───◆◆───╱ ',\n ' ││ ',\n ' ══╪╪══ ',\n ],\n 'centurion': [\n ' ┌──═════──┐ ',\n ' │ ╔═══╗ │ ',\n ' ╱│ ║100║ │╲ ',\n ' ╱ │ ╚═══╝ │ ╲ ',\n ' ╱ └─────────┘ ╲ ',\n ' ╲ ┌───────┐ ╱ ',\n ' ╲ │ ★ ★ ★ │ ╱ ',\n ' ╲ └───────┘ ╱ ',\n ' ╲─────────╱ ',\n ],\n 'thousand-boulder': [\n ' ╭━━━╮ ',\n ' ╭━┫1K ┣━╮ ',\n ' ╭━┫ ╰━━━╯ ┣━╮ ',\n ' ┃ ◉◉◉◉◉◉ ┃ ',\n ' ┃ ◉◉◉◉◉◉◉◉ ┃ ',\n ' ┃ ◉◉◉◉◉◉ ┃ ',\n ' ╰━┫ ┣━╯ ',\n ' ╰━┫ ┣━╯ ',\n ' ╰━━━╯ ',\n ],\n 'cartographer': [\n ' N ',\n ' △ ',\n ' ╭────┼────╮ ',\n ' │ · │ · │ ',\n ' W┼····+····┼E ',\n ' │ · │ · │ ',\n ' ╰────┼────╯ ',\n ' ▽ ',\n ' S ',\n ],\n 'world-traveler': [\n ' ╭──────╮ ',\n ' ╭──┤ ├──╮ ',\n ' ╱ ·│ ◠◡◠ │· ╲ ',\n ' │ · │◠ ◡│ · │ ',\n ' │ · │ ◡◠◡ │ · │ ',\n ' ╲ ·│ │· ╱ ',\n ' ╰──┤ ├──╯ ',\n ' ╰──────╯ ',\n ],\n 'hive-mind': [\n ' ╱╲ ╱╲ ╱╲ ',\n ' ╱◆◆╲╱◆◆╲╱◆◆╲ ',\n ' ╲◆◆╱╲◆◆╱╲◆◆╱ ',\n ' ╱╲╱╱◆╲╱╱◆╲╲╱╲ ',\n ' ╱◆◆╲╲◆◆╲╲◆◆╱◆◆╲ ',\n ' ╲◆◆╱╱◆◆╱╱◆◆╲◆◆╱ ',\n ' ╲╱╲╲◆╱╲╲◆╱╱╲╱ ',\n ' ╲◆◆╱╲◆◆╱╲◆◆╱ ',\n ' ╲╱ ╲╱ ╲╱ ',\n ],\n 'old-growth': [\n ' ╱╲ ',\n ' ╱╱╲╲ ',\n ' ╱╱ ╲╲ ',\n ' ╱╱╱╲╱╲╲╲ ',\n ' ╱╱╱ ╲╲╲ ',\n ' ╱╱╱╱╲╱╲╱╲╲╲╲ ',\n ' ║║║ ',\n ' ║║║ ',\n ' ═══╩╩╩═══ ',\n ],\n 'ancient': [\n ' ┌─┬─────┬─┐ ',\n ' │ │ ◉ ◉ │ │ ',\n ' │ │ ▽ │ │ ',\n ' ╔═╧═╧═════╧═╧═╗ ',\n ' ║ A N C I E N ║ ',\n ' ║ T ║ ',\n ' ╚═════════════╝ ',\n ' ╱╱╱╱╱╱╱╱╱╱╱╱╱ ',\n ' ▔▔▔▔▔▔▔▔▔▔▔▔▔ ',\n ],\n 'regular': [\n ' ╭─────╮ ',\n ' ╭─┤ 10 ├─╮ ',\n ' ╱ ╰─────╯ ╲ ',\n ' │ ╭─────╮ │ ',\n ' │ │ ◉ │ │ ',\n ' │ ╰─────╯ │ ',\n ' ╲ ╱ ',\n ' ╰───────────╯ ',\n ],\n 'veteran': [\n ' ╔═══════════╗ ',\n ' ║ ╔═════╗ ║ ',\n ' ║ ║ V ║ ║ ',\n ' ║ ║ 500 ║ ║ ',\n ' ║ ╚═════╝ ║ ',\n ' ║ ★ ★ ★ ★ ★ ║ ',\n ' ╚═══════════╝ ',\n ' ╱╱╱╱╱╱╱╱╱╱╱ ',\n ' ▔▔▔▔▔▔▔▔▔▔▔ ',\n ],\n 'swarm-starter': [\n ' ',\n ' ◆ ◆ ◆ ◆ ◆ ',\n ' ◆ ◆ ◆ ◆ ◆ ',\n ' ◆ ◆ ◆ ◆ ◆ ',\n ' ◆ ◆ ◆ ◆ ◆ ',\n ' ◆ ◆ ◆ ◆ ◆ ',\n ' ',\n ' · 50 out · ',\n ],\n 'legion': [\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ◆◆◆ 2K ◆◆◆◆◆ ',\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ],\n 'army-of-thousands': [\n ' ················· ',\n ' ·◆·◆·◆·◆·◆·◆·◆·◆ ',\n ' ················· ',\n ' ·◆·◆·5K·◆·◆·◆·◆· ',\n ' ················· ',\n ' ·◆·◆·◆·◆·◆·◆·◆·◆ ',\n ' ················· ',\n ' ·◆·◆·◆·◆·◆·◆·◆·◆ ',\n ' ················· ',\n ],\n 'singularity': [\n ' ╲ │ ╱ ─ · ',\n ' ╲ │ ╱ ',\n ' ╲│╱ ',\n ' ────◆──── ',\n ' ╱│╲ ',\n ' ╱ │ ╲ ',\n ' ╱ │ ╲ ─ · ',\n ' 10000 agents ',\n ],\n 'first-shift': [\n ' ┌─────┐ ',\n ' │ ╲ │ ',\n ' ╱│ ╲ │╲ ',\n ' ╱ │ ╲ │ ╲ ',\n ' ╲ │ ╲│ ╱ ',\n ' ╲│ │╱ ',\n ' │ ╱ │ ',\n ' └─────┘ ',\n ' 10 hrs ',\n ],\n 'workaholic': [\n ' ╭─────────╮ ',\n ' ╱ 12 ╲ ',\n ' │ · │ │ ',\n ' │9 · │ 3 │ ',\n ' │ ╲ │ ',\n ' ╲ 6 · ╱ ',\n ' ╰─────────╯ ',\n ' 100 hrs ',\n ],\n 'time-lord': [\n ' ╔═══════════╗ ',\n ' ╱ ╲ ',\n ' │ · 11 12 1 · │ ',\n ' │ 10 ╲ 2 │ ',\n ' │ 9 · 3 │ ',\n ' │ 8 4 │ ',\n ' ╲ 7 5 ╱ ',\n ' ╚═══════════╝ ',\n ' 500 hrs ',\n ],\n 'eternal-grind': [\n ' ╭───╮ ╭───╮ ',\n ' ╱ ╲ ╱ ╲ ',\n ' │ ∞ ╳ ∞ │ ',\n ' ╲ ╱ ╲ ╱ ',\n ' ╰───╯ ╰───╯ ',\n ' ┌─────┐ ',\n ' │ ╲ ╱ │ ',\n ' │ × │ ',\n ' └─────┘ ',\n ],\n 'epoch': [\n ' · ★ · ',\n ' · ╱│╲ · ',\n ' ╲ ╱ │ ╲ ╱ ',\n ' ╲╱ │ ╲╱ ',\n ' ────◆──┼──◆──── ',\n ' ╱╲ │ ╱╲ ',\n ' ╱ ╲ │ ╱ ╲ ',\n ' · ╲│╱ · ',\n ' 5000 hrs ',\n ],\n 'seasoned': [\n ' ╱╲ ',\n ' ╱ ╲ ',\n ' ╱╱╲╱╲╲ ',\n ' ╱╱ ╲╲ ',\n ' ╱╱╱╱╲╱╲╲╲╲ ',\n ' ║║ ',\n ' ─────╨╨───── ',\n ' ╲╲╲╲╲╲╲╲╲╲╲╲╲ ',\n ' 90 day roots ',\n ],\n 'omnipresent': [\n ' N ',\n ' · △ · ',\n ' NW ╭─┼─╮ NE ',\n ' · ╭─┤·+·├─╮ · ',\n ' W──┤·│ · │·├──E ',\n ' · ╰─┤·+·├─╯ · ',\n ' SW ╰─┼─╯ SE ',\n ' · ▽ · ',\n ' S ',\n ],\n 'apprentice': [\n ' ',\n ' ╱╲ ',\n ' ╱ ╲ ',\n ' ╱ ╲ ',\n ' ╱ ╲ ',\n ' ╱────────╲ ',\n ' ╱ level 5 ╲ ',\n ' ▔▔▔▔▔▔▔▔▔▔▔▔ ',\n ],\n 'journeyman': [\n ' ╱╲ ',\n ' ╱ ╲ ╱╲ ',\n ' ╱ ╲ ╱ ╲ ',\n ' ╱ ╳ ╲ ',\n ' ╱ ╱ ╲ ╲ ',\n ' ╱──────╱───╲────╲',\n ' ╱ level 15 ',\n ' ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ ',\n ],\n 'master': [\n ' ★╲╱★ ',\n ' ╱╲ ',\n ' ╱ ╲ ',\n ' ╱╱╲╱╲╲ ',\n ' ╱╱ ╲╲ ',\n ' ╱╱ ╲╲ ',\n ' ╱─────────╲╲ ',\n ' ╱ level 30 ╲ ',\n ' ▔▔▔▔▔▔▔▔▔▔▔▔▔▔ ',\n ],\n 'grandmaster': [\n ' ★ ★ ★ ',\n ' ╲│╱ ',\n ' ╱╲ ',\n ' ╱ ╲ ',\n ' ╱╱╲╱╲╲ ',\n ' ╱╱ ╲╲ ',\n ' ╱╱ ★ ╲╲ ',\n ' ╱─────────╲╲ ',\n ' ╱ level 50 ╲ ',\n ],\n\n // ── Session ───────────────────────────────────────────────────────────────\n 'marathon': [\n ' ╭──────────────╮ ',\n ' │ ╱╲ ╱╲ ╱╲ ╱╲ │ ',\n ' │╱ ╳ ╳ ╳ ╲ │ ',\n ' │ ╱╲ ╱╲ ╱╲ │ ',\n ' │ ╱ ╳ ╳ ╲ │ ',\n ' │ ╱ ╱ ╲╱ ╲ ╲ │ ',\n ' │╱ ╱ ╲ ╲│ ',\n ' ├──────────────┤ ',\n ' │ ~ ^ ~ │ ',\n ' ╰──────────────╯ ',\n ],\n 'blitz': [\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱╱╱╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ],\n 'speed-run': [\n ' ╭──────────╮ ',\n ' ╱ ╲ ',\n ' │ 10 ╱╱ │ ',\n ' │ · ╱╱ │ ',\n ' │ ╱ ╱╱ │ ',\n ' │ ╱ ╱╱ │ ',\n ' ╲ ╱╱ ╱ ',\n ' ╰──────────╯ ',\n ],\n 'flawless': [\n ' ✦ ✦ ',\n ' ✦ ╱╲ ✦ ',\n ' ╔══╧═══╗ ',\n ' ✦ ║ ║ ✦ ',\n ' ║ ◆ ║ ',\n ' ║ ║ ',\n ' ✦ ╚══════╝ ✦ ',\n ' ✦ ✦ ',\n ],\n 'speed-demon': [\n ' ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱╱╱╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ⚡ ≤3 ⚡ ',\n ' x10 streak ',\n ],\n 'iron-will': [\n ' ╔═══════════╗ ',\n ' ║ ┌───────┐ ║ ',\n ' ║ │╔═════╗│ ║ ',\n ' ║ │║ 8+ ║│ ║ ',\n ' ║ │║cycle║│ ║ ',\n ' ║ │╚═════╝│ ║ ',\n ' ║ └───────┘ ║ ',\n ' ╚═══════════╝ ',\n ],\n 'glass-cannon': [\n ' ╱╲ ',\n ' ╱╱╲╲ ',\n ' ╱╱ ╲╲ ',\n ' ╱╱ ╳╳ ╲╲ ',\n ' ╱╱ ╳╳ ╲╲ ',\n ' ╲╲ ╳╳ ╱╱ ',\n ' ╲╲ ╱╱ ',\n ' ╲╲ ╱╱ ',\n ' ╲╲╱╱ ',\n ' ═══╧╧═══ ',\n ],\n 'solo': [\n ' ',\n ' ╭─────────╮ ',\n ' │ │ ',\n ' │ ◆ │ ',\n ' │ │ ',\n ' ╰─────────╯ ',\n ' ',\n ],\n 'one-more-cycle': [\n ' ╭──→──╮ ',\n ' │ │ ',\n ' ↑ ∞ ↓ ',\n ' │ │ ',\n ' ╰──←──╯ ',\n ' ',\n ' ╭──→──╮ ',\n ' │ │ ',\n ' ↑ ∞ ↓ ',\n ' │ │ ',\n ' ╰──←──╯ ',\n ],\n 'quick-draw': [\n ' ╱│ ',\n ' ╱ │ ',\n ' ──╱──│── ',\n ' ╱ │ ',\n ' ╱ ╭─╯ ',\n ' ╱ │ ',\n ' ╱ ╭─╯ ',\n ' │ ',\n ' ──╨── ',\n ],\n 'squad': [\n ' ',\n ' ◆ ◆ ◆ ◆ ',\n ' ',\n ' ◆ ◆ ◆ ◆ ',\n ' ',\n ' ◆ ◆ ',\n ' ',\n ' · 10 strong · ',\n ],\n 'battalion': [\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ',\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ',\n ' ◆◆◆◆◆◆◆◆◆◆◆◆◆ ',\n ' ',\n ' · 25 strong · ',\n ],\n 'swarm': [\n ' ◆·◆·◆·◆·◆·◆·◆·◆· ',\n ' ·◆·◆·◆·◆·◆·◆·◆·◆ ',\n ' ◆·◆·◆·◆·◆·◆·◆·◆· ',\n ' ·◆·◆·◆·◆·◆·◆·◆·◆ ',\n ' ◆·◆·◆·◆·◆·◆·◆·◆· ',\n ' ·◆·◆·◆·◆·◆·◆·◆·◆ ',\n ' · 50 strong · ',\n ],\n 'deep-dive': [\n ' ≈≈≈≈≈≈≈≈≈≈≈≈≈ ',\n ' ↓ ',\n ' ╱│╲ ',\n ' │ ',\n ' │ ',\n ' ▼ ',\n ' · · · · · · · ',\n ' 15 deep ',\n ],\n 'abyss': [\n ' ≈≈≈≈≈≈≈≈≈≈≈≈≈≈ ',\n ' │ ',\n ' │ ',\n ' │ ',\n ' ▼ ',\n ' │ ',\n ' │ ',\n ' ▼ ',\n ' 25 deep ',\n ],\n 'eternal-recurrence': [\n ' ╭──→──╮ ',\n ' ╱ ∞ ╲ ',\n ' │ ╭───╮ │ ',\n ' │ │ ∞ │ │ ',\n ' │ ╰───╯ │ ',\n ' ╲ ∞ ╱ ',\n ' ╰──←──╯ ',\n ' 40 cycles ',\n ],\n 'endurance': [\n ' ',\n ' ╔══════════════╗ ',\n ' ║▓▓▓▓▓▓▓▓▓▓▓▓▓║ ',\n ' ╚══════════════╝ ',\n ' ',\n ' ╔══════════════╗ ',\n ' ║▓▓▓▓▓▓▓▓▓ ║ ',\n ' ╚══════════════╝ ',\n ' 4 hours ',\n ],\n 'ultramarathon': [\n ' ╔══════════════╗ ',\n ' ║▓▓▓▓▓▓▓▓▓▓▓▓▓║ ',\n ' ╚══════════════╝ ',\n ' ─────────────→ ',\n ' · ',\n ' · ',\n ' · ',\n ' · ',\n ' 6 hours ',\n ],\n 'one-shot': [\n ' ╭───────╮ ',\n ' │ ╭───╮ │ ',\n ' │ │ ◉ │ │ ',\n ' │ ╰───╯ │ ',\n ' ╰───────╯ ',\n ' ↑ ',\n ' ╱│ ',\n ' ╱ │ ',\n ' → ◉ │ ',\n ],\n 'flash': [\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱╱╱╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' ╱╱ ',\n ' < 2 min ',\n ],\n\n // ── Time ──────────────────────────────────────────────────────────────────\n 'night-owl': [\n ' ☽ ',\n ' ╭─────╮ · ',\n ' ╱ ◉ ◉ ╲ · ',\n ' │ ▽ │ · ',\n ' │ ╱───╲ │ ',\n ' ╲╱ ╲╱ ',\n ' ╱╲ ╱╲ · ',\n ' ╱ ╲───╱ ╲ · ',\n ' ▔▔▔▔▔▔▔▔▔▔▔ ',\n ],\n 'dawn-patrol': [\n ' ',\n ' ─ ─ ─ ─ ─ ─ ─ ─ ',\n ' ╲ │ ╱ ',\n ' ╲ │ ╱ ',\n ' ────◑──── ',\n ' ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ',\n ' ░░░░░░░░░░░░░░░░ ',\n ' ',\n ],\n 'early-bird': [\n ' ╱╱ ',\n ' ◠ ╱╱ ',\n ' ╱ ╲ ╱╱ ',\n ' │ ◉ ╲>╱ ',\n ' │ ═╱ ',\n ' ╲ ╱ ',\n ' ╲╱╲ ',\n ' ╲ ╲ ',\n ' ▔▔ ',\n ],\n 'weekend-warrior': [\n ' ╔═══════════╗ ',\n ' ║ S M T W T ║ ',\n ' ║ ║ ',\n ' ║ ◆ ║ ',\n ' ║ ◆ ║ ',\n ' ╚═══════════╝ ',\n ],\n 'all-nighter': [\n ' ╭─────────╮ ',\n ' ╱ 12 ╲ ',\n ' │ · │ │ ',\n ' │9 │ 3 │ ',\n ' │ · │ ',\n ' ╲ 6 ╱ ',\n ' ╰─────────╯ ',\n ' ∞ ∞ ∞ ',\n ],\n 'witching-hour': [\n ' · · ✦ · · ',\n ' · ╱╲ · ',\n ' ╱ ╲ ',\n ' │ 3:00 │ ',\n ' │ AM │ ',\n ' ╲ ╱ ',\n ' · ╲╱ · ',\n ' · · ✦ · · ',\n ],\n\n // ── Behavioral ────────────────────────────────────────────────────────────\n 'sisyphean': [\n ' ╱ ',\n ' ╱ ◉ ',\n ' ╱ ◉◉◉ ',\n ' ╱ ◉◉◉ ',\n ' ╱ ◉ ',\n ' ╱ ; ',\n ' ╱ (>.<) ',\n ' ╱ ╱╱ ╲╲ ',\n ' ╱ ╱ ╲ ',\n ],\n 'stubborn': [\n ' ╱╱╱╱╱╱╱╱╱ ',\n ' ╱╱╱╱╱╱╱╱╱╱ ',\n ' ◉ ',\n ' ◉◉◉ ',\n ' (>.<) ',\n ' ╱╱╱╱╱╱╱╱╱ ',\n ' ╱╱╱╱╱╱╱╱╱╱ ',\n ' ✓ ',\n ],\n 'creature-of-habit': [\n ' ╭───╮ ╭───╮ ',\n ' │ → │→│ → │→ ',\n ' ╰───╯ ╰───╯ ',\n ' ╭───╮ ╭───╮ ',\n ' │ → │→│ → │→ ',\n ' ╰───╯ ╰───╯ ',\n ' ╭───╮ ╭───╮ ',\n ' │ → │→│ → │→ ',\n ' ╰───╯ ╰───╯ ',\n ],\n 'loyal': [\n ' ╱╲ ',\n ' ╱ ╲ ',\n ' ╱ ♥♥ ╲ ',\n ' ╱ ♥♥ ╲ ',\n ' ╲ 50 ╱ ',\n ' ╲ ╱ ',\n ' ╲ ╱ ',\n ' ╲╱ ',\n ],\n 'wanderer': [\n ' · · · ',\n ' ╲ │ ╱ ',\n ' ╲ │ ╱ ',\n ' · + · ',\n ' ╱ │ ╲ ',\n ' ╱ │ ╲ ',\n ' · · · ',\n ],\n 'streak': [\n ' ╔══╗╔══╗╔══╗╔══╗ ',\n ' ║M ║║T ║║W ║║T ║ ',\n ' ║◆ ║║◆ ║║◆ ║║◆ ║ ',\n ' ╚══╝╚══╝╚══╝╚══╝ ',\n ' ╔══╗╔══╗╔══╗ ',\n ' ║F ║║S ║║S ║ ',\n ' ║◆ ║║◆ ║║◆ ║ ',\n ' ╚══╝╚══╝╚══╝ ',\n ],\n 'hot-streak': [\n ' ╱╲ ',\n ' ╱╱╲╲ ',\n ' ╱╱◆◆╲╲ ',\n ' ╱╱ ◆◆ ╲╲ ',\n ' ╲╲ ◆◆ ╱╱ ',\n ' ╲╲◆◆╱╱ ',\n ' ╲╲╱╱ ',\n ' ×7 clean ',\n ],\n 'momentum': [\n ' ◉ ◉ ',\n ' │╲ ╱│ ',\n ' │ ╲ ╱ │ ',\n ' │ ╲ ╱ │ ',\n ' │ ◉◉ │ ',\n ' │ ╱ ╲ │ ',\n ' │ ╱ ╲ │ ',\n ' │╱ ╲│ ',\n ' ◉ ◉ ',\n ],\n 'patient-one': [\n ' ╭───────╮ ',\n ' │ ‾.‾ │ ',\n ' │ │ ',\n ' │ zzz │ ',\n ' │ zz │ ',\n ' │ z │ ',\n ' │ │ ',\n ' ╰───────╯ ',\n ' 30 min+ ',\n ],\n 'message-in-a-bottle': [\n ' ╭─╮ ',\n ' │×│ ',\n ' ╭─┴─┴─╮ ',\n ' │ ░░░ │ ',\n ' │ ░░░ │ ',\n ' │ ░░░ │ ',\n ' ╰─────╯ ',\n ' ≈≈≈≈≈≈≈≈≈ ',\n ' ≈≈≈≈≈≈≈ ',\n ],\n 'comeback-kid': [\n ' ╱╲ ╱╲ ',\n ' ╱ ╲ ╱ ╲ ',\n ' ╱ ╲ ╱ ╲ ',\n ' ╱ ╳ ╲ ',\n ' ╲ ╱╲ ╱ ',\n ' ╲ ╱ ╲ ╱ ',\n ' ╲ ╱ ╲ ╱ ',\n ' ╲╱ ╲╱ ✓ ',\n ],\n 'pair-programming': [\n ' ╭─────╮╭─────╮ ',\n ' │ ◉ ◉ ││ ◉ ◉ │ ',\n ' │ ▽ ││ ▽ │ ',\n ' ╰──┬──╯╰──┬──╯ ',\n ' │ ╱──╲ │ ',\n ' │╱ ╲│ ',\n ' ╱ ══ ╲ ',\n ' ╱ ════ ╲ ',\n ' ▔▔▔▔▔▔▔▔▔▔ ',\n ],\n 'overdrive': [\n ' ╭──────────╮ ',\n ' ╱ ╭──────╮ ╲ ',\n ' │ ╱ ×6 ╲ │ ',\n ' │ │ ◉ │ │ ',\n ' │ ╲ ╱ │ ',\n ' ╲ ╰──────╯ ╱ ',\n ' ╰──────────╯ ',\n ' same day ×6 ',\n ],\n 'iron-streak': [\n ' ╔══╗─╔══╗─╔══╗ ',\n ' ║◆ ║ ║◆ ║ ║◆ ║ ',\n ' ╚══╝─╚══╝─╚══╝ ',\n ' │ │ ',\n ' ╔══╗─╔══╗─╔══╗ ',\n ' ║◆ ║ ║◆ ║ ║◆ ║ ',\n ' ╚══╝─╚══╝─╚══╝ ',\n ' 14 day chain ',\n ],\n 'deep-conversation': [\n ' ╭─────────╮ ',\n ' ╱ ╭──╮ 20 ╲ ',\n ' │ │ │ │ ',\n ' │ ╰──╯ │ ',\n ' │ · · · · · │ ',\n ' ╲ ╱ ',\n ' ╰──────────╯ ',\n ' ╲ ',\n ' ● ',\n ],\n 'one-must-imagine': [\n ' ◉◉◉◉◉ ',\n ' ╱ ◉◉◉◉ ',\n ' ╱ ◉ ╱ ←─╮ ',\n '╱ (>.<) │ ',\n ' ╱╱ ╲╲ │ ',\n ' ╱ ╲ │ ',\n ' ╱ ╲─╯ ',\n ' ▔▔▔▔▔▔▔▔▔▔▔ ',\n ' ×10 restarts ',\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Card rendering\n// ---------------------------------------------------------------------------\n\nconst CARD_WIDTH = 34;\nconst CARD_HEIGHT = 18;\nconst CARD_INNER = CARD_WIDTH - 2;\n\nfunction centerLine(text: string, width: number): string {\n const stripped = stripAnsiForWidth(text);\n if (stripped.length >= width) return text.slice(0, width);\n const pad = Math.floor((width - stripped.length) / 2);\n return ' '.repeat(pad) + text + ' '.repeat(width - stripped.length - pad);\n}\n\nfunction stripAnsiForWidth(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nexport interface BadgeCard {\n lines: string[];\n width: number;\n height: number;\n}\n\nexport function renderBadgeCard(\n def: AchievementDef,\n unlock: UnlockedAchievement | null,\n opts?: { dim?: boolean },\n): BadgeCard {\n const dim = opts?.dim === true || unlock === null;\n const art = BADGE_ART[def.id] ?? [];\n\n const lines: string[] = [];\n\n // Top border\n const category = def.category.toUpperCase();\n const borderLabel = ` ${category} `;\n const topPad = CARD_INNER - borderLabel.length - 2;\n const topLeft = Math.floor(topPad / 2);\n const topRight = topPad - topLeft;\n lines.push(`┌${'─'.repeat(topLeft)}${borderLabel}${'─'.repeat(topRight)}┐`);\n\n // Blank\n lines.push(`│${' '.repeat(CARD_INNER)}│`);\n\n // Art (centered, dimmed if locked)\n const artMaxLines = 9;\n const artSlice = art.slice(0, artMaxLines);\n for (const artLine of artSlice) {\n const centered = centerLine(artLine, CARD_INNER);\n lines.push(`│${dim ? dimText(centered) : centered}│`);\n }\n // Pad remaining art lines\n for (let i = artSlice.length; i < artMaxLines; i++) {\n lines.push(`│${' '.repeat(CARD_INNER)}│`);\n }\n\n // Blank\n lines.push(`│${' '.repeat(CARD_INNER)}│`);\n\n // Name (centered, bold if unlocked)\n const nameText = unlock !== null ? def.name : `? ${def.name} ?`;\n lines.push(`│${centerLine(nameText, CARD_INNER)}│`);\n\n // Description (centered, wrapped if needed)\n const descLines = wrapText(def.description, CARD_INNER - 4);\n for (const dl of descLines.slice(0, 2)) {\n const centered = centerLine(dl, CARD_INNER);\n lines.push(`│${dim ? dimText(centered) : centered}│`);\n }\n // Pad to fixed height\n const usedContent = 1 + 1 + artMaxLines + 1 + 1 + Math.min(descLines.length, 2);\n const remaining = CARD_HEIGHT - 2 - usedContent; // -2 for borders\n for (let i = 0; i < remaining; i++) {\n if (i === remaining - 1 && unlock !== null) {\n // Unlock date on last content line\n const dateStr = unlock.unlockedAt.slice(0, 10);\n lines.push(`│${centerLine(dimText(dateStr), CARD_INNER)}│`);\n } else {\n lines.push(`│${' '.repeat(CARD_INNER)}│`);\n }\n }\n\n // Bottom border\n lines.push(`└${'─'.repeat(CARD_INNER)}┘`);\n\n return { lines, width: CARD_WIDTH, height: lines.length };\n}\n\nfunction dimText(text: string): string {\n return `\\x1b[2m${text}\\x1b[22m`;\n}\n\nfunction wrapText(text: string, maxWidth: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n for (const word of words) {\n if (current.length + word.length + 1 > maxWidth && current.length > 0) {\n lines.push(current);\n current = word;\n } else {\n current = current.length > 0 ? `${current} ${word}` : word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\n// ---------------------------------------------------------------------------\n// Gallery data\n// ---------------------------------------------------------------------------\n\nexport interface BadgeGallery {\n achievements: AchievementDef[];\n unlocked: Map<AchievementId, UnlockedAchievement>;\n currentIndex: number;\n total: number;\n}\n\nexport function createBadgeGallery(\n unlockedAchievements: UnlockedAchievement[],\n startIndex?: number,\n): BadgeGallery {\n const unlocked = new Map<AchievementId, UnlockedAchievement>();\n for (const a of unlockedAchievements) {\n unlocked.set(a.id, a);\n }\n\n // Sort: unlocked first (by unlock date), then locked\n const sorted = [...ACHIEVEMENTS].sort((a, b) => {\n const aUnlocked = unlocked.has(a.id);\n const bUnlocked = unlocked.has(b.id);\n if (aUnlocked && !bUnlocked) return -1;\n if (!aUnlocked && bUnlocked) return 1;\n if (aUnlocked && bUnlocked) {\n const aDate = unlocked.get(a.id)!.unlockedAt;\n const bDate = unlocked.get(b.id)!.unlockedAt;\n return aDate.localeCompare(bDate);\n }\n return 0; // preserve category order for locked\n });\n\n return {\n achievements: sorted,\n unlocked,\n currentIndex: startIndex ?? 0,\n total: sorted.length,\n };\n}\n\nexport function galleryNext(gallery: BadgeGallery): number {\n return (gallery.currentIndex + 1) % gallery.total;\n}\n\nexport function galleryPrev(gallery: BadgeGallery): number {\n return (gallery.currentIndex - 1 + gallery.total) % gallery.total;\n}\n\nexport { CARD_WIDTH, CARD_HEIGHT };\n","import { connect } from 'node:net';\nimport { socketPath } from './paths.js';\nimport type { Request, Response } from './protocol.js';\n\nexport function rawSend(request: Request, timeoutMs = 10_000): Promise<Response> {\n const sock = socketPath();\n\n return new Promise<Response>((resolve, reject) => {\n const socket = connect(sock);\n let data = '';\n\n const timeout = setTimeout(() => {\n socket.destroy();\n reject(new Error(`Request timed out after ${(timeoutMs / 1000).toFixed(0)}s. The daemon may be overloaded.\\n Check: sisyphus admin doctor\\n Logs: tail -20 ~/.sisyphus/daemon.log`));\n }, timeoutMs);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(request) + '\\n');\n });\n\n socket.on('data', (chunk) => {\n data += chunk.toString();\n const newlineIdx = data.indexOf('\\n');\n if (newlineIdx !== -1) {\n clearTimeout(timeout);\n const line = data.slice(0, newlineIdx);\n socket.destroy();\n try {\n resolve(JSON.parse(line) as Response);\n } catch {\n reject(new Error(`Invalid JSON response from daemon: ${line}`));\n }\n }\n });\n\n socket.on('error', (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAkCO,SAAS,oBAAoB,IAAoB;AACtD,QAAM,OAAO;AACb,QAAM,QAAQ;AAEd,WAAS,WAAW,KAAa,KAAqB;AACpD,WAAO,IAAI,UAAU,EAClB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,aAAa,EAAE,EACvB,QAAQ,EACR,MAAM,GAAG,GAAG,EACZ,QAAQ;AAAA,EACb;AAEA,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,wCAAwC;AACnD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,8NAA+C;AAE1D,aAAW,QAAQ,GAAG,SAAS,OAAO;AACpC,QAAI,KAAK,OAAO,SAAS,aAAa,KAAK,OAAO,SAAS,SAAS,KAAK,OAAQ;AACjF,UAAM,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ,KAAK;AAClD,UAAM,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC,EAAE;AAAA,EACjE;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oNAA+C;AAE1D,aAAW,WAAW,GAAG,SAAS,OAAO;AACvC,QAAI,QAAQ,OAAO,SAAS,UAAW;AACvC,UAAM,EAAE,IAAI,IAAI,QAAQ;AACxB,UAAM,MAAM,GAAG,SAAS,GAAG;AAC3B,QAAI,CAAC,IAAK;AAEV,UAAM,SAAS,QAAQ;AACvB,UAAM,WAAW,OAAO,MAAM,WAAM,IAAI,MAAM,KAAK,CAAC,GAAG,OAAO,IAAI;AAClE,QAAI,MAAM;AAEV,eAAW,MAAM,IAAI,OAAO;AAC1B,YAAM,MAAM,WAAW,GAAG,OAAO,EAAE;AACnC,YAAM,MAAM,GAAG,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG;AACtC,YAAM,MAAM,IAAI,WAAW,OAAO,KAAK;AACvC,UAAI,IAAI,WAAW,QAAQ,IAAI,SAAS,IAAI,IAAI,SAAS,OAAO;AAC9D,cAAM,KAAK,GAAG;AACd,cAAM,IAAI,OAAO,IAAI,IAAI;AAAA,MAC3B,OAAO;AACL,eAAO,MAAM;AAAA,MACf;AAAA,IACF;AACA,QAAI,IAAI,SAAS,KAAM,OAAM,KAAK,GAAG;AAAA,EACvC;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,IAAM,gBAAoD;AAAA,EAC/D,UAAgB;AAAA,EAChB,aAAgB;AAAA,EAChB,aAAgB;AAAA,EAChB,cAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,WAAgB;AAClB;AAEO,IAAM,SAAiB;AAAA,EAC5B,SAAS;AAAA,EACT,UAAU;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,MACL,EAAE,KAAK,KAAK,OAAO,mBAAmB,QAAQ,EAAE,MAAM,UAAU,MAAM,iBAAiB,EAAE;AAAA,MACzF,EAAE,KAAK,KAAK,OAAO,sBAAsB,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB,EAAE;AAAA,MAC3F,EAAE,KAAK,KAAK,OAAO,iBAAiB,QAAQ,EAAE,MAAM,SAAS,MAAM,gBAAgB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,MACnI,EAAE,KAAK,KAAK,OAAO,0BAA0B,QAAQ,EAAE,MAAM,SAAS,MAAM,gBAAgB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,MAC5I,EAAE,KAAK,KAAK,OAAO,0BAA0B,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,MACrJ,EAAE,KAAK,KAAK,OAAO,oBAAoB,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,MAC/I,EAAE,KAAK,KAAK,OAAO,eAAe,QAAQ,EAAE,MAAM,QAAQ,KAAK,iBAAiB,EAAE;AAAA,MAClF,EAAE,KAAK,KAAK,OAAO,uBAAuB,QAAQ,EAAE,MAAM,UAAU,MAAM,qBAAqB,EAAE;AAAA,MACjG,EAAE,KAAK,KAAK,OAAO,yBAAyB,QAAQ,EAAE,MAAM,SAAS,MAAM,iBAAiB,OAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,gBAAgB,EAAE,EAAE;AAAA,MAClJ,EAAE,KAAK,KAAK,OAAO,qBAAqB,QAAQ,EAAE,MAAM,UAAU,MAAM,0BAA0B,GAAG,WAAW,SAAS;AAAA,MACzH,EAAE,KAAK,KAAK,OAAO,2BAA2B,QAAQ,EAAE,MAAM,OAAO,QAAQ,cAAc,EAAE;AAAA,MAC7F,EAAE,KAAK,KAAK,OAAO,iBAAY,QAAQ,EAAE,MAAM,WAAW,KAAK,OAAO,EAAE;AAAA,MACxE,EAAE,KAAK,KAAK,OAAO,iBAAY,QAAQ,EAAE,MAAM,WAAW,KAAK,OAAO,EAAE;AAAA,MACxE,EAAE,KAAK,KAAK,OAAO,kBAAa,QAAQ,EAAE,MAAM,WAAW,KAAK,QAAQ,EAAE;AAAA,MAC1E,EAAE,KAAK,KAAK,OAAO,oBAAe,QAAQ,EAAE,MAAM,WAAW,KAAK,UAAU,EAAE;AAAA,MAC9E,EAAE,KAAK,KAAK,OAAO,eAAU,QAAQ,EAAE,MAAM,WAAW,KAAK,KAAK,EAAE;AAAA,IACtE;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,QACL,EAAE,KAAK,KAAK,OAAO,sBAAsB,QAAQ,EAAE,MAAM,UAAU,MAAM,qBAAqB,EAAE;AAAA,QAChG,EAAE,KAAK,KAAK,OAAO,kBAAkB,QAAQ,EAAE,MAAM,UAAU,MAAM,mBAAmB,EAAE;AAAA,QAC1F,EAAE,KAAK,KAAK,OAAO,8BAA8B,QAAQ,EAAE,MAAM,UAAU,MAAM,wBAAwB,EAAE;AAAA,QAC3G,EAAE,KAAK,KAAK,OAAO,2BAA2B,QAAQ,EAAE,MAAM,UAAU,MAAM,qBAAqB,EAAE;AAAA,QACrG,EAAE,KAAK,KAAK,OAAO,2BAA2B,QAAQ,EAAE,MAAM,UAAU,MAAM,8BAA8B,EAAE;AAAA,QAC9G,EAAE,KAAK,KAAK,OAAO,uBAAuB,QAAQ,EAAE,MAAM,UAAU,MAAM,yBAAyB,EAAE;AAAA,MACvG;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,QACL,EAAE,KAAK,KAAK,OAAO,aAAa,QAAQ,EAAE,MAAM,SAAS,MAAM,sBAAsB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACrI,EAAE,KAAK,KAAK,OAAO,gBAAgB,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC3I,EAAE,KAAK,KAAK,OAAO,iBAAiB,QAAQ,EAAE,MAAM,SAAS,MAAM,0BAA0B,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC7I,EAAE,KAAK,KAAK,OAAO,uBAAuB,QAAQ,EAAE,MAAM,SAAS,MAAM,sBAAsB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC/I,EAAE,KAAK,KAAK,OAAO,6BAA6B,QAAQ,EAAE,MAAM,UAAU,MAAM,oBAAoB,EAAE;AAAA,QACtG,EAAE,KAAK,KAAK,OAAO,wBAAwB,QAAQ,EAAE,MAAM,SAAS,MAAM,+BAA+B,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACzJ,EAAE,KAAK,KAAK,OAAO,aAAa,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACxI,EAAE,KAAK,KAAK,OAAO,uBAAuB,QAAQ,EAAE,MAAM,SAAS,MAAM,8BAA8B,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,GAAG,WAAW,oBAAoB;AAAA,MACzL;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,QACL,EAAE,KAAK,KAAK,OAAO,iBAAiB,QAAQ,EAAE,MAAM,SAAS,MAAM,wBAAwB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC3I,EAAE,KAAK,KAAK,OAAO,4BAA4B,QAAQ,EAAE,MAAM,SAAS,MAAM,sBAAsB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACpJ,EAAE,KAAK,KAAK,OAAO,4BAA4B,QAAQ,EAAE,MAAM,SAAS,MAAM,gCAAgC,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC9J,EAAE,KAAK,KAAK,OAAO,2BAA2B,QAAQ,EAAE,MAAM,SAAS,MAAM,wBAAwB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACrJ,EAAE,KAAK,KAAK,OAAO,0BAA0B,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE,EAAE;AAAA,QACrI,EAAE,KAAK,KAAK,OAAO,0BAA0B,QAAQ,EAAE,MAAM,SAAS,MAAM,8BAA8B,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC1J,EAAE,KAAK,KAAK,OAAO,8BAA8B,QAAQ,EAAE,MAAM,SAAS,MAAM,4BAA4B,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC5J,EAAE,KAAK,KAAK,OAAO,yBAAyB,QAAQ,EAAE,MAAM,SAAS,MAAM,uBAAuB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAClJ,EAAE,KAAK,KAAK,OAAO,yBAAyB,QAAQ,EAAE,MAAM,UAAU,MAAM,+BAA+B,EAAE;AAAA,QAC7G,EAAE,KAAK,KAAK,OAAO,uBAAuB,QAAQ,EAAE,MAAM,UAAU,MAAM,6BAA6B,EAAE;AAAA,MAC3G;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,QACL,EAAE,KAAK,KAAK,OAAO,iBAAiB,QAAQ,EAAE,MAAM,SAAS,MAAM,gBAAgB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACnI,EAAE,KAAK,KAAK,OAAO,YAAY,QAAQ,EAAE,MAAM,SAAS,MAAM,2BAA2B,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACzI,EAAE,KAAK,KAAK,OAAO,cAAc,QAAQ,EAAE,MAAM,SAAS,MAAM,6BAA6B,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK,aAAa,aAAa,OAAO,sBAAsB,KAAK,UAAU,EAAE,EAAE;AAAA,QACjM,EAAE,KAAK,KAAK,OAAO,8BAA8B,QAAQ,EAAE,MAAM,SAAS,MAAM,6BAA6B,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK,OAAO,cAAc,KAAK,UAAU,EAAE,EAAE;AAAA,QAC/K,EAAE,KAAK,KAAK,OAAO,UAAU,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK,aAAa,UAAU,OAAO,kBAAkB,KAAK,UAAU,EAAE,EAAE;AAAA,QAClL,EAAE,KAAK,KAAK,OAAO,uBAAuB,QAAQ,EAAE,MAAM,SAAS,MAAM,2BAA2B,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK,aAAa,UAAU,OAAO,oBAAoB,KAAK,UAAU,EAAE,EAAE;AAAA,QACnM,EAAE,KAAK,KAAK,OAAO,2BAA2B,QAAQ,EAAE,MAAM,SAAS,MAAM,2BAA2B,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK,OAAO,oBAAoB,KAAK,UAAU,EAAE,EAAE;AAAA,QAChL,EAAE,KAAK,KAAK,OAAO,0BAA0B,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACrJ,EAAE,KAAK,KAAK,OAAO,oCAAoC,QAAQ,EAAE,MAAM,SAAS,MAAM,0BAA0B,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAChK,EAAE,KAAK,KAAK,OAAO,aAAa,QAAQ,EAAE,MAAM,SAAS,MAAM,oBAAoB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,MACrI;AAAA,IACF;AAAA,IACA,IAAI;AAAA,MACF,OAAO;AAAA,MACP,OAAO;AAAA,QACL,EAAE,KAAK,KAAK,OAAO,0BAA0B,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QACrJ,EAAE,KAAK,KAAK,OAAO,2BAA2B,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE,EAAE;AAAA,QACtI,EAAE,KAAK,KAAK,OAAO,oBAAoB,QAAQ,EAAE,MAAM,SAAS,MAAM,yBAAyB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,QAC/I,EAAE,KAAK,KAAK,OAAO,kBAAkB,QAAQ,EAAE,MAAM,UAAU,MAAM,iBAAiB,EAAE;AAAA,QACxF,EAAE,KAAK,KAAK,OAAO,eAAe,QAAQ,EAAE,MAAM,SAAS,MAAM,sBAAsB,OAAO,EAAE,GAAG,OAAO,GAAG,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,MACzI;AAAA,IACF;AAAA,EACF;AACF;;;ACtLO,SAAS,oBAAoB,SAA0B;AAC5D,SAAO,QAAQ;AACjB;;;ACRA,SAAS,oBAAoB;AAU7B,SAAS,kBAAkB,QAA6B;AACtD,MAAI;AACF,WAAO,aAAa,OAAO,UAAU,OAAO;AAAA,EAC9C,QAAQ;AACN,WAAO,OAAO;AAAA,EAChB;AACF;AAEO,SAAS,eAAe,SAAuC;AACpE,SAAO,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO;AAAA,IACxC,MAAM,EAAE;AAAA,IACR,WAAW,EAAE;AAAA,IACb,SAAS,kBAAkB,CAAC;AAAA,IAC5B,SAAS,EAAE;AAAA,EACb,EAAE;AACJ;;;ACzBA,SAAS,gBAAAA,eAAc,mBAAmB;AAK1C,SAAS,aAAa,UAAiC;AACrD,MAAI;AACF,WAAOC,cAAa,UAAU,OAAO;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;AAEO,SAAS,sBAAsB,KAAqB;AACzD,MAAI;AACJ,MAAI;AACF,kBAAc,YAAY,YAAY,GAAG,CAAC;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,cAAc,IAAI,KAAK,KAAK,KAAK;AACvC,QAAM,gBAA0B,CAAC;AAEjC,aAAW,aAAa,aAAa;AACnC,UAAM,WAAW,aAAa,UAAU,KAAK,SAAS,CAAC;AACvD,QAAI,CAAC,SAAU;AAEf,QAAI;AACJ,QAAI;AACF,gBAAU,KAAK,MAAM,QAAQ;AAAA,IAC/B,QAAQ;AACN;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,eAAe,QAAQ,aAAa;AACzD,UAAI,MAAM,IAAI,KAAK,QAAQ,WAAW,EAAE,QAAQ,IAAI,YAAa;AAAA,IACnE;AAEA,UAAM,QAAkB,CAAC;AACzB,UAAM,WAAW,QAAQ,OAAO,UAAU,UAAU,QAAQ,IAAI,CAAC,MAAM;AACvE,UAAM,KAAK,kBAAkB,UAAU,QAAQ,EAAE,CAAC,IAAI,QAAQ,YAAY,UAAU,QAAQ,MAAM,CAAC,IAAI;AACvG,UAAM,KAAK,aAAa,UAAU,QAAQ,IAAI,CAAC,SAAS;AACxD,UAAM,KAAK,gBAAgB,UAAU,QAAQ,SAAS,CAAC,YAAY;AACnE,UAAM,KAAK,eAAe,QAAQ,mBAAmB,MAAM,WAAW;AAEtE,QAAI,QAAQ,WAAW,aAAa;AAClC,UAAI,QAAQ,kBAAkB;AAC5B,cAAM,UAAU,QAAQ,iBAAiB,MAAM,GAAG,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACjF,cAAM,KAAK,0BAA0B,UAAU,OAAO,CAAC,GAAG,QAAQ,iBAAiB,SAAS,MAAM,WAAM,EAAE,sBAAsB;AAAA,MAClI;AAAA,IACF,OAAO;AAEL,UAAI,QAAQ,OAAO,SAAS,GAAG;AAC7B,cAAM,SAAS,oBAAI,IAAyB;AAC5C,mBAAW,SAAS,QAAQ,QAAQ;AAClC,iBAAO,IAAI,MAAM,SAAS,OAAO,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,QAC9D;AACA,cAAM,UAAU,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,EAAE,EAAE,KAAK,IAAI;AACtF,cAAM,KAAK,eAAe,UAAU,OAAO,CAAC,WAAW;AAAA,MACzD;AAGA,YAAM,cAAc,aAAa,SAAS,KAAK,QAAQ,EAAE,CAAC;AAC1D,UAAI,aAAa;AACf,cAAM,YAAY,YAAY,MAAM,IAAI,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,KAAK,OAAK,EAAE,SAAS,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AACzG,YAAI,UAAW,OAAM,KAAK,aAAa,UAAU,SAAS,CAAC,SAAS;AAAA,MACtE;AAGA,YAAM,iBAAiB,aAAa,YAAY,KAAK,QAAQ,EAAE,CAAC;AAChE,UAAI,gBAAgB;AAClB,cAAM,QAAQ,eACX,MAAM,IAAI,EACV,OAAO,OAAK,EAAE,SAAS,OAAO,CAAC,EAC/B,MAAM,GAAG,CAAC,EACV,IAAI,OAAK,EAAE,KAAK,CAAC;AACpB,YAAI,MAAM,SAAS,GAAG;AACpB,gBAAM,KAAK,aAAa;AACxB,qBAAW,QAAQ,MAAO,OAAM,KAAK,SAAS,UAAU,IAAI,CAAC,EAAE;AAC/D,gBAAM,KAAK,cAAc;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,cAAc;AACzB,kBAAc,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,EACrC;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,cAAc,GAAG,eAAe,aAAa,EAAE,KAAK,IAAI;AAClE;AAEO,SAAS,oBAAoB,SAAkB,KAAqB;AACzE,QAAM,OAAO,aAAa,SAAS,KAAK,QAAQ,EAAE,CAAC;AACnD,QAAM,UAAU,aAAa,YAAY,KAAK,QAAQ,EAAE,CAAC;AAEzD,QAAM,YAAY,QAAQ,OAAO,IAAI,CAAC,UAAU;AAC9C,UAAM,eAAe,eAAe,MAAM,OAAO;AAEjD,UAAM,aAAa,CAAC,GAAG,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU;AAC5D,aAAO,uBAAuB,MAAM,IAAI,WAAW,UAAU,MAAM,SAAS,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,IAC5G,CAAC,EAAE,KAAK,IAAI;AAEZ,WAAO;AAAA,MACL,kBAAkB,UAAU,MAAM,EAAE,CAAC,WAAW,UAAU,MAAM,IAAI,CAAC,WAAW,UAAU,MAAM,SAAS,CAAC,aAAa,UAAU,MAAM,MAAM,CAAC;AAAA,MAC9I,sBAAsB,UAAU,MAAM,WAAW,CAAC;AAAA,MAClD,GAAI,aAAa,CAAC,UAAU,IAAI,CAAC;AAAA,MACjC;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb,CAAC,EAAE,KAAK,IAAI;AAEZ,QAAM,YAAY,QAAQ,mBAAmB,IAAI,CAAC,UAAU;AAC1D,UAAM,SAAS,MAAM,cAAc,KAAK,IAAI;AAC5C,UAAM,OAAO,MAAM,OAAO,UAAU,UAAU,MAAM,IAAI,CAAC,MAAM;AAC/D,WAAO,sBAAsB,MAAM,KAAK,IAAI,IAAI,YAAY,UAAU,MAAM,CAAC;AAAA,EAC/E,CAAC,EAAE,KAAK,IAAI;AAEZ,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,gBAAgB,UAAU,QAAQ,EAAE,CAAC,aAAa,UAAU,QAAQ,MAAM,CAAC;AAAA,IAC3E,WAAW,UAAU,QAAQ,IAAI,CAAC;AAAA,IAClC,UAAU,UAAU,QAAQ,GAAG,CAAC;AAAA,EAClC;AAEA,MAAI,KAAM,OAAM,KAAK,WAAW,UAAU,IAAI,CAAC,SAAS;AACxD,MAAI,QAAS,OAAM,KAAK,cAAc,UAAU,OAAO,CAAC,YAAY;AAEpE,MAAI,QAAQ,OAAO,SAAS,GAAG;AAC7B,UAAM,KAAK,YAAY;AACvB,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,aAAa;AAAA,EAC1B;AAEA,MAAI,QAAQ,mBAAmB,SAAS,GAAG;AACzC,UAAM,KAAK,YAAY;AACvB,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,aAAa;AAAA,EAC1B;AAEA,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,KAAK,wBAAwB,UAAU,QAAQ,gBAAgB,CAAC,sBAAsB;AAAA,EAC9F;AAEA,QAAM,KAAK,YAAY;AACvB,QAAM,KAAK,YAAY;AAEvB,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACzJA,IAAM,YAA6C;AAAA;AAAA,EAEjD,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAGA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,uBAAuB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMA,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,aAAa,a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","names":["readFileSync","readFileSync"]}