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.
- package/README.md +195 -75
- package/dist/chunk-36VJ7ZBD.js +1898 -0
- package/dist/chunk-36VJ7ZBD.js.map +1 -0
- package/dist/{chunk-C2XKXERJ.js → chunk-M6Z3KHOH.js} +159 -46
- package/dist/chunk-M6Z3KHOH.js.map +1 -0
- package/dist/chunk-O4ZHSQ5R.js +544 -0
- package/dist/chunk-O4ZHSQ5R.js.map +1 -0
- package/dist/chunk-P2HHTIPM.js +478 -0
- package/dist/chunk-P2HHTIPM.js.map +1 -0
- package/dist/{chunk-TMBAVPHH.js → chunk-PNDCVKBN.js} +73 -1
- package/dist/chunk-PNDCVKBN.js.map +1 -0
- package/dist/chunk-SVGIQ2G4.js +1076 -0
- package/dist/chunk-SVGIQ2G4.js.map +1 -0
- package/dist/cli.js +4405 -892
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +4340 -1990
- package/dist/daemon.js.map +1 -1
- package/dist/{paths-XRDEEJ5R.js → paths-JXFLR5BN.js} +38 -2
- package/dist/single-ask-6G4BIVY2.js +132 -0
- package/dist/single-ask-6G4BIVY2.js.map +1 -0
- package/dist/templates/CLAUDE.md +1 -56
- package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -65
- package/dist/templates/agent-plugin/agents/debug.md +43 -6
- package/dist/templates/agent-plugin/agents/debug.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/explore.md +28 -1
- package/dist/templates/agent-plugin/agents/explore.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/implementor.md +94 -0
- package/dist/templates/agent-plugin/agents/implementor.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/operator.md +43 -1
- package/dist/templates/agent-plugin/agents/operator.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
- package/dist/templates/agent-plugin/agents/plan.md +176 -86
- package/dist/templates/agent-plugin/agents/plan.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/problem/adversarial.md +26 -0
- package/dist/templates/agent-plugin/agents/problem/contrarian.md +26 -0
- package/dist/templates/agent-plugin/agents/problem/first-principles.md +26 -0
- package/dist/templates/agent-plugin/agents/problem/precedent.md +25 -0
- package/dist/templates/agent-plugin/agents/problem/simplifier.md +26 -0
- package/dist/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
- package/dist/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
- package/dist/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
- package/dist/templates/agent-plugin/agents/problem.md +334 -79
- package/dist/templates/agent-plugin/agents/problem.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
- package/dist/templates/agent-plugin/agents/research-lead/critic.md +61 -0
- package/dist/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
- package/dist/templates/agent-plugin/agents/research-lead.md +184 -0
- package/dist/templates/agent-plugin/agents/research-lead.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
- package/dist/templates/agent-plugin/agents/review/compliance.md +14 -3
- package/dist/templates/agent-plugin/agents/review/efficiency.md +15 -4
- package/dist/templates/agent-plugin/agents/review/quality.md +20 -6
- package/dist/templates/agent-plugin/agents/review/reuse.md +17 -5
- package/dist/templates/agent-plugin/agents/review/security.md +10 -3
- package/dist/templates/agent-plugin/agents/review/tests.md +58 -0
- package/dist/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
- package/dist/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
- package/dist/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
- package/dist/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
- package/dist/templates/agent-plugin/agents/review-plan/security.md +5 -2
- package/dist/templates/agent-plugin/agents/review-plan.md +52 -5
- package/dist/templates/agent-plugin/agents/review-plan.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/review.md +89 -16
- package/dist/templates/agent-plugin/agents/review.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/spec/engineer.md +175 -0
- package/dist/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
- package/dist/templates/agent-plugin/agents/spec.md +444 -0
- package/dist/templates/agent-plugin/agents/spec.settings.json +57 -0
- package/dist/templates/agent-plugin/agents/test-spec.md +58 -2
- package/dist/templates/agent-plugin/agents/test-spec.settings.json +57 -0
- package/dist/templates/agent-plugin/hooks/CLAUDE.md +9 -57
- package/dist/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
- package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/dist/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
- package/dist/templates/agent-plugin/hooks/plan-validate.sh +97 -0
- package/dist/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
- package/dist/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
- package/dist/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
- package/dist/templates/agent-plugin/hooks/require-submit.sh +51 -42
- package/dist/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
- package/dist/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
- package/dist/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
- package/dist/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
- package/dist/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
- package/dist/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
- package/dist/templates/agent-suffix.md +7 -4
- package/dist/templates/baleia.lua +42 -0
- package/dist/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
- package/dist/templates/dashboard-claude.md +7 -3
- package/dist/templates/orchestrator-base.md +89 -52
- package/dist/templates/orchestrator-completion.md +47 -24
- package/dist/templates/orchestrator-discovery.md +183 -0
- package/dist/templates/orchestrator-impl.md +47 -18
- package/dist/templates/orchestrator-planning.md +109 -20
- package/dist/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
- package/dist/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
- package/dist/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
- package/dist/templates/orchestrator-plugin/hooks/hooks.json +0 -10
- package/dist/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
- package/dist/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
- package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
- package/dist/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
- package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
- package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
- package/dist/templates/orchestrator-settings.json +55 -0
- package/dist/templates/orchestrator-validation.md +17 -14
- package/dist/templates/sisyphus-init.lua +30 -0
- package/dist/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
- package/dist/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
- package/dist/templates/termrender-haiku-system.md +82 -0
- package/dist/templates/whip-animation.sh +345 -0
- package/dist/tui.js +3242 -2189
- package/dist/tui.js.map +1 -1
- package/native/SisyphusNotify/main.swift +15 -5
- package/package.json +8 -6
- package/templates/CLAUDE.md +1 -56
- package/templates/agent-plugin/agents/CLAUDE.md +2 -65
- package/templates/agent-plugin/agents/debug.md +43 -6
- package/templates/agent-plugin/agents/debug.settings.json +57 -0
- package/templates/agent-plugin/agents/explore.md +28 -1
- package/templates/agent-plugin/agents/explore.settings.json +57 -0
- package/templates/agent-plugin/agents/implementor.md +94 -0
- package/templates/agent-plugin/agents/implementor.settings.json +57 -0
- package/templates/agent-plugin/agents/operator.md +43 -1
- package/templates/agent-plugin/agents/operator.settings.json +57 -0
- package/templates/agent-plugin/agents/plan/sub-planner.md +75 -0
- package/templates/agent-plugin/agents/plan.md +176 -86
- package/templates/agent-plugin/agents/plan.settings.json +57 -0
- package/templates/agent-plugin/agents/problem/adversarial.md +26 -0
- package/templates/agent-plugin/agents/problem/contrarian.md +26 -0
- package/templates/agent-plugin/agents/problem/first-principles.md +26 -0
- package/templates/agent-plugin/agents/problem/precedent.md +25 -0
- package/templates/agent-plugin/agents/problem/simplifier.md +26 -0
- package/templates/agent-plugin/agents/problem/systems-thinker.md +26 -0
- package/templates/agent-plugin/agents/problem/time-traveler.md +26 -0
- package/templates/agent-plugin/agents/problem/user-empathy.md +26 -0
- package/templates/agent-plugin/agents/problem.md +334 -79
- package/templates/agent-plugin/agents/problem.settings.json +57 -0
- package/templates/agent-plugin/agents/research-lead/CLAUDE.md +26 -0
- package/templates/agent-plugin/agents/research-lead/critic.md +61 -0
- package/templates/agent-plugin/agents/research-lead/researcher.md +60 -0
- package/templates/agent-plugin/agents/research-lead.md +184 -0
- package/templates/agent-plugin/agents/research-lead.settings.json +57 -0
- package/templates/agent-plugin/agents/review/CLAUDE.md +3 -29
- package/templates/agent-plugin/agents/review/compliance.md +14 -3
- package/templates/agent-plugin/agents/review/efficiency.md +15 -4
- package/templates/agent-plugin/agents/review/quality.md +20 -6
- package/templates/agent-plugin/agents/review/reuse.md +17 -5
- package/templates/agent-plugin/agents/review/security.md +10 -3
- package/templates/agent-plugin/agents/review/tests.md +58 -0
- package/templates/agent-plugin/agents/review-plan/CLAUDE.md +28 -0
- package/templates/agent-plugin/agents/review-plan/code-smells.md +4 -2
- package/templates/agent-plugin/agents/review-plan/pattern-consistency.md +4 -2
- package/templates/agent-plugin/agents/review-plan/requirements-coverage.md +3 -1
- package/templates/agent-plugin/agents/review-plan/security.md +5 -2
- package/templates/agent-plugin/agents/review-plan.md +52 -5
- package/templates/agent-plugin/agents/review-plan.settings.json +57 -0
- package/templates/agent-plugin/agents/review.md +89 -16
- package/templates/agent-plugin/agents/review.settings.json +57 -0
- package/templates/agent-plugin/agents/spec/engineer.md +175 -0
- package/templates/agent-plugin/agents/spec/requirements-writer.md +149 -0
- package/templates/agent-plugin/agents/spec.md +444 -0
- package/templates/agent-plugin/agents/spec.settings.json +57 -0
- package/templates/agent-plugin/agents/test-spec.md +58 -2
- package/templates/agent-plugin/agents/test-spec.settings.json +57 -0
- package/templates/agent-plugin/hooks/CLAUDE.md +9 -57
- package/templates/agent-plugin/hooks/ask-background-guard.sh +57 -0
- package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/templates/agent-plugin/hooks/plan-user-prompt.sh +8 -7
- package/templates/agent-plugin/hooks/plan-validate.sh +97 -0
- package/templates/agent-plugin/hooks/plan-write-path.sh +55 -0
- package/templates/agent-plugin/hooks/problem-user-prompt.sh +26 -0
- package/templates/agent-plugin/hooks/register-bg-task.sh +37 -0
- package/templates/agent-plugin/hooks/require-submit.sh +51 -42
- package/templates/agent-plugin/hooks/review-user-prompt.sh +6 -2
- package/templates/agent-plugin/hooks/spec-user-prompt.sh +43 -0
- package/templates/agent-plugin/skills/humanloop/SKILL.md +147 -0
- package/templates/agent-plugin/skills/perspective-fanout/SKILL.md +115 -0
- package/templates/agent-plugin/skills/problem-document/SKILL.md +105 -0
- package/templates/agent-plugin/skills/problem-plateau-breakers/SKILL.md +83 -0
- package/templates/agent-suffix.md +7 -4
- package/templates/baleia.lua +42 -0
- package/templates/companion-plugin/hooks/user-prompt-context.sh +1 -1
- package/templates/dashboard-claude.md +7 -3
- package/templates/orchestrator-base.md +89 -52
- package/templates/orchestrator-completion.md +47 -24
- package/templates/orchestrator-discovery.md +183 -0
- package/templates/orchestrator-impl.md +47 -18
- package/templates/orchestrator-planning.md +109 -20
- package/templates/orchestrator-plugin/commands/sisyphus/scratch.md +19 -0
- package/templates/orchestrator-plugin/commands/sisyphus/spec.md +11 -0
- package/templates/orchestrator-plugin/commands/sisyphus/strategize.md +5 -5
- package/templates/orchestrator-plugin/hooks/hooks.json +0 -10
- package/templates/orchestrator-plugin/skills/humanloop/SKILL.md +149 -0
- package/templates/orchestrator-plugin/skills/orchestration/CLAUDE.md +1 -0
- package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +2 -1
- package/templates/orchestrator-plugin/skills/orchestration/strategy.md +160 -0
- package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +26 -28
- package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +133 -25
- package/templates/orchestrator-settings.json +55 -0
- package/templates/orchestrator-validation.md +17 -14
- package/templates/sisyphus-init.lua +30 -0
- package/templates/sisyphus-tmux-plugin/hooks/hooks.json +54 -0
- package/templates/sisyphus-tmux-plugin/hooks/tmux-state.sh +19 -0
- package/templates/termrender-haiku-system.md +82 -0
- package/templates/whip-animation.sh +345 -0
- package/dist/chunk-22ZGZTGY.js +0 -67
- package/dist/chunk-22ZGZTGY.js.map +0 -1
- package/dist/chunk-6PJVJEYQ.js +0 -46
- package/dist/chunk-6PJVJEYQ.js.map +0 -1
- package/dist/chunk-C2XKXERJ.js.map +0 -1
- package/dist/chunk-TMBAVPHH.js.map +0 -1
- package/dist/chunk-V36NXMHP.js +0 -299
- package/dist/chunk-V36NXMHP.js.map +0 -1
- package/dist/templates/agent-plugin/agents/design.md +0 -134
- package/dist/templates/agent-plugin/agents/requirements.md +0 -138
- package/dist/templates/begin.md +0 -22
- package/dist/templates/nvim-tutorial.txt +0 -68
- package/dist/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
- package/dist/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
- package/dist/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
- package/dist/templates/orchestrator-strategy.md +0 -238
- package/templates/agent-plugin/agents/design.md +0 -134
- package/templates/agent-plugin/agents/requirements.md +0 -138
- package/templates/begin.md +0 -22
- package/templates/nvim-tutorial.txt +0 -68
- package/templates/orchestrator-plugin/commands/sisyphus/design.md +0 -13
- package/templates/orchestrator-plugin/commands/sisyphus/requirements.md +0 -13
- package/templates/orchestrator-plugin/hooks/idle-notify.sh +0 -71
- package/templates/orchestrator-strategy.md +0 -238
- /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-
|
|
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-
|
|
11
|
+
} from "./chunk-PNDCVKBN.js";
|
|
12
12
|
|
|
13
|
-
// src/shared/
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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 \
|
|
517
|
-
" \u2551 \u2502\
|
|
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-
|
|
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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\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":"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AA,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"]}
|