sisyphi 1.1.17 → 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 +347 -25
- package/dist/chunk-36VJ7ZBD.js +1898 -0
- package/dist/chunk-36VJ7ZBD.js.map +1 -0
- package/dist/chunk-M6Z3KHOH.js +1165 -0
- 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-GSXF3TCZ.js → chunk-PNDCVKBN.js} +91 -3
- 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 +4426 -818
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +4351 -857
- package/dist/daemon.js.map +1 -1
- package/dist/paths-JXFLR5BN.js +102 -0
- 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 +3789 -2406
- package/dist/tui.js.map +1 -1
- package/native/SisyphusNotify/AppIcon.icns +0 -0
- package/native/SisyphusNotify/Info.plist +26 -0
- package/native/SisyphusNotify/main.swift +136 -0
- package/native/SisyphusNotify/sisyphus-icon.jpg +0 -0
- package/native/build-notify.sh +58 -0
- package/package.json +9 -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-6TIO23U3.js +0 -67
- package/dist/chunk-6TIO23U3.js.map +0 -1
- package/dist/chunk-GSXF3TCZ.js.map +0 -1
- package/dist/chunk-HQZOAX6D.js +0 -240
- package/dist/chunk-HQZOAX6D.js.map +0 -1
- package/dist/chunk-IF55HPWX.js +0 -44
- package/dist/chunk-IF55HPWX.js.map +0 -1
- package/dist/chunk-UIVQXCWB.js +0 -46
- package/dist/chunk-UIVQXCWB.js.map +0 -1
- package/dist/paths-3EL2SCHI.js +0 -58
- 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-3EL2SCHI.js.map → paths-JXFLR5BN.js.map} +0 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
execSafe,
|
|
4
|
+
getMoodFace,
|
|
5
|
+
getMoodTmuxColor,
|
|
6
|
+
loadCompanion
|
|
7
|
+
} from "./chunk-36VJ7ZBD.js";
|
|
8
|
+
import {
|
|
9
|
+
loadConfig,
|
|
10
|
+
shellQuote
|
|
11
|
+
} from "./chunk-SVGIQ2G4.js";
|
|
12
|
+
|
|
13
|
+
// src/daemon/frontmatter.ts
|
|
14
|
+
import { readFileSync, existsSync, readdirSync } from "fs";
|
|
15
|
+
import { homedir } from "os";
|
|
16
|
+
import { join, basename } from "path";
|
|
17
|
+
function detectProvider(model) {
|
|
18
|
+
if (!model) return "anthropic";
|
|
19
|
+
if (/^(gpt-|codex-)/.test(model)) return "openai";
|
|
20
|
+
return "anthropic";
|
|
21
|
+
}
|
|
22
|
+
function parseAgentFrontmatter(content) {
|
|
23
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
24
|
+
if (!match) return {};
|
|
25
|
+
const block = match[1];
|
|
26
|
+
const fm = {};
|
|
27
|
+
const str = (key) => {
|
|
28
|
+
const m = block.match(new RegExp(`^${key}:\\s*(.+)$`, "m"));
|
|
29
|
+
return m ? m[1].trim() : void 0;
|
|
30
|
+
};
|
|
31
|
+
fm.name = str("name");
|
|
32
|
+
fm.model = str("model");
|
|
33
|
+
fm.fallbackModel = str("fallbackModel");
|
|
34
|
+
fm.color = str("color");
|
|
35
|
+
fm.description = str("description");
|
|
36
|
+
fm.permissionMode = str("permissionMode");
|
|
37
|
+
fm.effort = str("effort");
|
|
38
|
+
const interactive = str("interactive");
|
|
39
|
+
if (interactive === "true") fm.interactive = true;
|
|
40
|
+
const systemPrompt = str("systemPrompt");
|
|
41
|
+
if (systemPrompt === "append" || systemPrompt === "replace") fm.systemPrompt = systemPrompt;
|
|
42
|
+
for (const key of ["skills", "plugins"]) {
|
|
43
|
+
const listMatch = block.match(new RegExp(`^${key}:\\s*\\n((?:\\s+-\\s+.+\\n?)*)`, "m"));
|
|
44
|
+
if (listMatch) {
|
|
45
|
+
fm[key] = listMatch[1].split("\n").map((line) => line.replace(/^\s+-\s+/, "").trim()).filter(Boolean);
|
|
46
|
+
}
|
|
47
|
+
const inlineMatch = block.match(new RegExp(`^${key}:\\s*\\[([^\\]]+)\\]`, "m"));
|
|
48
|
+
if (inlineMatch && !fm[key]) {
|
|
49
|
+
fm[key] = inlineMatch[1].split(",").map((s) => s.trim()).filter(Boolean);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return fm;
|
|
53
|
+
}
|
|
54
|
+
function extractAgentBody(content) {
|
|
55
|
+
const match = content.match(/^---\n[\s\S]*?\n---\n?([\s\S]*)$/);
|
|
56
|
+
return match ? match[1].trim() : content.trim();
|
|
57
|
+
}
|
|
58
|
+
function findPluginInstallPath(namespace) {
|
|
59
|
+
try {
|
|
60
|
+
const registryPath = join(homedir(), ".claude", "plugins", "installed_plugins.json");
|
|
61
|
+
const registry = JSON.parse(readFileSync(registryPath, "utf-8"));
|
|
62
|
+
for (const key of Object.keys(registry)) {
|
|
63
|
+
if (key.startsWith(`${namespace}@`)) {
|
|
64
|
+
return registry[key].installPath ?? null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
} catch {
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function resolveAgentTypePath(agentType, pluginDir, cwd) {
|
|
72
|
+
if (!agentType) return null;
|
|
73
|
+
let namespace;
|
|
74
|
+
let name;
|
|
75
|
+
if (agentType.includes(":")) {
|
|
76
|
+
[namespace, name] = agentType.split(":", 2);
|
|
77
|
+
} else {
|
|
78
|
+
name = agentType;
|
|
79
|
+
}
|
|
80
|
+
const searchPaths = [];
|
|
81
|
+
if (namespace) {
|
|
82
|
+
searchPaths.push(join(pluginDir, "agents", `${name}.md`));
|
|
83
|
+
const installPath = findPluginInstallPath(namespace);
|
|
84
|
+
if (installPath) {
|
|
85
|
+
searchPaths.push(join(installPath, "agents", `${name}.md`));
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
searchPaths.push(join(cwd, ".claude", "agents", `${name}.md`));
|
|
89
|
+
searchPaths.push(join(homedir(), ".claude", "agents", `${name}.md`));
|
|
90
|
+
searchPaths.push(join(pluginDir, "agents", `${name}.md`));
|
|
91
|
+
}
|
|
92
|
+
for (const path of searchPaths) {
|
|
93
|
+
if (existsSync(path)) return path;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
function discoverAgentTypes(pluginDir, cwd) {
|
|
98
|
+
const seen = /* @__PURE__ */ new Set();
|
|
99
|
+
const results = [];
|
|
100
|
+
function scanDir(dir, prefix, source) {
|
|
101
|
+
let files;
|
|
102
|
+
try {
|
|
103
|
+
files = readdirSync(dir);
|
|
104
|
+
} catch {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (const file of files) {
|
|
108
|
+
if (!file.endsWith(".md") || file === "CLAUDE.md") continue;
|
|
109
|
+
const name = basename(file, ".md");
|
|
110
|
+
const qualifiedName = prefix ? `${prefix}:${name}` : name;
|
|
111
|
+
if (seen.has(qualifiedName)) continue;
|
|
112
|
+
seen.add(qualifiedName);
|
|
113
|
+
try {
|
|
114
|
+
const content = readFileSync(join(dir, file), "utf-8");
|
|
115
|
+
const fm = parseAgentFrontmatter(content);
|
|
116
|
+
results.push({ qualifiedName, source, description: fm.description, model: fm.model });
|
|
117
|
+
} catch {
|
|
118
|
+
results.push({ qualifiedName, source });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
scanDir(join(cwd, ".claude", "agents"), null, "project");
|
|
123
|
+
scanDir(join(homedir(), ".claude", "agents"), null, "user");
|
|
124
|
+
scanDir(join(pluginDir, "agents"), "sisyphus", "bundled");
|
|
125
|
+
try {
|
|
126
|
+
const registryPath = join(homedir(), ".claude", "plugins", "installed_plugins.json");
|
|
127
|
+
const registry = JSON.parse(readFileSync(registryPath, "utf-8"));
|
|
128
|
+
const pluginEntries = registry.plugins ?? registry;
|
|
129
|
+
for (const key of Object.keys(pluginEntries)) {
|
|
130
|
+
const atIdx = key.indexOf("@");
|
|
131
|
+
if (atIdx < 1) continue;
|
|
132
|
+
const namespace = key.slice(0, atIdx);
|
|
133
|
+
const entry = pluginEntries[key];
|
|
134
|
+
const installPath = Array.isArray(entry) ? entry[0]?.installPath : entry?.installPath;
|
|
135
|
+
if (installPath) {
|
|
136
|
+
scanDir(join(installPath, "agents"), namespace, "plugin");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
} catch {
|
|
140
|
+
}
|
|
141
|
+
return results;
|
|
142
|
+
}
|
|
143
|
+
function resolveAgentConfig(agentType, pluginDir, cwd) {
|
|
144
|
+
const filePath = resolveAgentTypePath(agentType, pluginDir, cwd);
|
|
145
|
+
if (!filePath) return null;
|
|
146
|
+
try {
|
|
147
|
+
const content = readFileSync(filePath, "utf-8");
|
|
148
|
+
return {
|
|
149
|
+
frontmatter: parseAgentFrontmatter(content),
|
|
150
|
+
body: extractAgentBody(content),
|
|
151
|
+
filePath
|
|
152
|
+
};
|
|
153
|
+
} catch {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// src/daemon/plugins.ts
|
|
159
|
+
import { readFileSync as readFileSync2 } from "fs";
|
|
160
|
+
import { execFileSync } from "child_process";
|
|
161
|
+
import { homedir as homedir2 } from "os";
|
|
162
|
+
import { join as join2 } from "path";
|
|
163
|
+
function installedPluginsPath() {
|
|
164
|
+
return join2(homedir2(), ".claude", "plugins", "installed_plugins.json");
|
|
165
|
+
}
|
|
166
|
+
function resolveInstalledPlugin(name) {
|
|
167
|
+
let data;
|
|
168
|
+
try {
|
|
169
|
+
data = JSON.parse(readFileSync2(installedPluginsPath(), "utf-8"));
|
|
170
|
+
} catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const entries = data.plugins?.[name];
|
|
174
|
+
if (!entries || entries.length === 0) return null;
|
|
175
|
+
const userEntry = entries.find((e) => e.scope === "user");
|
|
176
|
+
return (userEntry ?? entries[0]).installPath;
|
|
177
|
+
}
|
|
178
|
+
function ensurePluginInstalled(key) {
|
|
179
|
+
const existing = resolveInstalledPlugin(key);
|
|
180
|
+
if (existing) return existing;
|
|
181
|
+
console.log(`[sisyphus] Auto-installing plugin ${key}...`);
|
|
182
|
+
try {
|
|
183
|
+
execFileSync("claude", ["plugin", "install", key], {
|
|
184
|
+
stdio: "pipe",
|
|
185
|
+
timeout: 6e4
|
|
186
|
+
});
|
|
187
|
+
} catch (err) {
|
|
188
|
+
console.log(`[sisyphus] Warning: failed to install plugin ${key} \u2014 ${err.message}`);
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
const installed = resolveInstalledPlugin(key);
|
|
192
|
+
if (!installed) {
|
|
193
|
+
console.log(`[sisyphus] Warning: plugin ${key} installed but not found in registry`);
|
|
194
|
+
}
|
|
195
|
+
return installed;
|
|
196
|
+
}
|
|
197
|
+
function resolveRequiredPluginDirs(cwd) {
|
|
198
|
+
const config = loadConfig(cwd);
|
|
199
|
+
const required = config.requiredPlugins;
|
|
200
|
+
if (!required || required.length === 0) return [];
|
|
201
|
+
const dirs = [];
|
|
202
|
+
for (const plugin of required) {
|
|
203
|
+
const key = `${plugin.name}@${plugin.marketplace}`;
|
|
204
|
+
const path = ensurePluginInstalled(key);
|
|
205
|
+
if (path) {
|
|
206
|
+
dirs.push(path);
|
|
207
|
+
} else {
|
|
208
|
+
console.log(`[sisyphus] Warning: required plugin ${key} not available \u2014 skipping`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return dirs;
|
|
212
|
+
}
|
|
213
|
+
function resolveAgentPluginDirs(plugins) {
|
|
214
|
+
if (!plugins || plugins.length === 0) return [];
|
|
215
|
+
const dirs = [];
|
|
216
|
+
for (const key of plugins) {
|
|
217
|
+
const path = ensurePluginInstalled(key);
|
|
218
|
+
if (path) {
|
|
219
|
+
dirs.push(path);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return dirs;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// src/daemon/companion-popup.ts
|
|
226
|
+
import { writeFileSync, readFileSync as readFileSync3, unlinkSync, existsSync as existsSync2 } from "fs";
|
|
227
|
+
import { tmpdir } from "os";
|
|
228
|
+
import { join as join3, resolve } from "path";
|
|
229
|
+
var POPUP_WIDTH = 38;
|
|
230
|
+
var INNER_WIDTH = POPUP_WIDTH - 6;
|
|
231
|
+
var POPUP_DURATION = 15;
|
|
232
|
+
var POPUP_TMP_PREFIX = join3(tmpdir(), "sisyphus-popup");
|
|
233
|
+
var POPUP_SCRIPT = join3(tmpdir(), "sisyphus-popup.sh");
|
|
234
|
+
var POPUP_RESULT_PREFIX = join3(tmpdir(), "sisyphus-popup-result");
|
|
235
|
+
var WHIP_ANIMATION_PATH = resolve(import.meta.dirname, "../templates/whip-animation.sh");
|
|
236
|
+
var WHIP_ANIMATION_ROWS = 12;
|
|
237
|
+
function wrapText(text, width) {
|
|
238
|
+
const words = text.split(" ");
|
|
239
|
+
const lines = [];
|
|
240
|
+
let current = "";
|
|
241
|
+
for (const word of words) {
|
|
242
|
+
if (current && current.length + 1 + word.length > width) {
|
|
243
|
+
lines.push(current);
|
|
244
|
+
current = word;
|
|
245
|
+
} else {
|
|
246
|
+
current = current ? `${current} ${word}` : word;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (current) lines.push(current);
|
|
250
|
+
return lines;
|
|
251
|
+
}
|
|
252
|
+
function showCommentaryPopup(text) {
|
|
253
|
+
return showCommentaryPopupQueue([{ text }]);
|
|
254
|
+
}
|
|
255
|
+
function showCommentaryPopupQueue(pages) {
|
|
256
|
+
if (pages.length === 0) return null;
|
|
257
|
+
try {
|
|
258
|
+
const config = loadConfig(process.cwd());
|
|
259
|
+
if (config.companionPopup === false) return null;
|
|
260
|
+
const companion = loadCompanion();
|
|
261
|
+
const intensity = companion.debugMood?.scores[companion.mood] ?? 0;
|
|
262
|
+
const face = getMoodFace(companion.mood, intensity);
|
|
263
|
+
const moodColor = getMoodTmuxColor(companion.mood);
|
|
264
|
+
const defaultTitle = ` (${face}) `;
|
|
265
|
+
let maxContentHeight = 0;
|
|
266
|
+
for (let i = 0; i < pages.length; i++) {
|
|
267
|
+
const lines = wrapText(pages[i].text, INNER_WIDTH);
|
|
268
|
+
const isLast = i === pages.length - 1;
|
|
269
|
+
const hint = isLast ? "[0:ok 1:good 2:bad 3:whip]" : "[enter:next 0-3:rate]";
|
|
270
|
+
const hintPad = Math.max(0, Math.floor((INNER_WIDTH - hint.length) / 2));
|
|
271
|
+
const hintLine = " ".repeat(hintPad + 2) + hint;
|
|
272
|
+
const content = "\n\n" + lines.map((l) => ` ${l}`).join("\n") + "\n\n" + hintLine + "\n";
|
|
273
|
+
const contentLineCount = content.split("\n").length - 1;
|
|
274
|
+
const contentHeight = Math.max(contentLineCount + 2, 5);
|
|
275
|
+
if (contentHeight > maxContentHeight) maxContentHeight = contentHeight;
|
|
276
|
+
writeFileSync(`${POPUP_TMP_PREFIX}-${i}.txt`, content);
|
|
277
|
+
}
|
|
278
|
+
const whipAvailable = existsSync2(WHIP_ANIMATION_PATH);
|
|
279
|
+
if (whipAvailable && maxContentHeight < WHIP_ANIMATION_ROWS + 2) {
|
|
280
|
+
maxContentHeight = WHIP_ANIMATION_ROWS + 2;
|
|
281
|
+
}
|
|
282
|
+
const initialTitle = pages[0].title ?? defaultTitle;
|
|
283
|
+
const script = `#!/bin/sh
|
|
284
|
+
printf '\\033[?25l'
|
|
285
|
+
stty -echo 2>/dev/null
|
|
286
|
+
RESULT_FILE=${shellQuote(POPUP_RESULT_PREFIX)}
|
|
287
|
+
PAGE=0
|
|
288
|
+
TOTAL=${pages.length}
|
|
289
|
+
|
|
290
|
+
show_page() {
|
|
291
|
+
printf '\\033[2J\\033[H'
|
|
292
|
+
cat ${shellQuote(POPUP_TMP_PREFIX)}-$PAGE.txt
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
show_page
|
|
296
|
+
while IFS= read -r -n1 -t ${POPUP_DURATION} k; do
|
|
297
|
+
case "$k" in
|
|
298
|
+
0) printf 'neutral' > "$RESULT_FILE"; break ;;
|
|
299
|
+
1) printf 'good' > "$RESULT_FILE"; break ;;
|
|
300
|
+
2) printf 'bad' > "$RESULT_FILE"; break ;;
|
|
301
|
+
3) printf 'whip' > "$RESULT_FILE"
|
|
302
|
+
${whipAvailable ? `bash ${shellQuote(WHIP_ANIMATION_PATH)}` : ":"}
|
|
303
|
+
break ;;
|
|
304
|
+
c|C)
|
|
305
|
+
stty echo
|
|
306
|
+
printf '\\033[2J\\033[H> '
|
|
307
|
+
IFS= read -r -t 30 line
|
|
308
|
+
printf 'comment:%s' "$line" > "$RESULT_FILE"
|
|
309
|
+
break
|
|
310
|
+
;;
|
|
311
|
+
'')
|
|
312
|
+
PAGE=$((PAGE + 1))
|
|
313
|
+
if [ $PAGE -ge $TOTAL ]; then
|
|
314
|
+
printf 'neutral' > "$RESULT_FILE"
|
|
315
|
+
break
|
|
316
|
+
fi
|
|
317
|
+
show_page
|
|
318
|
+
;;
|
|
319
|
+
esac
|
|
320
|
+
done
|
|
321
|
+
if [ ! -f "$RESULT_FILE" ]; then
|
|
322
|
+
printf 'neutral' > "$RESULT_FILE"
|
|
323
|
+
fi
|
|
324
|
+
`;
|
|
325
|
+
writeFileSync(POPUP_SCRIPT, script, { mode: 493 });
|
|
326
|
+
try {
|
|
327
|
+
unlinkSync(POPUP_RESULT_PREFIX);
|
|
328
|
+
} catch {
|
|
329
|
+
}
|
|
330
|
+
const clientsRaw = execSafe('tmux list-clients -F "#{client_name} #{client_width}"');
|
|
331
|
+
if (!clientsRaw) return null;
|
|
332
|
+
for (const line of clientsRaw.split("\n").filter(Boolean)) {
|
|
333
|
+
const lastSpace = line.lastIndexOf(" ");
|
|
334
|
+
const client = line.slice(0, lastSpace);
|
|
335
|
+
const clientWidth = parseInt(line.slice(lastSpace + 1), 10);
|
|
336
|
+
if (!clientWidth) continue;
|
|
337
|
+
const x = Math.max(0, clientWidth - POPUP_WIDTH);
|
|
338
|
+
const args = [
|
|
339
|
+
`-c ${shellQuote(client)}`,
|
|
340
|
+
"-E -b rounded",
|
|
341
|
+
`-T ${shellQuote(initialTitle)}`,
|
|
342
|
+
`-S "fg=${moodColor}"`,
|
|
343
|
+
`-s "fg=${moodColor}"`,
|
|
344
|
+
`-x ${x} -y 0`,
|
|
345
|
+
`-w ${POPUP_WIDTH} -h ${maxContentHeight}`,
|
|
346
|
+
shellQuote(POPUP_SCRIPT)
|
|
347
|
+
].join(" ");
|
|
348
|
+
execSafe(`tmux display-popup ${args}`);
|
|
349
|
+
}
|
|
350
|
+
let raw;
|
|
351
|
+
try {
|
|
352
|
+
raw = readFileSync3(POPUP_RESULT_PREFIX, "utf8").trim();
|
|
353
|
+
} catch {
|
|
354
|
+
return null;
|
|
355
|
+
} finally {
|
|
356
|
+
try {
|
|
357
|
+
unlinkSync(POPUP_RESULT_PREFIX);
|
|
358
|
+
} catch {
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (raw.startsWith("comment:")) {
|
|
362
|
+
return { rating: "comment", comment: raw.slice("comment:".length) };
|
|
363
|
+
}
|
|
364
|
+
const validRatings = ["neutral", "good", "bad", "whip"];
|
|
365
|
+
const rating = validRatings.includes(raw) ? raw : "neutral";
|
|
366
|
+
return { rating };
|
|
367
|
+
} catch {
|
|
368
|
+
}
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// src/shared/manifest.ts
|
|
373
|
+
import os from "os";
|
|
374
|
+
function mapEffortFallback(level) {
|
|
375
|
+
if (level === void 0) return void 0;
|
|
376
|
+
if (level === "max") return "xhigh";
|
|
377
|
+
return level;
|
|
378
|
+
}
|
|
379
|
+
function resolveEffortTier(session, config) {
|
|
380
|
+
if (session.effort) return session.effort;
|
|
381
|
+
const fromConfig = mapEffortFallback(config.orchestratorEffort);
|
|
382
|
+
if (fromConfig) return fromConfig;
|
|
383
|
+
return "medium";
|
|
384
|
+
}
|
|
385
|
+
function buildManifest(args) {
|
|
386
|
+
const { session, status, config, sisyphusVersion } = args;
|
|
387
|
+
return {
|
|
388
|
+
sessionId: session.id,
|
|
389
|
+
sisyphusVersion,
|
|
390
|
+
hostname: os.hostname(),
|
|
391
|
+
platform: process.platform,
|
|
392
|
+
status,
|
|
393
|
+
completedAt: session.completedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
394
|
+
durationMs: session.activeMs,
|
|
395
|
+
wallClockMs: session.wallClockMs ?? 0,
|
|
396
|
+
model: session.model ?? config.model ?? "",
|
|
397
|
+
effortTier: resolveEffortTier(session, config),
|
|
398
|
+
cycleCount: session.orchestratorCycles.length,
|
|
399
|
+
agentCount: session.agents.length,
|
|
400
|
+
goal: session.task.slice(0, 200)
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// src/shared/upload.ts
|
|
405
|
+
import { readFile } from "fs/promises";
|
|
406
|
+
function parseWorkerError(body) {
|
|
407
|
+
try {
|
|
408
|
+
const parsed = JSON.parse(body);
|
|
409
|
+
if (parsed && typeof parsed.error === "string") return parsed.error;
|
|
410
|
+
} catch {
|
|
411
|
+
}
|
|
412
|
+
return body;
|
|
413
|
+
}
|
|
414
|
+
var UploadError = class extends Error {
|
|
415
|
+
constructor(status, rawBody) {
|
|
416
|
+
const parsed = parseWorkerError(rawBody);
|
|
417
|
+
super(`HTTP ${status}: ${parsed}`);
|
|
418
|
+
this.status = status;
|
|
419
|
+
}
|
|
420
|
+
status;
|
|
421
|
+
};
|
|
422
|
+
function isUploadConfigured(upload) {
|
|
423
|
+
return !!upload && upload.url.length > 0 && upload.token.length > 0;
|
|
424
|
+
}
|
|
425
|
+
async function uploadSession(args) {
|
|
426
|
+
const { config, zipPath, manifest } = args;
|
|
427
|
+
const formData = new FormData();
|
|
428
|
+
formData.append("manifest", new Blob([JSON.stringify(manifest)], { type: "application/json" }));
|
|
429
|
+
formData.append("bundle", new Blob([await readFile(zipPath)], { type: "application/zip" }), `${manifest.sessionId}.zip`);
|
|
430
|
+
const res = await fetch(`${config.url}/upload`, {
|
|
431
|
+
method: "POST",
|
|
432
|
+
headers: { Authorization: `Bearer ${config.token}` },
|
|
433
|
+
body: formData
|
|
434
|
+
});
|
|
435
|
+
if (!res.ok) {
|
|
436
|
+
const rawBody = await res.text();
|
|
437
|
+
const body = rawBody.length > 4096 ? rawBody.slice(0, 4096) + "\u2026 [truncated]" : rawBody;
|
|
438
|
+
throw new UploadError(res.status, body);
|
|
439
|
+
}
|
|
440
|
+
return res.json();
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// src/shared/version.ts
|
|
444
|
+
import { readFileSync as readFileSync4 } from "fs";
|
|
445
|
+
import { resolve as resolve2 } from "path";
|
|
446
|
+
function readSisyphusVersion() {
|
|
447
|
+
for (const rel of ["../package.json", "../../package.json"]) {
|
|
448
|
+
try {
|
|
449
|
+
const raw = readFileSync4(resolve2(import.meta.dirname, rel), "utf-8");
|
|
450
|
+
const pkg = JSON.parse(raw);
|
|
451
|
+
if (pkg.name === "sisyphi" && pkg.version) return pkg.version;
|
|
452
|
+
} catch {
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
return "0.0.0";
|
|
456
|
+
}
|
|
457
|
+
var cachedVersion = readSisyphusVersion();
|
|
458
|
+
function getSisyphusVersion() {
|
|
459
|
+
return cachedVersion;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
export {
|
|
463
|
+
detectProvider,
|
|
464
|
+
parseAgentFrontmatter,
|
|
465
|
+
extractAgentBody,
|
|
466
|
+
discoverAgentTypes,
|
|
467
|
+
resolveAgentConfig,
|
|
468
|
+
resolveInstalledPlugin,
|
|
469
|
+
resolveRequiredPluginDirs,
|
|
470
|
+
resolveAgentPluginDirs,
|
|
471
|
+
showCommentaryPopup,
|
|
472
|
+
showCommentaryPopupQueue,
|
|
473
|
+
buildManifest,
|
|
474
|
+
isUploadConfigured,
|
|
475
|
+
uploadSession,
|
|
476
|
+
getSisyphusVersion
|
|
477
|
+
};
|
|
478
|
+
//# sourceMappingURL=chunk-P2HHTIPM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/daemon/frontmatter.ts","../src/daemon/plugins.ts","../src/daemon/companion-popup.ts","../src/shared/manifest.ts","../src/shared/upload.ts","../src/shared/version.ts"],"sourcesContent":["import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, basename } from 'node:path';\nimport type { Provider } from '../shared/types.js';\n\nexport interface AgentTypeFrontmatter {\n name?: string;\n model?: string;\n fallbackModel?: string;\n color?: string;\n description?: string;\n skills?: string[];\n plugins?: string[];\n permissionMode?: string;\n effort?: string;\n interactive?: boolean;\n systemPrompt?: 'append' | 'replace';\n}\n\nexport { type Provider } from '../shared/types.js';\n\nexport function detectProvider(model: string | undefined): Provider {\n if (!model) return 'anthropic';\n if (/^(gpt-|codex-)/.test(model)) return 'openai';\n return 'anthropic';\n}\n\nexport function parseAgentFrontmatter(content: string): AgentTypeFrontmatter {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n const block = match[1]!;\n const fm: AgentTypeFrontmatter = {};\n\n const str = (key: string): string | undefined => {\n const m = block.match(new RegExp(`^${key}:\\\\s*(.+)$`, 'm'));\n return m ? m[1]!.trim() : undefined;\n };\n\n fm.name = str('name');\n fm.model = str('model');\n fm.fallbackModel = str('fallbackModel');\n fm.color = str('color');\n fm.description = str('description');\n fm.permissionMode = str('permissionMode');\n fm.effort = str('effort');\n\n const interactive = str('interactive');\n if (interactive === 'true') fm.interactive = true;\n\n const systemPrompt = str('systemPrompt');\n if (systemPrompt === 'append' || systemPrompt === 'replace') fm.systemPrompt = systemPrompt;\n\n // Parse YAML lists (skills, plugins)\n for (const key of ['skills', 'plugins'] as const) {\n const listMatch = block.match(new RegExp(`^${key}:\\\\s*\\\\n((?:\\\\s+-\\\\s+.+\\\\n?)*)`, 'm'));\n if (listMatch) {\n (fm as Record<string, unknown>)[key] = listMatch[1]!\n .split('\\n')\n .map(line => line.replace(/^\\s+-\\s+/, '').trim())\n .filter(Boolean);\n }\n // Also support inline YAML array: plugins: [a, b]\n const inlineMatch = block.match(new RegExp(`^${key}:\\\\s*\\\\[([^\\\\]]+)\\\\]`, 'm'));\n if (inlineMatch && !(fm as Record<string, unknown>)[key]) {\n (fm as Record<string, unknown>)[key] = inlineMatch[1]!\n .split(',')\n .map(s => s.trim())\n .filter(Boolean);\n }\n }\n\n return fm;\n}\n\nexport function extractAgentBody(content: string): string {\n const match = content.match(/^---\\n[\\s\\S]*?\\n---\\n?([\\s\\S]*)$/);\n return match ? match[1]!.trim() : content.trim();\n}\n\nfunction findPluginInstallPath(namespace: string): string | null {\n try {\n const registryPath = join(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n const registry = JSON.parse(readFileSync(registryPath, 'utf-8'));\n for (const key of Object.keys(registry)) {\n if (key.startsWith(`${namespace}@`)) {\n return registry[key].installPath ?? null;\n }\n }\n } catch {\n // File missing, parse error, or no match\n }\n return null;\n}\n\nexport function resolveAgentTypePath(agentType: string, pluginDir: string, cwd: string): string | null {\n if (!agentType) return null;\n\n let namespace: string | undefined;\n let name: string;\n\n if (agentType.includes(':')) {\n [namespace, name] = agentType.split(':', 2) as [string, string];\n } else {\n name = agentType;\n }\n\n const searchPaths: string[] = [];\n\n if (namespace) {\n // Bundled (handles sisyphus:* via pluginDir)\n searchPaths.push(join(pluginDir, 'agents', `${name}.md`));\n // Installed plugin\n const installPath = findPluginInstallPath(namespace);\n if (installPath) {\n searchPaths.push(join(installPath, 'agents', `${name}.md`));\n }\n } else {\n // Project-local\n searchPaths.push(join(cwd, '.claude', 'agents', `${name}.md`));\n // User-global\n searchPaths.push(join(homedir(), '.claude', 'agents', `${name}.md`));\n // Bundled\n searchPaths.push(join(pluginDir, 'agents', `${name}.md`));\n }\n\n for (const path of searchPaths) {\n if (existsSync(path)) return path;\n }\n\n return null;\n}\n\nexport interface DiscoveredAgentType {\n qualifiedName: string;\n source: 'bundled' | 'plugin' | 'project' | 'user';\n description?: string;\n model?: string;\n}\n\nexport function discoverAgentTypes(pluginDir: string, cwd: string): DiscoveredAgentType[] {\n const seen = new Set<string>();\n const results: DiscoveredAgentType[] = [];\n\n function scanDir(dir: string, prefix: string | null, source: DiscoveredAgentType['source']): void {\n let files: string[];\n try {\n files = readdirSync(dir);\n } catch {\n return;\n }\n for (const file of files) {\n if (!file.endsWith('.md') || file === 'CLAUDE.md') continue;\n const name = basename(file, '.md');\n const qualifiedName = prefix ? `${prefix}:${name}` : name;\n if (seen.has(qualifiedName)) continue;\n seen.add(qualifiedName);\n\n try {\n const content = readFileSync(join(dir, file), 'utf-8');\n const fm = parseAgentFrontmatter(content);\n results.push({ qualifiedName, source, description: fm.description, model: fm.model });\n } catch {\n results.push({ qualifiedName, source });\n }\n }\n }\n\n // Priority order: project > user > bundled > plugins\n scanDir(join(cwd, '.claude', 'agents'), null, 'project');\n scanDir(join(homedir(), '.claude', 'agents'), null, 'user');\n scanDir(join(pluginDir, 'agents'), 'sisyphus', 'bundled');\n\n // Installed plugins (handles v1 flat and v2 nested formats)\n try {\n const registryPath = join(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n const registry = JSON.parse(readFileSync(registryPath, 'utf-8'));\n const pluginEntries = registry.plugins ?? registry;\n for (const key of Object.keys(pluginEntries)) {\n const atIdx = key.indexOf('@');\n if (atIdx < 1) continue;\n const namespace = key.slice(0, atIdx);\n const entry = pluginEntries[key];\n const installPath = Array.isArray(entry) ? entry[0]?.installPath : entry?.installPath;\n if (installPath) {\n scanDir(join(installPath, 'agents'), namespace, 'plugin');\n }\n }\n } catch {\n // Registry missing or unparseable\n }\n\n return results;\n}\n\nexport interface ResolvedAgentConfig {\n frontmatter: AgentTypeFrontmatter;\n body: string;\n filePath: string;\n}\n\nexport function resolveAgentConfig(agentType: string, pluginDir: string, cwd: string): ResolvedAgentConfig | null {\n const filePath = resolveAgentTypePath(agentType, pluginDir, cwd);\n if (!filePath) return null;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n return {\n frontmatter: parseAgentFrontmatter(content),\n body: extractAgentBody(content),\n filePath,\n };\n } catch {\n return null;\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { loadConfig } from '../shared/config.js';\n\ninterface PluginEntry {\n scope: string;\n installPath: string;\n version: string;\n installedAt: string;\n lastUpdated: string;\n}\n\ninterface InstalledPlugins {\n version: number;\n plugins: Record<string, PluginEntry[]>;\n}\n\nfunction installedPluginsPath(): string {\n return join(homedir(), '.claude', 'plugins', 'installed_plugins.json');\n}\n\nexport function resolveInstalledPlugin(name: string): string | null {\n let data: InstalledPlugins;\n try {\n data = JSON.parse(readFileSync(installedPluginsPath(), 'utf-8'));\n } catch {\n return null;\n }\n\n const entries = data.plugins?.[name];\n if (!entries || entries.length === 0) return null;\n\n // Prefer user-scoped entry\n const userEntry = entries.find(e => e.scope === 'user');\n return (userEntry ?? entries[0])!.installPath;\n}\n\n/**\n * Auto-install a plugin if not already present.\n * key format: \"name@marketplace\" (e.g. \"termrender@crouton-kit\")\n */\nfunction ensurePluginInstalled(key: string): string | null {\n const existing = resolveInstalledPlugin(key);\n if (existing) return existing;\n\n console.log(`[sisyphus] Auto-installing plugin ${key}...`);\n try {\n execFileSync('claude', ['plugin', 'install', key], {\n stdio: 'pipe',\n timeout: 60_000,\n });\n } catch (err) {\n console.log(`[sisyphus] Warning: failed to install plugin ${key} — ${(err as Error).message}`);\n return null;\n }\n\n // Re-read registry after install\n const installed = resolveInstalledPlugin(key);\n if (!installed) {\n console.log(`[sisyphus] Warning: plugin ${key} installed but not found in registry`);\n }\n return installed;\n}\n\nexport function resolveRequiredPluginDirs(cwd: string): string[] {\n const config = loadConfig(cwd);\n const required = config.requiredPlugins;\n if (!required || required.length === 0) return [];\n\n const dirs: string[] = [];\n for (const plugin of required) {\n const key = `${plugin.name}@${plugin.marketplace}`;\n const path = ensurePluginInstalled(key);\n if (path) {\n dirs.push(path);\n } else {\n console.log(`[sisyphus] Warning: required plugin ${key} not available — skipping`);\n }\n }\n return dirs;\n}\n\n/**\n * Resolve per-agent-type plugin dirs from frontmatter `plugins` field.\n * Auto-installs missing plugins. Keys are \"name@marketplace\" strings.\n */\nexport function resolveAgentPluginDirs(plugins: string[] | undefined): string[] {\n if (!plugins || plugins.length === 0) return [];\n\n const dirs: string[] = [];\n for (const key of plugins) {\n const path = ensurePluginInstalled(key);\n if (path) {\n dirs.push(path);\n }\n }\n return dirs;\n}\n","import { writeFileSync, readFileSync, unlinkSync, existsSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join, resolve } from 'node:path';\nimport { getMoodFace, getMoodTmuxColor } from '../shared/companion-render.js';\nimport type { FeedbackRating } from '../shared/companion-types.js';\nimport { loadCompanion } from './companion.js';\nimport { loadConfig } from '../shared/config.js';\nimport { execSafe } from '../shared/exec.js';\nimport { shellQuote } from '../shared/shell.js';\n\nconst POPUP_WIDTH = 38;\nconst INNER_WIDTH = POPUP_WIDTH - 6; // 2 border + 2 padding each side\nconst POPUP_DURATION = 15;\nconst POPUP_TMP_PREFIX = join(tmpdir(), 'sisyphus-popup');\nconst POPUP_SCRIPT = join(tmpdir(), 'sisyphus-popup.sh');\nconst POPUP_RESULT_PREFIX = join(tmpdir(), 'sisyphus-popup-result');\nconst WHIP_ANIMATION_PATH = resolve(import.meta.dirname, '../templates/whip-animation.sh');\nconst WHIP_ANIMATION_ROWS = 12; // canvas height baked into whip-frames.json\n\nexport interface PopupPage {\n text: string;\n title?: string; // overrides default face title\n}\n\nfunction wrapText(text: string, width: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n for (const word of words) {\n if (current && current.length + 1 + word.length > width) {\n lines.push(current);\n current = word;\n } else {\n current = current ? `${current} ${word}` : word;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\n/** Show a single commentary popup (convenience wrapper). */\nexport function showCommentaryPopup(text: string): { rating: FeedbackRating; comment?: string } | null {\n return showCommentaryPopupQueue([{ text }]);\n}\n\n/** Show one or more popup pages in sequence. Enter advances; last Enter closes. */\nexport function showCommentaryPopupQueue(pages: PopupPage[]): { rating: FeedbackRating; comment?: string } | null {\n if (pages.length === 0) return null;\n\n try {\n const config = loadConfig(process.cwd());\n if (config.companionPopup === false) return null;\n\n const companion = loadCompanion();\n const intensity = companion.debugMood?.scores[companion.mood] ?? 0;\n const face = getMoodFace(companion.mood, intensity);\n const moodColor = getMoodTmuxColor(companion.mood);\n const defaultTitle = ` (${face}) `;\n\n let maxContentHeight = 0;\n\n // Write each page's content file\n for (let i = 0; i < pages.length; i++) {\n const lines = wrapText(pages[i].text, INNER_WIDTH);\n const isLast = i === pages.length - 1;\n const hint = isLast ? '[0:ok 1:good 2:bad 3:whip]' : '[enter:next 0-3:rate]';\n const hintPad = Math.max(0, Math.floor((INNER_WIDTH - hint.length) / 2));\n const hintLine = ' '.repeat(hintPad + 2) + hint;\n const content = '\\n\\n' + lines.map(l => ` ${l}`).join('\\n') + '\\n\\n' + hintLine + '\\n';\n const contentLineCount = content.split('\\n').length - 1; // trailing \\n artifact\n const contentHeight = Math.max(contentLineCount + 2, 5);\n if (contentHeight > maxContentHeight) maxContentHeight = contentHeight;\n writeFileSync(`${POPUP_TMP_PREFIX}-${i}.txt`, content);\n }\n\n // Popup must fit the whip animation's 12-row canvas (+2 for border) since '3:whip' is always available.\n const whipAvailable = existsSync(WHIP_ANIMATION_PATH);\n if (whipAvailable && maxContentHeight < WHIP_ANIMATION_ROWS + 2) {\n maxContentHeight = WHIP_ANIMATION_ROWS + 2;\n }\n\n const initialTitle = pages[0].title ?? defaultTitle;\n\n const script = `#!/bin/sh\nprintf '\\\\033[?25l'\nstty -echo 2>/dev/null\nRESULT_FILE=${shellQuote(POPUP_RESULT_PREFIX)}\nPAGE=0\nTOTAL=${pages.length}\n\nshow_page() {\n printf '\\\\033[2J\\\\033[H'\n cat ${shellQuote(POPUP_TMP_PREFIX)}-$PAGE.txt\n}\n\nshow_page\nwhile IFS= read -r -n1 -t ${POPUP_DURATION} k; do\n case \"$k\" in\n 0) printf 'neutral' > \"$RESULT_FILE\"; break ;;\n 1) printf 'good' > \"$RESULT_FILE\"; break ;;\n 2) printf 'bad' > \"$RESULT_FILE\"; break ;;\n 3) printf 'whip' > \"$RESULT_FILE\"\n ${whipAvailable ? `bash ${shellQuote(WHIP_ANIMATION_PATH)}` : ':'}\n break ;;\n c|C)\n stty echo\n printf '\\\\033[2J\\\\033[H> '\n IFS= read -r -t 30 line\n printf 'comment:%s' \"$line\" > \"$RESULT_FILE\"\n break\n ;;\n '')\n PAGE=$((PAGE + 1))\n if [ $PAGE -ge $TOTAL ]; then\n printf 'neutral' > \"$RESULT_FILE\"\n break\n fi\n show_page\n ;;\n esac\ndone\nif [ ! -f \"$RESULT_FILE\" ]; then\n printf 'neutral' > \"$RESULT_FILE\"\nfi\n`;\n writeFileSync(POPUP_SCRIPT, script, { mode: 0o755 });\n\n // Delete stale result file before running popups\n try { unlinkSync(POPUP_RESULT_PREFIX); } catch { /* ignore */ }\n\n // Daemon runs outside tmux — target each attached client\n const clientsRaw = execSafe('tmux list-clients -F \"#{client_name} #{client_width}\"');\n if (!clientsRaw) return null;\n for (const line of clientsRaw.split('\\n').filter(Boolean)) {\n const lastSpace = line.lastIndexOf(' ');\n const client = line.slice(0, lastSpace);\n const clientWidth = parseInt(line.slice(lastSpace + 1), 10);\n if (!clientWidth) continue;\n const x = Math.max(0, clientWidth - POPUP_WIDTH);\n const args = [\n `-c ${shellQuote(client)}`,\n '-E -b rounded',\n `-T ${shellQuote(initialTitle)}`,\n `-S \"fg=${moodColor}\"`,\n `-s \"fg=${moodColor}\"`,\n `-x ${x} -y 0`,\n `-w ${POPUP_WIDTH} -h ${maxContentHeight}`,\n shellQuote(POPUP_SCRIPT),\n ].join(' ');\n execSafe(`tmux display-popup ${args}`);\n }\n\n // Read feedback written by the last client's popup\n let raw: string;\n try {\n raw = readFileSync(POPUP_RESULT_PREFIX, 'utf8').trim();\n } catch {\n return null;\n } finally {\n try { unlinkSync(POPUP_RESULT_PREFIX); } catch { /* ignore */ }\n }\n\n if (raw.startsWith('comment:')) {\n return { rating: 'comment', comment: raw.slice('comment:'.length) };\n }\n const validRatings: FeedbackRating[] = ['neutral', 'good', 'bad', 'whip'];\n const rating = validRatings.includes(raw as FeedbackRating) ? (raw as FeedbackRating) : 'neutral';\n return { rating };\n } catch { /* non-fatal */ }\n return null;\n}\n","import os from 'node:os';\nimport type { Session } from './types.js';\nimport type { Config, EffortLevel } from './config.js';\n\nexport type ManifestStatus = 'completed' | 'failed' | 'cancelled';\nexport type ManifestEffortTier = 'low' | 'medium' | 'high' | 'xhigh';\n\nexport interface SessionManifest {\n // userId is omitted on the wire — Worker injects from token\n userId?: string;\n sessionId: string;\n sisyphusVersion: string;\n hostname: string;\n platform: NodeJS.Platform;\n status: ManifestStatus;\n completedAt: string;\n durationMs: number;\n wallClockMs: number;\n model: string;\n effortTier: ManifestEffortTier;\n cycleCount: number;\n agentCount: number;\n goal: string;\n}\n\n// 'max' is Config's wider effort level; collapse to 'xhigh' for the manifest's narrower union\nfunction mapEffortFallback(level: EffortLevel | undefined): ManifestEffortTier | undefined {\n if (level === undefined) return undefined;\n if (level === 'max') return 'xhigh';\n return level;\n}\n\nfunction resolveEffortTier(session: Session, config: Config): ManifestEffortTier {\n if (session.effort) return session.effort;\n const fromConfig = mapEffortFallback(config.orchestratorEffort);\n if (fromConfig) return fromConfig;\n return 'medium';\n}\n\nexport function buildManifest(args: {\n session: Session;\n // explicit — Session.status ('active' | 'paused' | 'completed') doesn't overlap with ManifestStatus\n status: ManifestStatus;\n config: Config;\n sisyphusVersion: string;\n}): SessionManifest {\n const { session, status, config, sisyphusVersion } = args;\n return {\n sessionId: session.id,\n sisyphusVersion,\n hostname: os.hostname(),\n platform: process.platform,\n status,\n completedAt: session.completedAt ?? new Date().toISOString(),\n durationMs: session.activeMs,\n wallClockMs: session.wallClockMs ?? 0,\n model: session.model ?? config.model ?? '',\n effortTier: resolveEffortTier(session, config),\n cycleCount: session.orchestratorCycles.length,\n agentCount: session.agents.length,\n goal: session.task.slice(0, 200),\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport type { SessionManifest } from './manifest.js';\nimport type { UploadConfig } from './config.js';\n\nexport type { UploadConfig };\n\nexport interface UploadResult {\n storageKey: string;\n userId: string;\n uploadedAt: string;\n}\n\nfunction parseWorkerError(body: string): string {\n try {\n const parsed = JSON.parse(body);\n if (parsed && typeof parsed.error === 'string') return parsed.error;\n } catch { /* fall through */ }\n return body;\n}\n\nexport class UploadError extends Error {\n constructor(public readonly status: number, rawBody: string) {\n const parsed = parseWorkerError(rawBody);\n super(`HTTP ${status}: ${parsed}`);\n }\n}\n\nexport function isUploadConfigured(upload: UploadConfig | undefined): upload is UploadConfig {\n return !!upload && upload.url.length > 0 && upload.token.length > 0;\n}\n\nexport async function uploadSession(args: {\n config: UploadConfig;\n zipPath: string;\n manifest: SessionManifest;\n}): Promise<UploadResult> {\n const { config, zipPath, manifest } = args;\n\n const formData = new FormData();\n formData.append('manifest', new Blob([JSON.stringify(manifest)], { type: 'application/json' }));\n formData.append('bundle', new Blob([await readFile(zipPath)], { type: 'application/zip' }), `${manifest.sessionId}.zip`);\n\n const res = await fetch(`${config.url}/upload`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${config.token}` },\n body: formData,\n });\n\n if (!res.ok) {\n const rawBody = await res.text();\n const body = rawBody.length > 4096 ? rawBody.slice(0, 4096) + '… [truncated]' : rawBody;\n throw new UploadError(res.status, body);\n }\n\n return res.json() as Promise<UploadResult>;\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nfunction readSisyphusVersion(): string {\n // Bundled: dist/daemon.js → ../package.json\n // Source (tsx): src/shared/version.ts → ../../package.json\n for (const rel of ['../package.json', '../../package.json']) {\n try {\n const raw = readFileSync(resolve(import.meta.dirname, rel), 'utf-8');\n const pkg = JSON.parse(raw) as { name?: string; version?: string };\n if (pkg.name === 'sisyphi' && pkg.version) return pkg.version;\n } catch {}\n }\n return '0.0.0';\n}\n\nconst cachedVersion = readSisyphusVersion();\n\nexport function getSisyphusVersion(): string {\n return cachedVersion;\n}\n"],"mappings":"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","names":["readFileSync","homedir","join","join","homedir","readFileSync","readFileSync","existsSync","join","join","existsSync","readFileSync","readFileSync","resolve"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/shared/paths.ts
|
|
4
4
|
import { homedir } from "os";
|
|
5
|
-
import { join } from "path";
|
|
5
|
+
import { basename, join } from "path";
|
|
6
6
|
function globalDir() {
|
|
7
7
|
return join(homedir(), ".sisyphus");
|
|
8
8
|
}
|
|
@@ -60,9 +60,15 @@ function roadmapPath(cwd, sessionId) {
|
|
|
60
60
|
function goalPath(cwd, sessionId) {
|
|
61
61
|
return join(sessionDir(cwd, sessionId), "goal.md");
|
|
62
62
|
}
|
|
63
|
+
function initialPromptPath(cwd, sessionId) {
|
|
64
|
+
return join(sessionDir(cwd, sessionId), "initial-prompt.md");
|
|
65
|
+
}
|
|
63
66
|
function strategyPath(cwd, sessionId) {
|
|
64
67
|
return join(sessionDir(cwd, sessionId), "strategy.md");
|
|
65
68
|
}
|
|
69
|
+
function digestPath(cwd, sessionId) {
|
|
70
|
+
return join(sessionDir(cwd, sessionId), "digest.json");
|
|
71
|
+
}
|
|
66
72
|
function logsDir(cwd, sessionId) {
|
|
67
73
|
return join(sessionDir(cwd, sessionId), "logs");
|
|
68
74
|
}
|
|
@@ -81,6 +87,66 @@ function snapshotDir(cwd, sessionId, cycle) {
|
|
|
81
87
|
function tuiScratchDir(cwd, sessionId) {
|
|
82
88
|
return join(sessionDir(cwd, sessionId), ".tui");
|
|
83
89
|
}
|
|
90
|
+
function askDir(cwd, sessionId) {
|
|
91
|
+
return join(contextDir(cwd, sessionId), "ask");
|
|
92
|
+
}
|
|
93
|
+
function askEntryDir(cwd, sessionId, askId) {
|
|
94
|
+
return join(askDir(cwd, sessionId), askId);
|
|
95
|
+
}
|
|
96
|
+
function askMetaPath(cwd, sessionId, askId) {
|
|
97
|
+
return join(askEntryDir(cwd, sessionId, askId), "meta.json");
|
|
98
|
+
}
|
|
99
|
+
function askDecisionsPath(cwd, sessionId, askId) {
|
|
100
|
+
return join(askEntryDir(cwd, sessionId, askId), "decisions.json");
|
|
101
|
+
}
|
|
102
|
+
function askOutputPath(cwd, sessionId, askId) {
|
|
103
|
+
return join(askEntryDir(cwd, sessionId, askId), "output.json");
|
|
104
|
+
}
|
|
105
|
+
function askProgressPath(cwd, sessionId, askId) {
|
|
106
|
+
return join(askEntryDir(cwd, sessionId, askId), "progress.json");
|
|
107
|
+
}
|
|
108
|
+
function askVisualsDir(cwd, sessionId, askId) {
|
|
109
|
+
return join(askEntryDir(cwd, sessionId, askId), "visuals");
|
|
110
|
+
}
|
|
111
|
+
function askVisualMarkdownPath(cwd, sessionId, askId, qid) {
|
|
112
|
+
return join(askVisualsDir(cwd, sessionId, askId), `${qid}.md`);
|
|
113
|
+
}
|
|
114
|
+
function askVisualAnsiPath(cwd, sessionId, askId, qid) {
|
|
115
|
+
return join(askVisualsDir(cwd, sessionId, askId), `${qid}.ansi`);
|
|
116
|
+
}
|
|
117
|
+
function tmuxSessionName(cwd, sessionLabel) {
|
|
118
|
+
return `ssyph_${basename(cwd)}_${sessionLabel}`;
|
|
119
|
+
}
|
|
120
|
+
function sessionsManifestPath() {
|
|
121
|
+
return join(globalDir(), "sessions-manifest.json");
|
|
122
|
+
}
|
|
123
|
+
function sessionsManifestTsvPath() {
|
|
124
|
+
return join(globalDir(), "sessions-manifest.tsv");
|
|
125
|
+
}
|
|
126
|
+
function companionPath() {
|
|
127
|
+
return join(globalDir(), "companion.json");
|
|
128
|
+
}
|
|
129
|
+
function companionMemoryPath() {
|
|
130
|
+
return join(globalDir(), "companion-memory.json");
|
|
131
|
+
}
|
|
132
|
+
function historyBaseDir() {
|
|
133
|
+
return join(globalDir(), "history");
|
|
134
|
+
}
|
|
135
|
+
function historySessionDir(sessionId) {
|
|
136
|
+
return join(historyBaseDir(), sessionId);
|
|
137
|
+
}
|
|
138
|
+
function historyEventsPath(sessionId) {
|
|
139
|
+
return join(historySessionDir(sessionId), "events.jsonl");
|
|
140
|
+
}
|
|
141
|
+
function historySessionSummaryPath(sessionId) {
|
|
142
|
+
return join(historySessionDir(sessionId), "session.json");
|
|
143
|
+
}
|
|
144
|
+
function isSisyphusSession(name) {
|
|
145
|
+
return name.startsWith("ssyph_");
|
|
146
|
+
}
|
|
147
|
+
function tmuxSessionDisplayName(name) {
|
|
148
|
+
return name.replace(/^ssyph_[^_]+_/, "");
|
|
149
|
+
}
|
|
84
150
|
|
|
85
151
|
export {
|
|
86
152
|
globalDir,
|
|
@@ -102,12 +168,34 @@ export {
|
|
|
102
168
|
contextDir,
|
|
103
169
|
roadmapPath,
|
|
104
170
|
goalPath,
|
|
171
|
+
initialPromptPath,
|
|
105
172
|
strategyPath,
|
|
173
|
+
digestPath,
|
|
106
174
|
logsDir,
|
|
107
175
|
cycleLogPath,
|
|
108
176
|
legacyLogsPath,
|
|
109
177
|
snapshotsDir,
|
|
110
178
|
snapshotDir,
|
|
111
|
-
tuiScratchDir
|
|
179
|
+
tuiScratchDir,
|
|
180
|
+
askDir,
|
|
181
|
+
askEntryDir,
|
|
182
|
+
askMetaPath,
|
|
183
|
+
askDecisionsPath,
|
|
184
|
+
askOutputPath,
|
|
185
|
+
askProgressPath,
|
|
186
|
+
askVisualsDir,
|
|
187
|
+
askVisualMarkdownPath,
|
|
188
|
+
askVisualAnsiPath,
|
|
189
|
+
tmuxSessionName,
|
|
190
|
+
sessionsManifestPath,
|
|
191
|
+
sessionsManifestTsvPath,
|
|
192
|
+
companionPath,
|
|
193
|
+
companionMemoryPath,
|
|
194
|
+
historyBaseDir,
|
|
195
|
+
historySessionDir,
|
|
196
|
+
historyEventsPath,
|
|
197
|
+
historySessionSummaryPath,
|
|
198
|
+
isSisyphusSession,
|
|
199
|
+
tmuxSessionDisplayName
|
|
112
200
|
};
|
|
113
|
-
//# sourceMappingURL=chunk-
|
|
201
|
+
//# sourceMappingURL=chunk-PNDCVKBN.js.map
|