openshell-ai 1.0.4
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/LICENSE +21 -0
- package/README.md +354 -0
- package/dist/analytics/client.d.ts +2 -0
- package/dist/analytics/client.js +95 -0
- package/dist/analytics/client.js.map +1 -0
- package/dist/analytics/session.d.ts +15 -0
- package/dist/analytics/session.js +70 -0
- package/dist/analytics/session.js.map +1 -0
- package/dist/cli/commands.d.ts +14 -0
- package/dist/cli/commands.js +265 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +2 -0
- package/dist/cli/prompts.js +32 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/repl.d.ts +12 -0
- package/dist/cli/repl.js +184 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/config/configurator.d.ts +18 -0
- package/dist/config/configurator.js +133 -0
- package/dist/config/configurator.js.map +1 -0
- package/dist/config/env.d.ts +2 -0
- package/dist/config/env.js +8 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/providerCatalog.d.ts +8 -0
- package/dist/config/providerCatalog.js +33 -0
- package/dist/config/providerCatalog.js.map +1 -0
- package/dist/config/userConfig.d.ts +12 -0
- package/dist/config/userConfig.js +141 -0
- package/dist/config/userConfig.js.map +1 -0
- package/dist/core/explainCommand.d.ts +2 -0
- package/dist/core/explainCommand.js +4 -0
- package/dist/core/explainCommand.js.map +1 -0
- package/dist/core/generateCommand.d.ts +2 -0
- package/dist/core/generateCommand.js +34 -0
- package/dist/core/generateCommand.js.map +1 -0
- package/dist/core/output.d.ts +4 -0
- package/dist/core/output.js +67 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/prompts.d.ts +8 -0
- package/dist/core/prompts.js +75 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/response.d.ts +19 -0
- package/dist/core/response.js +44 -0
- package/dist/core/response.js.map +1 -0
- package/dist/core/session.d.ts +9 -0
- package/dist/core/session.js +23 -0
- package/dist/core/session.js.map +1 -0
- package/dist/exec/runCommand.d.ts +11 -0
- package/dist/exec/runCommand.js +57 -0
- package/dist/exec/runCommand.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/platform/detectPlatform.d.ts +9 -0
- package/dist/platform/detectPlatform.js +49 -0
- package/dist/platform/detectPlatform.js.map +1 -0
- package/dist/platform/detectServiceManager.d.ts +3 -0
- package/dist/platform/detectServiceManager.js +38 -0
- package/dist/platform/detectServiceManager.js.map +1 -0
- package/dist/platform/detectShell.d.ts +3 -0
- package/dist/platform/detectShell.js +21 -0
- package/dist/platform/detectShell.js.map +1 -0
- package/dist/providers/anthropic.d.ts +8 -0
- package/dist/providers/anthropic.js +67 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/factory.d.ts +2 -0
- package/dist/providers/factory.js +24 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/google.d.ts +8 -0
- package/dist/providers/google.js +76 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/ollama.d.ts +8 -0
- package/dist/providers/ollama.js +67 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +8 -0
- package/dist/providers/openai.js +77 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/safety/classifyRisk.d.ts +7 -0
- package/dist/safety/classifyRisk.js +115 -0
- package/dist/safety/classifyRisk.js.map +1 -0
- package/dist/safety/dangerousPatterns.d.ts +8 -0
- package/dist/safety/dangerousPatterns.js +70 -0
- package/dist/safety/dangerousPatterns.js.map +1 -0
- package/dist/safety/executionPolicy.d.ts +9 -0
- package/dist/safety/executionPolicy.js +21 -0
- package/dist/safety/executionPolicy.js.map +1 -0
- package/dist/types/index.d.ts +105 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/branding.d.ts +6 -0
- package/dist/utils/branding.js +16 -0
- package/dist/utils/branding.js.map +1 -0
- package/dist/utils/errors.d.ts +26 -0
- package/dist/utils/errors.js +59 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/strings.d.ts +5 -0
- package/dist/utils/strings.js +30 -0
- package/dist/utils/strings.js.map +1 -0
- package/dist/workspace/inspectWorkspace.d.ts +1 -0
- package/dist/workspace/inspectWorkspace.js +174 -0
- package/dist/workspace/inspectWorkspace.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import clipboardy from "clipboardy";
|
|
2
|
+
import { Command, Option } from "commander";
|
|
3
|
+
import { createAnalyticsClient as createDefaultAnalyticsClient } from "../analytics/client.js";
|
|
4
|
+
import { startRepl } from "./repl.js";
|
|
5
|
+
import { createPromptAdapter } from "./prompts.js";
|
|
6
|
+
import { loadOrConfigureConfig } from "../config/configurator.js";
|
|
7
|
+
import { generateCommand } from "../core/generateCommand.js";
|
|
8
|
+
import { formatSuggestion } from "../core/output.js";
|
|
9
|
+
import { runCommand } from "../exec/runCommand.js";
|
|
10
|
+
import { detectPlatformContext } from "../platform/detectPlatform.js";
|
|
11
|
+
import { createProvider } from "../providers/factory.js";
|
|
12
|
+
import { assessCommandRisk } from "../safety/classifyRisk.js";
|
|
13
|
+
import { enforceExecutionPolicy } from "../safety/executionPolicy.js";
|
|
14
|
+
import { ClipboardError, ConfigurationError, ExecutionPolicyError, UserCancelledError, getErrorMessage } from "../utils/errors.js";
|
|
15
|
+
import { formatVersionBanner } from "../utils/branding.js";
|
|
16
|
+
import { Logger } from "../utils/logger.js";
|
|
17
|
+
import { inspectWorkspace } from "../workspace/inspectWorkspace.js";
|
|
18
|
+
export function createDefaultDependencies() {
|
|
19
|
+
return {
|
|
20
|
+
loadConfig: () => loadOrConfigureConfig(),
|
|
21
|
+
detectPlatformContext,
|
|
22
|
+
createProvider,
|
|
23
|
+
createAnalyticsClient: createDefaultAnalyticsClient,
|
|
24
|
+
createPromptAdapter,
|
|
25
|
+
copyToClipboard: async (command) => {
|
|
26
|
+
try {
|
|
27
|
+
await clipboardy.write(command);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw new ClipboardError("Clipboard unavailable. Command printed below instead.", error);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
commandRunner: runCommand
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function normalizeCliOptions(rawOptions) {
|
|
37
|
+
const options = {
|
|
38
|
+
exec: Boolean(rawOptions.exec),
|
|
39
|
+
yes: Boolean(rawOptions.yes),
|
|
40
|
+
explain: Boolean(rawOptions.explain),
|
|
41
|
+
json: Boolean(rawOptions.json),
|
|
42
|
+
version: Boolean(rawOptions.version),
|
|
43
|
+
noColor: rawOptions.color === false,
|
|
44
|
+
debug: Boolean(rawOptions.debug),
|
|
45
|
+
copy: Boolean(rawOptions.copy)
|
|
46
|
+
};
|
|
47
|
+
if (rawOptions.shell === "bash" ||
|
|
48
|
+
rawOptions.shell === "zsh" ||
|
|
49
|
+
rawOptions.shell === "sh") {
|
|
50
|
+
options.shell = rawOptions.shell;
|
|
51
|
+
}
|
|
52
|
+
return options;
|
|
53
|
+
}
|
|
54
|
+
function ensureInteractiveFlagsAreValid(options) {
|
|
55
|
+
if (options.json || options.exec || options.yes || options.copy) {
|
|
56
|
+
throw new ConfigurationError("--json, --exec, --yes, and --copy require a question in one-shot mode.");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function shouldReportError(error) {
|
|
60
|
+
return !(error instanceof UserCancelledError || error instanceof ExecutionPolicyError);
|
|
61
|
+
}
|
|
62
|
+
async function prepareRuntime(options, deps, mode) {
|
|
63
|
+
const config = await deps.loadConfig();
|
|
64
|
+
const platform = await deps.detectPlatformContext();
|
|
65
|
+
const effectivePlatform = options.shell
|
|
66
|
+
? { ...platform, shell: options.shell }
|
|
67
|
+
: platform;
|
|
68
|
+
const provider = deps.createProvider(config);
|
|
69
|
+
const analytics = deps.createAnalyticsClient(config);
|
|
70
|
+
const workspaceContext = await inspectWorkspace(effectivePlatform.cwd);
|
|
71
|
+
await analytics.trackCliStart({
|
|
72
|
+
os: effectivePlatform.os,
|
|
73
|
+
shell: effectivePlatform.shell,
|
|
74
|
+
provider: config.provider,
|
|
75
|
+
mode
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
config,
|
|
79
|
+
effectivePlatform,
|
|
80
|
+
provider,
|
|
81
|
+
analytics,
|
|
82
|
+
...(workspaceContext ? { workspaceContext } : {})
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function writeJsonWithExecution(suggestion, execution) {
|
|
86
|
+
process.stdout.write(`${JSON.stringify({
|
|
87
|
+
question: suggestion.question,
|
|
88
|
+
command: suggestion.command,
|
|
89
|
+
explanation: suggestion.explanation,
|
|
90
|
+
risk: suggestion.risk,
|
|
91
|
+
platformNotes: suggestion.platformNotes,
|
|
92
|
+
assumptions: suggestion.assumptions,
|
|
93
|
+
platform: suggestion.platform,
|
|
94
|
+
execution
|
|
95
|
+
}, null, 2)}\n`);
|
|
96
|
+
}
|
|
97
|
+
async function handleOneShot(question, options, deps, runtime) {
|
|
98
|
+
const logger = new Logger(options.debug);
|
|
99
|
+
try {
|
|
100
|
+
if (options.exec && runtime.effectivePlatform.os === "unsupported") {
|
|
101
|
+
throw new ConfigurationError("Execution is disabled on unsupported host OSes. Use a Unix-like shell or WSL.");
|
|
102
|
+
}
|
|
103
|
+
logger.debug("Using platform context", runtime.effectivePlatform);
|
|
104
|
+
logger.debug("Using provider", {
|
|
105
|
+
provider: runtime.config.provider,
|
|
106
|
+
model: runtime.config.model,
|
|
107
|
+
baseUrl: runtime.config.baseUrl
|
|
108
|
+
});
|
|
109
|
+
await runtime.analytics.trackPromptSent({
|
|
110
|
+
os: runtime.effectivePlatform.os,
|
|
111
|
+
shell: runtime.effectivePlatform.shell,
|
|
112
|
+
provider: runtime.config.provider,
|
|
113
|
+
mode: "one-shot"
|
|
114
|
+
});
|
|
115
|
+
const suggestion = await generateCommand({
|
|
116
|
+
question,
|
|
117
|
+
platform: runtime.effectivePlatform,
|
|
118
|
+
provider: runtime.provider,
|
|
119
|
+
explainRequested: true,
|
|
120
|
+
...(runtime.workspaceContext
|
|
121
|
+
? { workspaceContext: runtime.workspaceContext }
|
|
122
|
+
: {})
|
|
123
|
+
});
|
|
124
|
+
let execution;
|
|
125
|
+
if (options.json) {
|
|
126
|
+
if (options.copy) {
|
|
127
|
+
try {
|
|
128
|
+
await deps.copyToClipboard(suggestion.command);
|
|
129
|
+
process.stderr.write("Command copied to clipboard.\n");
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (error instanceof ClipboardError) {
|
|
133
|
+
process.stderr.write(`${error.message}\n${suggestion.command}\n`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (options.exec) {
|
|
141
|
+
const assessment = assessCommandRisk(suggestion.command);
|
|
142
|
+
await enforceExecutionPolicy({
|
|
143
|
+
command: suggestion.command,
|
|
144
|
+
risk: assessment.level,
|
|
145
|
+
yes: options.yes,
|
|
146
|
+
prompt: deps.createPromptAdapter(),
|
|
147
|
+
...(assessment.reasons[0] ? { reason: assessment.reasons[0] } : {})
|
|
148
|
+
});
|
|
149
|
+
execution = await deps.commandRunner(suggestion.command, {
|
|
150
|
+
cwd: runtime.effectivePlatform.cwd,
|
|
151
|
+
stdio: "pipe"
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
writeJsonWithExecution(suggestion, execution);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
process.stdout.write(`${formatSuggestion(suggestion, {
|
|
158
|
+
color: !options.noColor,
|
|
159
|
+
explain: true,
|
|
160
|
+
json: false
|
|
161
|
+
})}\n`);
|
|
162
|
+
if (options.copy) {
|
|
163
|
+
try {
|
|
164
|
+
await deps.copyToClipboard(suggestion.command);
|
|
165
|
+
process.stderr.write("Command copied to clipboard.\n");
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (error instanceof ClipboardError) {
|
|
169
|
+
process.stderr.write(`${error.message}\n${suggestion.command}\n`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!options.exec) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const assessment = assessCommandRisk(suggestion.command);
|
|
180
|
+
await enforceExecutionPolicy({
|
|
181
|
+
command: suggestion.command,
|
|
182
|
+
risk: assessment.level,
|
|
183
|
+
yes: options.yes,
|
|
184
|
+
prompt: deps.createPromptAdapter(),
|
|
185
|
+
...(assessment.reasons[0] ? { reason: assessment.reasons[0] } : {})
|
|
186
|
+
});
|
|
187
|
+
await deps.commandRunner(suggestion.command, {
|
|
188
|
+
cwd: runtime.effectivePlatform.cwd,
|
|
189
|
+
stdio: "inherit"
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
if (shouldReportError(error)) {
|
|
194
|
+
await runtime.analytics.trackError({
|
|
195
|
+
prompt: question,
|
|
196
|
+
os: runtime.effectivePlatform.os,
|
|
197
|
+
shell: runtime.effectivePlatform.shell,
|
|
198
|
+
provider: runtime.config.provider,
|
|
199
|
+
message: getErrorMessage(error),
|
|
200
|
+
time: new Date().toISOString(),
|
|
201
|
+
...(error instanceof Error ? { code: error.name } : {})
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export async function runCli(argv = process.argv, dependencies = createDefaultDependencies()) {
|
|
208
|
+
const program = new Command();
|
|
209
|
+
program
|
|
210
|
+
.name("ai")
|
|
211
|
+
.description("Natural-language shell command generation with safe execution.")
|
|
212
|
+
.argument("[question...]", "Question to turn into a shell command")
|
|
213
|
+
.option("--exec", "Execute the generated command after confirmation")
|
|
214
|
+
.option("--yes", "Skip the standard confirmation prompt for low/medium-risk commands")
|
|
215
|
+
.option("--explain", "Show the explanation alongside the generated command")
|
|
216
|
+
.option("--json", "Emit machine-readable JSON")
|
|
217
|
+
.addOption(new Option("--shell <shell>", "Shell hint for command generation").choices(["bash", "zsh", "sh"]))
|
|
218
|
+
.option("-v, --version", "Show branded version information")
|
|
219
|
+
.option("--copy", "Copy the generated command to the clipboard")
|
|
220
|
+
.option("--no-color", "Disable colored output")
|
|
221
|
+
.option("--debug", "Print internal diagnostics")
|
|
222
|
+
.action(async (questionParts, rawOptions) => {
|
|
223
|
+
const options = normalizeCliOptions(rawOptions);
|
|
224
|
+
const question = questionParts.join(" ").trim();
|
|
225
|
+
if (options.version) {
|
|
226
|
+
process.stdout.write(`${formatVersionBanner()}\n`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (options.yes && !options.exec) {
|
|
230
|
+
throw new ConfigurationError("--yes can only be used together with --exec.");
|
|
231
|
+
}
|
|
232
|
+
if (!question) {
|
|
233
|
+
ensureInteractiveFlagsAreValid(options);
|
|
234
|
+
const logger = new Logger(options.debug);
|
|
235
|
+
const runtime = await prepareRuntime(options, dependencies, "interactive");
|
|
236
|
+
await startRepl({
|
|
237
|
+
platform: runtime.effectivePlatform,
|
|
238
|
+
provider: runtime.provider,
|
|
239
|
+
providerName: runtime.config.provider,
|
|
240
|
+
prompt: dependencies.createPromptAdapter(),
|
|
241
|
+
analytics: runtime.analytics,
|
|
242
|
+
...(runtime.workspaceContext
|
|
243
|
+
? { workspaceContext: runtime.workspaceContext }
|
|
244
|
+
: {}),
|
|
245
|
+
color: !options.noColor,
|
|
246
|
+
logger
|
|
247
|
+
});
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const runtime = await prepareRuntime(options, dependencies, "one-shot");
|
|
251
|
+
await handleOneShot(question, options, dependencies, runtime);
|
|
252
|
+
});
|
|
253
|
+
await program.parseAsync(argv);
|
|
254
|
+
}
|
|
255
|
+
export async function runCliAndHandleErrors(argv = process.argv, dependencies = createDefaultDependencies()) {
|
|
256
|
+
try {
|
|
257
|
+
await runCli(argv, dependencies);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
const debug = argv.includes("--debug") || argv.includes("-d");
|
|
261
|
+
process.stderr.write(`${getErrorMessage(error, debug)}\n`);
|
|
262
|
+
process.exitCode = 1;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import prompts from "prompts";
|
|
2
|
+
import { UserCancelledError } from "../utils/errors.js";
|
|
3
|
+
export function createPromptAdapter() {
|
|
4
|
+
return {
|
|
5
|
+
async confirm(message, initial = false) {
|
|
6
|
+
const response = await prompts({
|
|
7
|
+
type: "confirm",
|
|
8
|
+
name: "value",
|
|
9
|
+
message,
|
|
10
|
+
initial
|
|
11
|
+
}, {
|
|
12
|
+
onCancel: () => {
|
|
13
|
+
throw new UserCancelledError("Command execution cancelled.");
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
return Boolean(response.value);
|
|
17
|
+
},
|
|
18
|
+
async text(message) {
|
|
19
|
+
const response = await prompts({
|
|
20
|
+
type: "text",
|
|
21
|
+
name: "value",
|
|
22
|
+
message
|
|
23
|
+
}, {
|
|
24
|
+
onCancel: () => {
|
|
25
|
+
throw new UserCancelledError("Command execution cancelled.");
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return String(response.value ?? "");
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/cli/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAO,GAAG,KAAK;YAC5C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO;gBACb,OAAO;gBACP,OAAO;aACR,EACD;gBACE,QAAQ,EAAE,GAAG,EAAE;oBACb,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;gBAC/D,CAAC;aACF,CACF,CAAC;YAEF,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;gBACb,OAAO;aACR,EACD;gBACE,QAAQ,EAAE,GAAG,EAAE;oBACb,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;gBAC/D,CAAC;aACF,CACF,CAAC;YAEF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AIProvider, AnalyticsClient, PlatformContext, ProviderName, PromptAdapter } from "../types/index.js";
|
|
2
|
+
import type { Logger } from "../utils/logger.js";
|
|
3
|
+
export declare function startRepl(options: {
|
|
4
|
+
platform: PlatformContext;
|
|
5
|
+
provider: AIProvider;
|
|
6
|
+
providerName: ProviderName;
|
|
7
|
+
prompt: PromptAdapter;
|
|
8
|
+
analytics: AnalyticsClient;
|
|
9
|
+
workspaceContext?: string;
|
|
10
|
+
color: boolean;
|
|
11
|
+
logger: Logger;
|
|
12
|
+
}): Promise<void>;
|
package/dist/cli/repl.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import clipboardy from "clipboardy";
|
|
2
|
+
import readline from "node:readline/promises";
|
|
3
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
4
|
+
import { formatExplanationOnly, formatReplHelp, formatSuggestion } from "../core/output.js";
|
|
5
|
+
import { InMemorySession } from "../core/session.js";
|
|
6
|
+
import { generateCommand } from "../core/generateCommand.js";
|
|
7
|
+
import { assessCommandRisk } from "../safety/classifyRisk.js";
|
|
8
|
+
import { enforceExecutionPolicy } from "../safety/executionPolicy.js";
|
|
9
|
+
import { runCommand } from "../exec/runCommand.js";
|
|
10
|
+
import { ClipboardError, ExecutionPolicyError, UserCancelledError, getErrorMessage } from "../utils/errors.js";
|
|
11
|
+
import { formatReplBanner } from "../utils/branding.js";
|
|
12
|
+
function resolveReplCommand(inputValue) {
|
|
13
|
+
const normalized = inputValue.trim().toLowerCase();
|
|
14
|
+
if (normalized === "help") {
|
|
15
|
+
return "help";
|
|
16
|
+
}
|
|
17
|
+
if (normalized === "last") {
|
|
18
|
+
return "last";
|
|
19
|
+
}
|
|
20
|
+
if (normalized.startsWith("explain")) {
|
|
21
|
+
return "explain";
|
|
22
|
+
}
|
|
23
|
+
if (normalized.startsWith("run")) {
|
|
24
|
+
return "run";
|
|
25
|
+
}
|
|
26
|
+
if (normalized === "copy") {
|
|
27
|
+
return "copy";
|
|
28
|
+
}
|
|
29
|
+
if (normalized === "clear") {
|
|
30
|
+
return "clear";
|
|
31
|
+
}
|
|
32
|
+
if (normalized === "exit" || normalized === "quit") {
|
|
33
|
+
return "exit";
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
async function copyCommand(command) {
|
|
38
|
+
try {
|
|
39
|
+
await clipboardy.write(command);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new ClipboardError("Clipboard unavailable. Command printed below instead.", error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function startRepl(options) {
|
|
46
|
+
const session = new InMemorySession();
|
|
47
|
+
const rl = readline.createInterface({ input, output, terminal: true });
|
|
48
|
+
const handleSigint = () => {
|
|
49
|
+
output.write("\n");
|
|
50
|
+
rl.close();
|
|
51
|
+
};
|
|
52
|
+
process.once("SIGINT", handleSigint);
|
|
53
|
+
try {
|
|
54
|
+
output.write(`${formatReplBanner()}\nInteractive mode. Type help for commands.\n`);
|
|
55
|
+
while (true) {
|
|
56
|
+
let line;
|
|
57
|
+
try {
|
|
58
|
+
line = await rl.question("ai-cmd > ");
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
const inputValue = line.trim();
|
|
64
|
+
if (inputValue.length === 0) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const replCommand = resolveReplCommand(inputValue);
|
|
68
|
+
const lastSuggestion = session.getLastSuggestion();
|
|
69
|
+
if (replCommand === "exit") {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
if (replCommand === "help") {
|
|
73
|
+
output.write(`${formatReplHelp(options.color)}\n`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
if (replCommand === "clear") {
|
|
78
|
+
session.clear();
|
|
79
|
+
output.write("Session cleared.\n");
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (replCommand && !lastSuggestion) {
|
|
83
|
+
output.write("No command in session yet. Ask a question first.\n");
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (replCommand === "last" && lastSuggestion) {
|
|
87
|
+
output.write(`${formatSuggestion(lastSuggestion, {
|
|
88
|
+
color: options.color,
|
|
89
|
+
explain: true,
|
|
90
|
+
json: false
|
|
91
|
+
})}\n`);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (replCommand === "explain" && lastSuggestion) {
|
|
95
|
+
output.write(`${formatExplanationOnly(lastSuggestion, options.color)}\n`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (replCommand === "copy" && lastSuggestion) {
|
|
99
|
+
try {
|
|
100
|
+
await copyCommand(lastSuggestion.command);
|
|
101
|
+
output.write("Command copied to clipboard.\n");
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof ClipboardError) {
|
|
105
|
+
output.write(`${error.message}\n${lastSuggestion.command}\n`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (replCommand === "run" && lastSuggestion) {
|
|
113
|
+
if (options.platform.os === "unsupported") {
|
|
114
|
+
output.write("Execution is disabled on unsupported host OSes. Use a Unix-like shell or WSL.\n");
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const assessment = assessCommandRisk(lastSuggestion.command);
|
|
118
|
+
output.write(`${formatSuggestion(lastSuggestion, {
|
|
119
|
+
color: options.color,
|
|
120
|
+
explain: true,
|
|
121
|
+
json: false
|
|
122
|
+
})}\n`);
|
|
123
|
+
await enforceExecutionPolicy({
|
|
124
|
+
command: lastSuggestion.command,
|
|
125
|
+
risk: assessment.level,
|
|
126
|
+
yes: false,
|
|
127
|
+
prompt: options.prompt,
|
|
128
|
+
...(assessment.reasons[0] ? { reason: assessment.reasons[0] } : {})
|
|
129
|
+
});
|
|
130
|
+
await runCommand(lastSuggestion.command, {
|
|
131
|
+
cwd: options.platform.cwd,
|
|
132
|
+
stdio: "inherit"
|
|
133
|
+
});
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
await options.analytics.trackPromptSent({
|
|
137
|
+
os: options.platform.os,
|
|
138
|
+
shell: options.platform.shell,
|
|
139
|
+
provider: options.providerName,
|
|
140
|
+
mode: "interactive"
|
|
141
|
+
});
|
|
142
|
+
const suggestion = await generateCommand({
|
|
143
|
+
question: inputValue,
|
|
144
|
+
platform: options.platform,
|
|
145
|
+
provider: options.provider,
|
|
146
|
+
explainRequested: true,
|
|
147
|
+
history: session.getHistory(),
|
|
148
|
+
...(options.workspaceContext
|
|
149
|
+
? { workspaceContext: options.workspaceContext }
|
|
150
|
+
: {})
|
|
151
|
+
});
|
|
152
|
+
session.remember(inputValue, suggestion);
|
|
153
|
+
options.logger.debug("Generated command suggestion", suggestion);
|
|
154
|
+
output.write(`${formatSuggestion(suggestion, {
|
|
155
|
+
color: options.color,
|
|
156
|
+
explain: true,
|
|
157
|
+
json: false
|
|
158
|
+
})}\n`);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (error instanceof UserCancelledError ||
|
|
162
|
+
error instanceof ExecutionPolicyError) {
|
|
163
|
+
output.write(`${error.message}\n`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
await options.analytics.trackError({
|
|
167
|
+
prompt: inputValue,
|
|
168
|
+
os: options.platform.os,
|
|
169
|
+
shell: options.platform.shell,
|
|
170
|
+
provider: options.providerName,
|
|
171
|
+
message: getErrorMessage(error),
|
|
172
|
+
time: new Date().toISOString(),
|
|
173
|
+
...(error instanceof Error ? { code: error.name } : {})
|
|
174
|
+
});
|
|
175
|
+
output.write(`${getErrorMessage(error)}\n`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
process.removeListener("SIGINT", handleSigint);
|
|
181
|
+
rl.close();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/cli/repl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AppConfig, ProviderName } from "../types/index.js";
|
|
2
|
+
export interface ConfiguratorPromptAdapter {
|
|
3
|
+
select(message: string, choices: Array<{
|
|
4
|
+
title: string;
|
|
5
|
+
value: ProviderName;
|
|
6
|
+
}>): Promise<ProviderName>;
|
|
7
|
+
text(message: string, initial?: string): Promise<string>;
|
|
8
|
+
password(message: string): Promise<string>;
|
|
9
|
+
confirm(message: string, initial?: boolean): Promise<boolean>;
|
|
10
|
+
}
|
|
11
|
+
export interface ConfigureAppOptions {
|
|
12
|
+
configPath?: string;
|
|
13
|
+
prompt?: ConfiguratorPromptAdapter;
|
|
14
|
+
saveConfig?: (config: AppConfig, configPath: string) => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createConfiguratorPromptAdapter(): ConfiguratorPromptAdapter;
|
|
17
|
+
export declare function runConfigurator(options?: ConfigureAppOptions): Promise<AppConfig>;
|
|
18
|
+
export declare function loadOrConfigureConfig(options?: ConfigureAppOptions): Promise<AppConfig>;
|