@0xprathamesh/why-cli 1.1.1

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.
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildSkillPrompt = buildSkillPrompt;
4
+ exports.buildFailureAnalysisPrompt = buildFailureAnalysisPrompt;
5
+ exports.buildSimulationPrompt = buildSimulationPrompt;
6
+ const codebase_context_1 = require("./codebase-context");
7
+ function buildSkillPrompt(skills) {
8
+ return skills.map((skill) => `- ${skill.promptHint}`).join("\n");
9
+ }
10
+ function buildFailureAnalysisPrompt(input) {
11
+ return [
12
+ "You are an expert debugging copilot for terminal commands.",
13
+ "Return strict JSON with these keys only:",
14
+ '{"headline":"string","summary":"string","mostLikelyCause":"string","nextSteps":["string"],"guardrails":["string"],"confidence":"low|medium|high"}',
15
+ "Keep the advice concrete and based on the evidence.",
16
+ "Treat the raw command output as the primary source of truth.",
17
+ "Use the parser signals only as hints, not as authoritative labels.",
18
+ "Prefer simple, direct language with no fluff.",
19
+ "Do not wrap the JSON in markdown fences.",
20
+ "Skill guidance:",
21
+ buildSkillPrompt(input.skills) || "- Focus on practical debugging steps.",
22
+ "",
23
+ `Command: ${input.command}`,
24
+ `Family: ${input.intent.family}`,
25
+ `Action: ${input.intent.action}`,
26
+ `Risk: ${input.intent.risk}`,
27
+ `Rule-based headline: ${input.parsedError.headline}`,
28
+ `Rule-based summary: ${input.parsedError.summary}`,
29
+ `Evidence: ${input.parsedError.evidence.join(" | ") || "None"}`,
30
+ `Signals: ${input.parsedError.signals.join(" | ") || "None"}`,
31
+ `File references: ${input.parsedError.fileReferences.join(" | ") || "None"}`,
32
+ `Stack frames: ${input.parsedError.stackFrames.join(" | ") || "None"}`,
33
+ "",
34
+ "Relevant codebase context:",
35
+ (0, codebase_context_1.formatCodeContext)(input.codeContext).slice(0, 12000),
36
+ "",
37
+ "Captured output:",
38
+ `${input.stderr}\n${input.stdout}`.trim().slice(0, 10000) || "<empty>",
39
+ ].join("\n");
40
+ }
41
+ function buildSimulationPrompt(input) {
42
+ return [
43
+ "You are an expert release and debugging copilot.",
44
+ "Return strict JSON with these keys only:",
45
+ '{"headline":"string","summary":"string","mostLikelyCause":"string","nextSteps":["string"],"guardrails":["string"],"confidence":"low|medium|high"}',
46
+ "Explain what would happen if the command were executed for real, based on the simulation signals.",
47
+ "Prefer simple, direct language with no fluff.",
48
+ "Do not wrap the JSON in markdown fences.",
49
+ "Skill guidance:",
50
+ buildSkillPrompt(input.skills) || "- Focus on practical preflight guidance.",
51
+ "",
52
+ `Command: ${input.command}`,
53
+ `Family: ${input.intent.family}`,
54
+ `Action: ${input.intent.action}`,
55
+ `Risk: ${input.intent.risk}`,
56
+ `Simulation verdict: ${input.simulation.verdict}`,
57
+ `Simulation summary: ${input.simulation.summary}`,
58
+ `Simulation checks: ${input.simulation.checks.join(" | ") || "None"}`,
59
+ "",
60
+ "Simulation artifacts:",
61
+ input.simulation.artifacts.map((artifact) => `${artifact.title}: ${artifact.body}`).join("\n").slice(0, 10000) || "<empty>",
62
+ ].join("\n");
63
+ }
64
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":";;AAMA,4CAEC;AAED,gEAsCC;AAED,sDA2BC;AA5ED,yDAA2E;AAK3E,SAAgB,gBAAgB,CAAC,MAAyB;IACxD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,SAAgB,0BAA0B,CAAC,KAQ1C;IACC,OAAO;QACL,4DAA4D;QAC5D,0CAA0C;QAC1C,mJAAmJ;QACnJ,qDAAqD;QACrD,8DAA8D;QAC9D,oEAAoE;QACpE,+CAA+C;QAC/C,0CAA0C;QAC1C,iBAAiB;QACjB,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,uCAAuC;QACzE,EAAE;QACF,YAAY,KAAK,CAAC,OAAO,EAAE;QAC3B,WAAW,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;QAChC,WAAW,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;QAChC,SAAS,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;QAC5B,wBAAwB,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE;QACpD,uBAAuB,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE;QAClD,aAAa,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE;QAC/D,YAAY,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE;QAC7D,oBAAoB,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE;QAC5E,iBAAiB,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE;QACtE,EAAE;QACF,4BAA4B;QAC5B,IAAA,oCAAiB,EAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QACpD,EAAE;QACF,kBAAkB;QAClB,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS;KACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAgB,qBAAqB,CAAC,KAKrC;IACC,OAAO;QACL,kDAAkD;QAClD,0CAA0C;QAC1C,mJAAmJ;QACnJ,mGAAmG;QACnG,+CAA+C;QAC/C,0CAA0C;QAC1C,iBAAiB;QACjB,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,0CAA0C;QAC5E,EAAE;QACF,YAAY,KAAK,CAAC,OAAO,EAAE;QAC3B,WAAW,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;QAChC,WAAW,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;QAChC,SAAS,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;QAC5B,uBAAuB,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE;QACjD,uBAAuB,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE;QACjD,sBAAsB,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE;QACrE,EAAE;QACF,uBAAuB;QACvB,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS;KAC5H,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkOpenAIHealth = checkOpenAIHealth;
4
+ exports.checkOllamaHealth = checkOllamaHealth;
5
+ const env_1 = require("./env");
6
+ function createAbortSignal(timeoutMs) {
7
+ return AbortSignal.timeout(timeoutMs);
8
+ }
9
+ async function checkOpenAIHealth(options) {
10
+ const apiKey = options.apiKey ||
11
+ (options.apiKeyEnv ? process.env[options.apiKeyEnv] : undefined) ||
12
+ (0, env_1.resolveEnvAlias)(["OPENAI_API_KEY", "OPENAI_APIKEY", "OPENAIAPIKEY", "openaiapikey"]);
13
+ if (!apiKey) {
14
+ return {
15
+ provider: "openai",
16
+ configured: false,
17
+ reachable: false,
18
+ message: "No OpenAI API key was found in flags or .env.",
19
+ };
20
+ }
21
+ const baseUrl = options.openaiBaseUrl || (0, env_1.resolveEnvAlias)(["OPENAI_BASE_URL", "OPENAI_BASEURL", "openaibaseurl"]) || "https://api.openai.com/v1";
22
+ try {
23
+ const response = await fetch(`${baseUrl}/models`, {
24
+ headers: {
25
+ Authorization: `Bearer ${apiKey}`,
26
+ },
27
+ signal: createAbortSignal(4000),
28
+ });
29
+ return {
30
+ provider: "openai",
31
+ configured: true,
32
+ reachable: response.ok,
33
+ message: response.ok
34
+ ? "OpenAI credentials and endpoint look reachable."
35
+ : `OpenAI endpoint responded with status ${response.status}.`,
36
+ };
37
+ }
38
+ catch (error) {
39
+ return {
40
+ provider: "openai",
41
+ configured: true,
42
+ reachable: false,
43
+ message: `OpenAI health check failed: ${error.message}`,
44
+ };
45
+ }
46
+ }
47
+ async function checkOllamaHealth(options) {
48
+ const host = options.ollamaHost || (0, env_1.resolveEnvAlias)(["OLLAMA_HOST", "OLLAMA_URL", "ollamaurl", "ollamahost"]) || "http://127.0.0.1:11434";
49
+ try {
50
+ const response = await fetch(`${host}/api/tags`, {
51
+ signal: createAbortSignal(4000),
52
+ });
53
+ return {
54
+ provider: "ollama",
55
+ configured: true,
56
+ reachable: response.ok,
57
+ message: response.ok
58
+ ? "Ollama is reachable."
59
+ : `Ollama endpoint responded with status ${response.status}.`,
60
+ };
61
+ }
62
+ catch (error) {
63
+ return {
64
+ provider: "ollama",
65
+ configured: true,
66
+ reachable: false,
67
+ message: `Ollama health check failed: ${error.message}`,
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=provider-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-health.js","sourceRoot":"","sources":["../../src/core/provider-health.ts"],"names":[],"mappings":";;AAcA,8CAyCC;AAED,8CAwBC;AAhFD,+BAAwC;AASxC,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,OAAmB;IACzD,MAAM,MAAM,GACV,OAAO,CAAC,MAAM;QACd,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,IAAA,qBAAe,EAAC,CAAC,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;IAEvF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,+CAA+C;SACzD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,IAAI,IAAA,qBAAe,EAAC,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC,IAAI,2BAA2B,CAAC;IAEhJ,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;YAChD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,QAAQ,CAAC,EAAE;YACtB,OAAO,EAAE,QAAQ,CAAC,EAAE;gBAClB,CAAC,CAAC,iDAAiD;gBACnD,CAAC,CAAC,yCAAyC,QAAQ,CAAC,MAAM,GAAG;SAChE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,+BAAgC,KAAe,CAAC,OAAO,EAAE;SACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,OAAmB;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,IAAA,qBAAe,EAAC,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,IAAI,wBAAwB,CAAC;IAEzI,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,WAAW,EAAE;YAC/C,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;SAChC,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,QAAQ,CAAC,EAAE;YACtB,OAAO,EAAE,QAAQ,CAAC,EAAE;gBAClB,CAAC,CAAC,sBAAsB;gBACxB,CAAC,CAAC,yCAAyC,QAAQ,CAAC,MAAM,GAAG;SAChE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,+BAAgC,KAAe,CAAC,OAAO,EAAE;SACnE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runCommand = runCommand;
4
+ exports.printCommandReport = printCommandReport;
5
+ const ai_1 = require("./ai");
6
+ const codebase_context_1 = require("./codebase-context");
7
+ const error_parser_1 = require("./error-parser");
8
+ const command_intelligence_1 = require("./command-intelligence");
9
+ const error_parser_2 = require("./error-parser");
10
+ const process_1 = require("./process");
11
+ const provider_health_1 = require("./provider-health");
12
+ const skills_1 = require("./skills");
13
+ const simulation_1 = require("./simulation");
14
+ function formatDuration(durationMs) {
15
+ if (durationMs < 1000) {
16
+ return `${durationMs}ms`;
17
+ }
18
+ return `${(durationMs / 1000).toFixed(2)}s`;
19
+ }
20
+ function trimBlock(value, limit = 2400) {
21
+ const trimmed = value.trim();
22
+ if (!trimmed) {
23
+ return "";
24
+ }
25
+ if (trimmed.length <= limit) {
26
+ return trimmed;
27
+ }
28
+ return `${trimmed.slice(0, limit)}\n...`;
29
+ }
30
+ function shouldUseAI(options) {
31
+ return options.explain || options.provider !== "none";
32
+ }
33
+ function shouldStreamExecution(options, intent) {
34
+ if (options.stream !== undefined) {
35
+ return options.stream;
36
+ }
37
+ if (options.json || options.silent) {
38
+ return false;
39
+ }
40
+ return options.raw || intent.likelyLongRunning || intent.interactive;
41
+ }
42
+ async function runCommand(options, logger) {
43
+ const cwd = options.cwd ? options.cwd : process.cwd();
44
+ const intent = (0, command_intelligence_1.analyzeCommand)(options.commandArgs);
45
+ const resolvedMode = (0, command_intelligence_1.resolveExecutionMode)(options.mode, intent);
46
+ const skills = (0, skills_1.resolveSkills)(options.skills);
47
+ const providerHealth = shouldUseAI(options)
48
+ ? await Promise.all([(0, provider_health_1.checkOpenAIHealth)(options), (0, provider_health_1.checkOllamaHealth)(options)])
49
+ : undefined;
50
+ const preferredProviderHealthy = providerHealth?.some((health) => {
51
+ if (options.provider === "openai") {
52
+ return health.provider === "openai" && health.configured;
53
+ }
54
+ if (options.provider === "ollama") {
55
+ return health.provider === "ollama" && health.reachable;
56
+ }
57
+ return (health.provider === "openai" && health.configured) || (health.provider === "ollama" && health.reachable);
58
+ }) ?? false;
59
+ if (intent.unsupportedReason) {
60
+ return {
61
+ command: options.command,
62
+ cwd,
63
+ requestedMode: options.mode,
64
+ resolvedMode: "run",
65
+ intent,
66
+ parsedError: {
67
+ category: "unsupported",
68
+ headline: "Command must run in your current shell",
69
+ summary: intent.unsupportedReason,
70
+ evidence: [intent.unsupportedReason],
71
+ suggestions: ["Run this command directly in your shell instead of through why-cli."],
72
+ fileReferences: [],
73
+ stackFrames: [],
74
+ signals: ["shell-builtin"],
75
+ },
76
+ aiError: undefined,
77
+ providerHealth,
78
+ ok: false,
79
+ };
80
+ }
81
+ if (resolvedMode === "simulate") {
82
+ const simulation = await (0, simulation_1.simulateCommand)(options.commandArgs, intent, cwd);
83
+ let aiExplanation = null;
84
+ let aiError;
85
+ if (shouldUseAI(options) && preferredProviderHealthy) {
86
+ try {
87
+ aiExplanation = await (0, ai_1.explainSimulationWithAI)({
88
+ options,
89
+ command: options.command,
90
+ intent,
91
+ simulation,
92
+ skills,
93
+ });
94
+ }
95
+ catch (error) {
96
+ aiExplanation = null;
97
+ aiError = error.message;
98
+ }
99
+ }
100
+ return {
101
+ command: options.command,
102
+ cwd,
103
+ requestedMode: options.mode,
104
+ resolvedMode,
105
+ intent,
106
+ simulation,
107
+ aiExplanation,
108
+ aiError,
109
+ providerHealth,
110
+ ok: simulation.verdict === "ready",
111
+ };
112
+ }
113
+ const streamExecution = shouldStreamExecution(options, intent);
114
+ if (streamExecution && !options.raw && !options.json && !options.silent) {
115
+ logger.heading("why-cli", "Streaming live command output");
116
+ logger.badge("Command", options.command, "accent");
117
+ logger.badge("Mode", `${options.mode} -> ${resolvedMode}`, "muted");
118
+ logger.badge("Risk", `${intent.risk} (${intent.family}:${intent.action})`, "info");
119
+ logger.list(intent.reasons, "muted");
120
+ logger.section("Live Output");
121
+ }
122
+ const execution = await (0, process_1.runProcess)(options.commandArgs, {
123
+ cwd,
124
+ timeoutMs: options.timeoutMs,
125
+ streamOutput: streamExecution,
126
+ inheritStdin: streamExecution,
127
+ onStdout: streamExecution ? (chunk) => logger.rawStdout(chunk) : undefined,
128
+ onStderr: streamExecution ? (chunk) => logger.rawStderr(chunk) : undefined,
129
+ });
130
+ const parsedError = execution.signal === "SIGINT"
131
+ ? (0, error_parser_1.createInterruptedError)(options.command, execution.signal)
132
+ : execution.ok && !execution.timedOut
133
+ ? undefined
134
+ : (0, error_parser_2.parseError)(options.command, execution.stdout, execution.stderr, execution.timedOut ? -1 : execution.exitCode);
135
+ let aiExplanation = null;
136
+ let aiError;
137
+ const codeContext = parsedError ? (0, codebase_context_1.collectCodeContext)(cwd, `${execution.stderr}\n${execution.stdout}`) : [];
138
+ if (parsedError && shouldUseAI(options) && preferredProviderHealthy) {
139
+ try {
140
+ aiExplanation = await (0, ai_1.explainFailureWithAI)({
141
+ options,
142
+ command: options.command,
143
+ intent,
144
+ parsedError,
145
+ stdout: execution.stdout,
146
+ stderr: execution.stderr,
147
+ skills,
148
+ codeContext,
149
+ });
150
+ }
151
+ catch (error) {
152
+ aiExplanation = null;
153
+ aiError = error.message;
154
+ }
155
+ }
156
+ return {
157
+ command: options.command,
158
+ cwd,
159
+ requestedMode: options.mode,
160
+ resolvedMode,
161
+ intent,
162
+ execution,
163
+ parsedError,
164
+ aiExplanation,
165
+ aiError,
166
+ providerHealth,
167
+ ok: execution.ok,
168
+ };
169
+ }
170
+ function printCommandReport(session, options, logger) {
171
+ if (options.json) {
172
+ logger.printJson(session);
173
+ return;
174
+ }
175
+ if (options.raw && session.execution) {
176
+ return;
177
+ }
178
+ const streamed = session.execution?.streamedOutput ?? false;
179
+ if (streamed) {
180
+ logger.section("Summary");
181
+ }
182
+ else {
183
+ logger.heading("why-cli", session.resolvedMode === "simulate"
184
+ ? `Simulation ${session.ok ? "looks ready" : "found issues"}`
185
+ : `${session.ok ? "Command completed" : "Command failed"}${session.execution ? ` in ${formatDuration(session.execution.durationMs)}` : ""}`);
186
+ }
187
+ logger.badge("Command", session.command, "accent");
188
+ logger.badge("Mode", `${session.requestedMode} -> ${session.resolvedMode}`, "muted");
189
+ logger.badge("Intent", session.intent.intentLabel, "accent");
190
+ logger.badge("Risk", `${session.intent.risk} (${session.intent.family}:${session.intent.action})`, session.ok ? "info" : "warn");
191
+ logger.list(session.intent.reasons, "muted");
192
+ if (session.simulation) {
193
+ logger.section("Simulation");
194
+ logger.badge("Verdict", session.simulation.verdict, session.simulation.verdict === "ready" ? "success" : "warn");
195
+ logger.badge("Confidence", `${session.simulation.confidence}%`, session.simulation.confidence >= 80 ? "success" : "info");
196
+ logger.line(session.simulation.summary);
197
+ logger.list(session.simulation.checks, "info");
198
+ for (const artifact of session.simulation.artifacts) {
199
+ logger.block(artifact.title, trimBlock(artifact.body, 1800), "muted");
200
+ }
201
+ }
202
+ if (session.execution) {
203
+ logger.badge("Status", session.execution.ok
204
+ ? `success in ${formatDuration(session.execution.durationMs)}`
205
+ : `exit ${session.execution.exitCode ?? "unknown"}${session.execution.signal ? ` (${session.execution.signal})` : ""}`, session.execution.ok ? "success" : "error");
206
+ if (session.execution.ok) {
207
+ if (session.execution.streamedOutput) {
208
+ return;
209
+ }
210
+ const body = trimBlock(session.execution.stdout, 2600);
211
+ if (body) {
212
+ logger.section("Output");
213
+ logger.line(body);
214
+ }
215
+ }
216
+ else if (session.parsedError) {
217
+ logger.section(session.parsedError.headline);
218
+ logger.line(session.parsedError.summary);
219
+ logger.list(session.parsedError.evidence.map((item) => `Evidence: ${item}`), "warn");
220
+ const fallbackSuggestions = session.aiExplanation
221
+ ? session.parsedError.suggestions.slice(0, 1)
222
+ : session.parsedError.suggestions;
223
+ logger.list(fallbackSuggestions.map((item) => `Try: ${item}`), "info");
224
+ }
225
+ const capturedOutput = trimBlock(session.execution.stderr || session.execution.stdout, 2200);
226
+ if (!session.execution.ok && capturedOutput && !session.execution.streamedOutput) {
227
+ logger.section("Captured Output");
228
+ logger.line(capturedOutput);
229
+ }
230
+ }
231
+ if (!session.execution && session.parsedError) {
232
+ logger.section(session.parsedError.headline);
233
+ logger.line(session.parsedError.summary);
234
+ logger.list(session.parsedError.suggestions.map((item) => `Try: ${item}`), "info");
235
+ }
236
+ if (session.aiExplanation) {
237
+ logger.section(session.aiExplanation.headline);
238
+ logger.badge("AI", `${session.aiExplanation.provider}:${session.aiExplanation.model} (${session.aiExplanation.confidence})`, "accent");
239
+ logger.line(session.aiExplanation.summary);
240
+ if (session.aiExplanation.mostLikelyCause) {
241
+ logger.section("Most Likely Cause");
242
+ logger.line(session.aiExplanation.mostLikelyCause);
243
+ }
244
+ if (session.aiExplanation.nextSteps.length > 0) {
245
+ logger.section("Next Steps");
246
+ logger.list(session.aiExplanation.nextSteps, "info");
247
+ }
248
+ if (session.aiExplanation.guardrails.length > 0) {
249
+ logger.section("Guardrails");
250
+ logger.list(session.aiExplanation.guardrails, "warn");
251
+ }
252
+ }
253
+ else if (session.aiError) {
254
+ logger.section("AI");
255
+ logger.line(`AI explanation failed: ${session.aiError}`);
256
+ }
257
+ else if (shouldUseAI(options)) {
258
+ logger.section("AI");
259
+ logger.line("No AI narration was generated. Configure OpenAI credentials or make sure a local Ollama server is running.");
260
+ }
261
+ if (session.providerHealth && session.providerHealth.length > 0) {
262
+ logger.section("Provider Health");
263
+ logger.list(session.providerHealth.map((health) => `${health.provider}: ${health.configured ? "configured" : "missing config"}, ${health.reachable ? "reachable" : "not reachable"} - ${health.message}`), "muted");
264
+ }
265
+ }
266
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":";;AAiEA,gCAwIC;AAED,gDAwHC;AAlUD,6BAAwG;AACxG,yDAAwD;AACxD,iDAAwD;AACxD,iEAA4G;AAC5G,iDAAyD;AACzD,uCAAyD;AACzD,uDAAyF;AACzF,qCAAyC;AACzC,6CAAiE;AAmBjE,SAAS,cAAc,CAAC,UAAkB;IACxC,IAAI,UAAU,GAAG,IAAI,EAAE,CAAC;QACtB,OAAO,GAAG,UAAU,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAK,GAAG,IAAI;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,OAAmB;IACtC,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC;AACxD,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAmB,EAAE,MAAqB;IACvE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,WAAW,CAAC;AACvE,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,OAAmB,EAAE,MAAc;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,IAAA,qCAAc,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAA,2CAAoB,EAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,IAAA,sBAAa,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC;QACzC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAA,mCAAiB,EAAC,OAAO,CAAC,EAAE,IAAA,mCAAiB,EAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,wBAAwB,GAC5B,cAAc,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC;QAC3D,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;IACnH,CAAC,CAAC,IAAI,KAAK,CAAC;IAEd,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG;YACH,aAAa,EAAE,OAAO,CAAC,IAAI;YAC3B,YAAY,EAAE,KAAK;YACnB,MAAM;YACN,WAAW,EAAE;gBACX,QAAQ,EAAE,aAAa;gBACvB,QAAQ,EAAE,wCAAwC;gBAClD,OAAO,EAAE,MAAM,CAAC,iBAAiB;gBACjC,QAAQ,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACpC,WAAW,EAAE,CAAC,qEAAqE,CAAC;gBACpF,cAAc,EAAE,EAAE;gBAClB,WAAW,EAAE,EAAE;gBACf,OAAO,EAAE,CAAC,eAAe,CAAC;aAC3B;YACD,OAAO,EAAE,SAAS;YAClB,cAAc;YACd,EAAE,EAAE,KAAK;SACV,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,IAAA,4BAAe,EAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3E,IAAI,aAAa,GAAyB,IAAI,CAAC;QAC/C,IAAI,OAA2B,CAAC;QAEhC,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,wBAAwB,EAAE,CAAC;YACrD,IAAI,CAAC;gBACH,aAAa,GAAG,MAAM,IAAA,4BAAuB,EAAC;oBAC5C,OAAO;oBACP,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM;oBACN,UAAU;oBACV,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO,GAAI,KAAe,CAAC,OAAO,CAAC;YACrC,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG;YACH,aAAa,EAAE,OAAO,CAAC,IAAI;YAC3B,YAAY;YACZ,MAAM;YACN,UAAU;YACV,aAAa;YACb,OAAO;YACP,cAAc;YACd,EAAE,EAAE,UAAU,CAAC,OAAO,KAAK,OAAO;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,IAAI,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,MAAM,CAAC,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,oBAAU,EAAC,OAAO,CAAC,WAAW,EAAE;QACtD,GAAG;QACH,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY,EAAE,eAAe;QAC7B,YAAY,EAAE,eAAe;QAC7B,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1E,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KAC3E,CAAC,CAAC;IAEH,MAAM,WAAW,GACf,SAAS,CAAC,MAAM,KAAK,QAAQ;QAC3B,CAAC,CAAC,IAAA,qCAAsB,EAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC;QAC3D,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;YACrC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAA,yBAAU,EAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpH,IAAI,aAAa,GAAyB,IAAI,CAAC;IAC/C,IAAI,OAA2B,CAAC;IAChC,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAA,qCAAkB,EAAC,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3G,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,wBAAwB,EAAE,CAAC;QACpE,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,IAAA,yBAAoB,EAAC;gBACzC,OAAO;gBACP,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM;gBACN,WAAW;gBACX,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,MAAM;gBACN,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,GAAG,IAAI,CAAC;YACrB,OAAO,GAAI,KAAe,CAAC,OAAO,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG;QACH,aAAa,EAAE,OAAO,CAAC,IAAI;QAC3B,YAAY;QACZ,MAAM;QACN,SAAS;QACT,WAAW;QACX,aAAa;QACb,OAAO;QACP,cAAc;QACd,EAAE,EAAE,SAAS,CAAC,EAAE;KACjB,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAuB,EAAE,OAAmB,EAAE,MAAc;IAC7F,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,IAAI,KAAK,CAAC;IAC5D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CACZ,SAAS,EACT,OAAO,CAAC,YAAY,KAAK,UAAU;YACjC,CAAC,CAAC,cAAc,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,EAAE;YAC7D,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,GACpD,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAC9E,EAAE,CACP,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,OAAO,OAAO,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjH,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1H,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE/C,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CACV,QAAQ,EACR,OAAO,CAAC,SAAS,CAAC,EAAE;YAClB,CAAC,CAAC,cAAc,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YAC9D,CAAC,CAAC,QAAQ,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EACxH,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAC3C,CAAC;QAEF,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YACzB,IAAI,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YACrF,MAAM,mBAAmB,GAAG,OAAO,CAAC,aAAa;gBAC/C,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7C,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7F,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,cAAc,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YACjF,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,KAAK,OAAO,CAAC,aAAa,CAAC,UAAU,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;SAAM,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,4GAA4G,CAAC,CAAC;IAC5H,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CACT,OAAO,CAAC,cAAc,CAAC,GAAG,CACxB,CAAC,MAAM,EAAE,EAAE,CACT,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,KACxE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eACnC,MAAM,MAAM,CAAC,OAAO,EAAE,CACzB,EACD,OAAO,CACR,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runSetup = runSetup;
7
+ const promises_1 = __importDefault(require("readline/promises"));
8
+ const process_1 = require("process");
9
+ const env_1 = require("./env");
10
+ function maskSecret(value) {
11
+ if (!value) {
12
+ return "(empty)";
13
+ }
14
+ if (value.length <= 6) {
15
+ return "*".repeat(value.length);
16
+ }
17
+ return `${value.slice(0, 3)}...${value.slice(-3)}`;
18
+ }
19
+ function cowLogo(color = true) {
20
+ const cyan = color ? "\x1b[36m" : "";
21
+ const yellow = color ? "\x1b[33m" : "";
22
+ const reset = color ? "\x1b[0m" : "";
23
+ return [
24
+ `${cyan} ______________________________ ${reset}`,
25
+ `${cyan}< why-cli setup: ship it fast >${reset}`,
26
+ `${cyan} ------------------------------ ${reset}`,
27
+ `${yellow} \\ ^__^${reset}`,
28
+ `${yellow} \\ (oo)\\_______${reset}`,
29
+ `${yellow} (__)\\ )\\/\\\\${reset}`,
30
+ `${yellow} ||----w |${reset}`,
31
+ `${yellow} || ||${reset}`,
32
+ ].join("\n");
33
+ }
34
+ async function askWithDefault(rl, question, fallback) {
35
+ const answer = (await rl.question(`${question} [${fallback}]: `)).trim();
36
+ return answer || fallback;
37
+ }
38
+ async function runSetup(options, logger) {
39
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
40
+ throw new Error("`why --setup` requires an interactive terminal.");
41
+ }
42
+ logger.line(cowLogo(options.color));
43
+ logger.heading("why-cli setup", `This will save defaults to ${(0, env_1.getGlobalEnvPath)()}`);
44
+ const rl = promises_1.default.createInterface({ input: process_1.stdin, output: process_1.stdout });
45
+ try {
46
+ const defaultProvider = (0, env_1.resolveEnvAlias)(["WHY_PROVIDER"]) ??
47
+ ((0, env_1.resolveEnvAlias)(["OPENAI_API_KEY", "OPENAI_APIKEY", "OPENAIAPIKEY", "openaiapikey"]) ? "openai" : "ollama");
48
+ const provider = (await askWithDefault(rl, "Provider (auto/openai/ollama/none)", defaultProvider ?? "ollama"));
49
+ const openaiApiKey = provider === "openai" || provider === "auto"
50
+ ? await askWithDefault(rl, "OpenAI API key", (0, env_1.resolveEnvAlias)(["OPENAI_API_KEY", "OPENAI_APIKEY", "OPENAIAPIKEY", "openaiapikey"]) ?? "")
51
+ : "";
52
+ const openaiModel = await askWithDefault(rl, "OpenAI model", (0, env_1.resolveEnvAlias)(["OPENAI_MODEL", "openaimodel"]) ?? "gpt-4.1");
53
+ const openaiBaseUrl = await askWithDefault(rl, "OpenAI base URL", (0, env_1.resolveEnvAlias)(["OPENAI_BASE_URL", "OPENAI_BASEURL", "openaibaseurl"]) ?? "https://api.openai.com/v1");
54
+ const ollamaHost = await askWithDefault(rl, "Ollama host", (0, env_1.resolveEnvAlias)(["OLLAMA_HOST", "OLLAMA_URL", "ollamaurl", "ollamahost"]) ?? "http://127.0.0.1:11434");
55
+ const ollamaModel = await askWithDefault(rl, "Ollama model", (0, env_1.resolveEnvAlias)(["OLLAMA_MODEL", "ollamamodel"]) ?? "gemma3:4b");
56
+ const skill = await askWithDefault(rl, "Default skills (comma separated)", (0, env_1.resolveEnvAlias)(["WHY_SKILL"]) ?? "debug,fix");
57
+ const filePath = (0, env_1.writeGlobalConfig)({
58
+ provider,
59
+ openaiApiKey,
60
+ openaiModel,
61
+ openaiBaseUrl,
62
+ ollamaHost,
63
+ ollamaModel,
64
+ skill,
65
+ });
66
+ logger.section("Saved");
67
+ logger.list([
68
+ `config file: ${filePath}`,
69
+ `provider: ${provider}`,
70
+ `openai key: ${maskSecret(openaiApiKey)}`,
71
+ `openai model: ${openaiModel}`,
72
+ `ollama host: ${ollamaHost}`,
73
+ `ollama model: ${ollamaModel}`,
74
+ `default skills: ${skill}`,
75
+ ], "success");
76
+ logger.line("Run `why --doctor` next to verify the saved provider setup.");
77
+ }
78
+ finally {
79
+ rl.close();
80
+ }
81
+ }
82
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/core/setup.ts"],"names":[],"mappings":"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"}