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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +354 -0
  3. package/dist/analytics/client.d.ts +2 -0
  4. package/dist/analytics/client.js +95 -0
  5. package/dist/analytics/client.js.map +1 -0
  6. package/dist/analytics/session.d.ts +15 -0
  7. package/dist/analytics/session.js +70 -0
  8. package/dist/analytics/session.js.map +1 -0
  9. package/dist/cli/commands.d.ts +14 -0
  10. package/dist/cli/commands.js +265 -0
  11. package/dist/cli/commands.js.map +1 -0
  12. package/dist/cli/index.d.ts +2 -0
  13. package/dist/cli/index.js +4 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/prompts.d.ts +2 -0
  16. package/dist/cli/prompts.js +32 -0
  17. package/dist/cli/prompts.js.map +1 -0
  18. package/dist/cli/repl.d.ts +12 -0
  19. package/dist/cli/repl.js +184 -0
  20. package/dist/cli/repl.js.map +1 -0
  21. package/dist/config/configurator.d.ts +18 -0
  22. package/dist/config/configurator.js +133 -0
  23. package/dist/config/configurator.js.map +1 -0
  24. package/dist/config/env.d.ts +2 -0
  25. package/dist/config/env.js +8 -0
  26. package/dist/config/env.js.map +1 -0
  27. package/dist/config/providerCatalog.d.ts +8 -0
  28. package/dist/config/providerCatalog.js +33 -0
  29. package/dist/config/providerCatalog.js.map +1 -0
  30. package/dist/config/userConfig.d.ts +12 -0
  31. package/dist/config/userConfig.js +141 -0
  32. package/dist/config/userConfig.js.map +1 -0
  33. package/dist/core/explainCommand.d.ts +2 -0
  34. package/dist/core/explainCommand.js +4 -0
  35. package/dist/core/explainCommand.js.map +1 -0
  36. package/dist/core/generateCommand.d.ts +2 -0
  37. package/dist/core/generateCommand.js +34 -0
  38. package/dist/core/generateCommand.js.map +1 -0
  39. package/dist/core/output.d.ts +4 -0
  40. package/dist/core/output.js +67 -0
  41. package/dist/core/output.js.map +1 -0
  42. package/dist/core/prompts.d.ts +8 -0
  43. package/dist/core/prompts.js +75 -0
  44. package/dist/core/prompts.js.map +1 -0
  45. package/dist/core/response.d.ts +19 -0
  46. package/dist/core/response.js +44 -0
  47. package/dist/core/response.js.map +1 -0
  48. package/dist/core/session.d.ts +9 -0
  49. package/dist/core/session.js +23 -0
  50. package/dist/core/session.js.map +1 -0
  51. package/dist/exec/runCommand.d.ts +11 -0
  52. package/dist/exec/runCommand.js +57 -0
  53. package/dist/exec/runCommand.js.map +1 -0
  54. package/dist/index.d.ts +5 -0
  55. package/dist/index.js +6 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/platform/detectPlatform.d.ts +9 -0
  58. package/dist/platform/detectPlatform.js +49 -0
  59. package/dist/platform/detectPlatform.js.map +1 -0
  60. package/dist/platform/detectServiceManager.d.ts +3 -0
  61. package/dist/platform/detectServiceManager.js +38 -0
  62. package/dist/platform/detectServiceManager.js.map +1 -0
  63. package/dist/platform/detectShell.d.ts +3 -0
  64. package/dist/platform/detectShell.js +21 -0
  65. package/dist/platform/detectShell.js.map +1 -0
  66. package/dist/providers/anthropic.d.ts +8 -0
  67. package/dist/providers/anthropic.js +67 -0
  68. package/dist/providers/anthropic.js.map +1 -0
  69. package/dist/providers/factory.d.ts +2 -0
  70. package/dist/providers/factory.js +24 -0
  71. package/dist/providers/factory.js.map +1 -0
  72. package/dist/providers/google.d.ts +8 -0
  73. package/dist/providers/google.js +76 -0
  74. package/dist/providers/google.js.map +1 -0
  75. package/dist/providers/ollama.d.ts +8 -0
  76. package/dist/providers/ollama.js +67 -0
  77. package/dist/providers/ollama.js.map +1 -0
  78. package/dist/providers/openai.d.ts +8 -0
  79. package/dist/providers/openai.js +77 -0
  80. package/dist/providers/openai.js.map +1 -0
  81. package/dist/providers/types.d.ts +1 -0
  82. package/dist/providers/types.js +2 -0
  83. package/dist/providers/types.js.map +1 -0
  84. package/dist/safety/classifyRisk.d.ts +7 -0
  85. package/dist/safety/classifyRisk.js +115 -0
  86. package/dist/safety/classifyRisk.js.map +1 -0
  87. package/dist/safety/dangerousPatterns.d.ts +8 -0
  88. package/dist/safety/dangerousPatterns.js +70 -0
  89. package/dist/safety/dangerousPatterns.js.map +1 -0
  90. package/dist/safety/executionPolicy.d.ts +9 -0
  91. package/dist/safety/executionPolicy.js +21 -0
  92. package/dist/safety/executionPolicy.js.map +1 -0
  93. package/dist/types/index.d.ts +105 -0
  94. package/dist/types/index.js +2 -0
  95. package/dist/types/index.js.map +1 -0
  96. package/dist/utils/branding.d.ts +6 -0
  97. package/dist/utils/branding.js +16 -0
  98. package/dist/utils/branding.js.map +1 -0
  99. package/dist/utils/errors.d.ts +26 -0
  100. package/dist/utils/errors.js +59 -0
  101. package/dist/utils/errors.js.map +1 -0
  102. package/dist/utils/logger.d.ts +5 -0
  103. package/dist/utils/logger.js +14 -0
  104. package/dist/utils/logger.js.map +1 -0
  105. package/dist/utils/strings.d.ts +5 -0
  106. package/dist/utils/strings.js +30 -0
  107. package/dist/utils/strings.js.map +1 -0
  108. package/dist/workspace/inspectWorkspace.d.ts +1 -0
  109. package/dist/workspace/inspectWorkspace.js +174 -0
  110. package/dist/workspace/inspectWorkspace.js.map +1 -0
  111. 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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCliAndHandleErrors } from "./commands.js";
3
+ await runCliAndHandleErrors(process.argv);
4
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ import type { PromptAdapter } from "../types/index.js";
2
+ export declare function createPromptAdapter(): PromptAdapter;
@@ -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>;
@@ -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>;