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,133 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import prompts from "prompts";
|
|
3
|
+
import { DEFAULT_CONFIG_PATH } from "./env.js";
|
|
4
|
+
import { providerDefaults } from "./providerCatalog.js";
|
|
5
|
+
import { configFileExists, ensureDefaultConfigScaffold, loadConfig, saveUserConfig } from "./userConfig.js";
|
|
6
|
+
import { ConfigurationError, UserCancelledError } from "../utils/errors.js";
|
|
7
|
+
export function createConfiguratorPromptAdapter() {
|
|
8
|
+
const onCancel = () => {
|
|
9
|
+
throw new UserCancelledError("Configuration cancelled.");
|
|
10
|
+
};
|
|
11
|
+
return {
|
|
12
|
+
async select(message, choices) {
|
|
13
|
+
const response = await prompts({
|
|
14
|
+
type: "select",
|
|
15
|
+
name: "value",
|
|
16
|
+
message,
|
|
17
|
+
choices
|
|
18
|
+
}, { onCancel });
|
|
19
|
+
return response.value;
|
|
20
|
+
},
|
|
21
|
+
async text(message, initial = "") {
|
|
22
|
+
const response = await prompts({
|
|
23
|
+
type: "text",
|
|
24
|
+
name: "value",
|
|
25
|
+
message,
|
|
26
|
+
initial
|
|
27
|
+
}, { onCancel });
|
|
28
|
+
return String(response.value ?? "").trim();
|
|
29
|
+
},
|
|
30
|
+
async password(message) {
|
|
31
|
+
const response = await prompts({
|
|
32
|
+
type: "password",
|
|
33
|
+
name: "value",
|
|
34
|
+
message
|
|
35
|
+
}, { onCancel });
|
|
36
|
+
return String(response.value ?? "").trim();
|
|
37
|
+
},
|
|
38
|
+
async confirm(message, initial = false) {
|
|
39
|
+
const response = await prompts({
|
|
40
|
+
type: "confirm",
|
|
41
|
+
name: "value",
|
|
42
|
+
message,
|
|
43
|
+
initial
|
|
44
|
+
}, { onCancel });
|
|
45
|
+
return Boolean(response.value);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function promptForRequiredText(options) {
|
|
50
|
+
const value = await options.prompt.text(options.message, options.initial);
|
|
51
|
+
if (value.length === 0) {
|
|
52
|
+
throw new ConfigurationError(options.errorMessage);
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
function ensureValidUrl(value, providerLabel) {
|
|
57
|
+
try {
|
|
58
|
+
return new URL(value).toString().replace(/\/$/u, "");
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
throw new ConfigurationError(`${providerLabel} base URL must be a valid URL.`, error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function runConfigurator(options = {}) {
|
|
65
|
+
const configPath = options.configPath ?? DEFAULT_CONFIG_PATH;
|
|
66
|
+
const prompt = options.prompt ?? createConfiguratorPromptAdapter();
|
|
67
|
+
const saveConfig = options.saveConfig ?? saveUserConfig;
|
|
68
|
+
const provider = await prompt.select("AI Provider", [
|
|
69
|
+
{ title: "OpenAI", value: "openai" },
|
|
70
|
+
{ title: "Anthropic", value: "anthropic" },
|
|
71
|
+
{ title: "Ollama", value: "ollama" },
|
|
72
|
+
{ title: "Google", value: "google" },
|
|
73
|
+
{ title: "vLLM", value: "vllm" }
|
|
74
|
+
]);
|
|
75
|
+
const providerConfig = providerDefaults[provider];
|
|
76
|
+
const apiKey = providerConfig.requiresApiKey
|
|
77
|
+
? await prompt.password(`API Key for ${providerConfig.label}`)
|
|
78
|
+
: await prompt.text(`API Key for ${providerConfig.label} (optional)`);
|
|
79
|
+
const model = await promptForRequiredText({
|
|
80
|
+
prompt,
|
|
81
|
+
message: `Model for ${providerConfig.label}`,
|
|
82
|
+
initial: providerConfig.model,
|
|
83
|
+
errorMessage: `${providerConfig.label} requires a model name.`
|
|
84
|
+
});
|
|
85
|
+
const baseUrl = ensureValidUrl(await promptForRequiredText({
|
|
86
|
+
prompt,
|
|
87
|
+
message: `Base URL for ${providerConfig.label}`,
|
|
88
|
+
initial: providerConfig.baseUrl,
|
|
89
|
+
errorMessage: `${providerConfig.label} requires a base URL.`
|
|
90
|
+
}), providerConfig.label);
|
|
91
|
+
if (providerConfig.requiresApiKey && apiKey.length === 0) {
|
|
92
|
+
throw new ConfigurationError(`${providerConfig.label} requires an API key.`);
|
|
93
|
+
}
|
|
94
|
+
const analytics = await prompt.confirm([
|
|
95
|
+
"Help improve ai-cmd 🚀",
|
|
96
|
+
"Allow anonymous usage analytics?",
|
|
97
|
+
"- No personal data",
|
|
98
|
+
"- No command content stored",
|
|
99
|
+
"- Error reports may include the prompt that caused a failure",
|
|
100
|
+
"",
|
|
101
|
+
"(y/n) (default is no)"
|
|
102
|
+
].join("\n"), false);
|
|
103
|
+
const config = {
|
|
104
|
+
provider,
|
|
105
|
+
model,
|
|
106
|
+
baseUrl,
|
|
107
|
+
timeoutMs: 30_000,
|
|
108
|
+
analytics,
|
|
109
|
+
...(apiKey ? { apiKey } : {}),
|
|
110
|
+
...(analytics ? { analyticsId: randomUUID() } : {})
|
|
111
|
+
};
|
|
112
|
+
await saveConfig(config, configPath);
|
|
113
|
+
process.stdout.write(`Configurator saved ${configPath}.\n`);
|
|
114
|
+
return config;
|
|
115
|
+
}
|
|
116
|
+
export async function loadOrConfigureConfig(options = {}) {
|
|
117
|
+
const configPath = options.configPath ?? DEFAULT_CONFIG_PATH;
|
|
118
|
+
if (await configFileExists(configPath)) {
|
|
119
|
+
return loadConfig({ configPath });
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
return await loadConfig({ configPath });
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
126
|
+
await ensureDefaultConfigScaffold(configPath);
|
|
127
|
+
throw new ConfigurationError(`No config found and the interactive configurator is unavailable in this shell. Edit ${configPath} or set AI_PROVIDER and AI_API_KEY in your environment.`, error);
|
|
128
|
+
}
|
|
129
|
+
await runConfigurator(options);
|
|
130
|
+
return loadConfig({ configPath });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=configurator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configurator.js","sourceRoot":"","sources":["../../src/config/configurator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const DEFAULT_CONFIG_PATH = path.join(homedir(), ".ai-cmd", "config.json");
|
|
4
|
+
export function getEnvValue(env, key) {
|
|
5
|
+
const value = env[key];
|
|
6
|
+
return value && value.trim().length > 0 ? value.trim() : undefined;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAC1C,OAAO,EAAE,EACT,SAAS,EACT,aAAa,CACd,CAAC;AAEF,MAAM,UAAU,WAAW,CACzB,GAAsB,EACtB,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const providerDefaults = {
|
|
2
|
+
openai: {
|
|
3
|
+
label: "OpenAI",
|
|
4
|
+
model: "gpt-5.4-mini",
|
|
5
|
+
baseUrl: "https://api.openai.com/v1",
|
|
6
|
+
requiresApiKey: true
|
|
7
|
+
},
|
|
8
|
+
anthropic: {
|
|
9
|
+
label: "Anthropic",
|
|
10
|
+
model: "claude-sonnet-4-20250514",
|
|
11
|
+
baseUrl: "https://api.anthropic.com/v1",
|
|
12
|
+
requiresApiKey: true
|
|
13
|
+
},
|
|
14
|
+
ollama: {
|
|
15
|
+
label: "Ollama",
|
|
16
|
+
model: "gemma3:4b",
|
|
17
|
+
baseUrl: "http://localhost:11434/api",
|
|
18
|
+
requiresApiKey: false
|
|
19
|
+
},
|
|
20
|
+
google: {
|
|
21
|
+
label: "Google",
|
|
22
|
+
model: "gemini-2.5-flash",
|
|
23
|
+
baseUrl: "https://generativelanguage.googleapis.com/v1beta",
|
|
24
|
+
requiresApiKey: true
|
|
25
|
+
},
|
|
26
|
+
vllm: {
|
|
27
|
+
label: "vLLM",
|
|
28
|
+
model: "google/gemma-3-4b-it",
|
|
29
|
+
baseUrl: "http://localhost:8000/v1",
|
|
30
|
+
requiresApiKey: false
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=providerCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerCatalog.js","sourceRoot":"","sources":["../../src/config/providerCatalog.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,gBAAgB,GAA6C;IACxE,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,2BAA2B;QACpC,cAAc,EAAE,IAAI;KACrB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,0BAA0B;QACjC,OAAO,EAAE,8BAA8B;QACvC,cAAc,EAAE,IAAI;KACrB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,4BAA4B;QACrC,cAAc,EAAE,KAAK;KACtB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,kBAAkB;QACzB,OAAO,EAAE,kDAAkD;QAC3D,cAAc,EAAE,IAAI;KACrB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,sBAAsB;QAC7B,OAAO,EAAE,0BAA0B;QACnC,cAAc,EAAE,KAAK;KACtB;CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AppConfig } from "../types/index.js";
|
|
2
|
+
export type LoadConfigOptions = {
|
|
3
|
+
env?: NodeJS.ProcessEnv;
|
|
4
|
+
configPath?: string;
|
|
5
|
+
readConfigFile?: (configPath: string) => Promise<string>;
|
|
6
|
+
ensureConfigScaffold?: (configPath: string) => Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
export declare function configFileExists(configPath?: string): Promise<boolean>;
|
|
9
|
+
export declare function saveUserConfig(config: AppConfig, configPath?: string): Promise<void>;
|
|
10
|
+
export declare function ensureDefaultConfigScaffold(configPath: string): Promise<void>;
|
|
11
|
+
export declare function loadUserConfig(configPath?: string, readConfigFile?: (configPath: string) => Promise<string>): Promise<Partial<AppConfig>>;
|
|
12
|
+
export declare function loadConfig(options?: LoadConfigOptions): Promise<AppConfig>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { DEFAULT_CONFIG_PATH, getEnvValue } from "./env.js";
|
|
5
|
+
import { providerDefaults } from "./providerCatalog.js";
|
|
6
|
+
import { ConfigurationError } from "../utils/errors.js";
|
|
7
|
+
const providerSchema = z.enum([
|
|
8
|
+
"openai",
|
|
9
|
+
"anthropic",
|
|
10
|
+
"ollama",
|
|
11
|
+
"google",
|
|
12
|
+
"vllm"
|
|
13
|
+
]);
|
|
14
|
+
const partialConfigSchema = z.object({
|
|
15
|
+
provider: providerSchema.optional(),
|
|
16
|
+
model: z.string().min(1).optional(),
|
|
17
|
+
apiKey: z.string().min(1).optional(),
|
|
18
|
+
baseUrl: z.string().url().optional(),
|
|
19
|
+
timeoutMs: z.number().int().positive().optional(),
|
|
20
|
+
analytics: z.boolean().optional(),
|
|
21
|
+
analyticsId: z.string().uuid().optional()
|
|
22
|
+
});
|
|
23
|
+
const finalConfigSchema = z.object({
|
|
24
|
+
provider: providerSchema,
|
|
25
|
+
model: z.string().min(1),
|
|
26
|
+
apiKey: z.string().min(1).optional(),
|
|
27
|
+
baseUrl: z.string().url(),
|
|
28
|
+
timeoutMs: z.number().int().positive(),
|
|
29
|
+
analytics: z.boolean(),
|
|
30
|
+
analyticsId: z.string().uuid().optional()
|
|
31
|
+
});
|
|
32
|
+
const DEFAULT_CONFIG_TEMPLATE = {
|
|
33
|
+
provider: "openai",
|
|
34
|
+
model: "gpt-5.4-mini",
|
|
35
|
+
apiKey: "your-api-key-here",
|
|
36
|
+
baseUrl: "https://api.openai.com/v1",
|
|
37
|
+
timeoutMs: 30_000,
|
|
38
|
+
analytics: false
|
|
39
|
+
};
|
|
40
|
+
export async function configFileExists(configPath = DEFAULT_CONFIG_PATH) {
|
|
41
|
+
try {
|
|
42
|
+
await access(configPath);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function saveUserConfig(config, configPath = DEFAULT_CONFIG_PATH) {
|
|
50
|
+
await mkdir(path.dirname(configPath), { recursive: true });
|
|
51
|
+
await writeFile(`${configPath}`, `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
52
|
+
}
|
|
53
|
+
export async function ensureDefaultConfigScaffold(configPath) {
|
|
54
|
+
await mkdir(path.dirname(configPath), { recursive: true });
|
|
55
|
+
try {
|
|
56
|
+
await writeFile(configPath, `${JSON.stringify(DEFAULT_CONFIG_TEMPLATE, null, 2)}\n`, {
|
|
57
|
+
flag: "wx"
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error.code === "EEXIST") {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
throw new ConfigurationError(`Failed to create ${configPath}.`, error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function loadUserConfig(configPath = DEFAULT_CONFIG_PATH, readConfigFile = (inputPath) => readFile(inputPath, "utf8")) {
|
|
68
|
+
try {
|
|
69
|
+
const rawConfig = await readConfigFile(configPath);
|
|
70
|
+
const parsed = JSON.parse(rawConfig);
|
|
71
|
+
const validated = partialConfigSchema.parse(parsed);
|
|
72
|
+
return {
|
|
73
|
+
...(validated.provider ? { provider: validated.provider } : {}),
|
|
74
|
+
...(validated.model ? { model: validated.model } : {}),
|
|
75
|
+
...(validated.apiKey ? { apiKey: validated.apiKey } : {}),
|
|
76
|
+
...(validated.baseUrl ? { baseUrl: validated.baseUrl } : {}),
|
|
77
|
+
...(validated.timeoutMs ? { timeoutMs: validated.timeoutMs } : {}),
|
|
78
|
+
analytics: validated.analytics ?? false,
|
|
79
|
+
...(validated.analyticsId ? { analyticsId: validated.analyticsId } : {})
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error?.code === "ENOENT") {
|
|
84
|
+
return {};
|
|
85
|
+
}
|
|
86
|
+
if (error instanceof SyntaxError) {
|
|
87
|
+
throw new ConfigurationError(`Failed to parse ${configPath}: invalid JSON.`, error);
|
|
88
|
+
}
|
|
89
|
+
if (error instanceof z.ZodError) {
|
|
90
|
+
throw new ConfigurationError(`Invalid configuration in ${configPath}.`, error.flatten());
|
|
91
|
+
}
|
|
92
|
+
throw new ConfigurationError(`Failed to read ${configPath}.`, error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export async function loadConfig(options = {}) {
|
|
96
|
+
const env = options.env ?? process.env;
|
|
97
|
+
const configPath = options.configPath ?? DEFAULT_CONFIG_PATH;
|
|
98
|
+
const ensureConfigScaffold = options.ensureConfigScaffold ?? ensureDefaultConfigScaffold;
|
|
99
|
+
const fileConfig = await loadUserConfig(configPath, options.readConfigFile);
|
|
100
|
+
const rawProvider = getEnvValue(env, "AI_PROVIDER") ?? fileConfig.provider ?? "openai";
|
|
101
|
+
const providerResult = providerSchema.safeParse(rawProvider);
|
|
102
|
+
if (!providerResult.success) {
|
|
103
|
+
throw new ConfigurationError("Invalid AI provider. Supported providers: openai, anthropic, ollama, google, vllm.", providerResult.error.flatten());
|
|
104
|
+
}
|
|
105
|
+
const provider = providerResult.data;
|
|
106
|
+
const defaults = providerDefaults[provider];
|
|
107
|
+
const merged = {
|
|
108
|
+
provider,
|
|
109
|
+
model: getEnvValue(env, "AI_MODEL") ?? fileConfig.model ?? defaults.model,
|
|
110
|
+
apiKey: getEnvValue(env, "AI_API_KEY") ?? fileConfig.apiKey,
|
|
111
|
+
baseUrl: getEnvValue(env, "AI_BASE_URL") ?? fileConfig.baseUrl ?? defaults.baseUrl,
|
|
112
|
+
timeoutMs: Number.parseInt(getEnvValue(env, "AI_TIMEOUT_MS") ??
|
|
113
|
+
String(fileConfig.timeoutMs ?? 30_000), 10) || 30_000,
|
|
114
|
+
analytics: fileConfig.analytics ?? false,
|
|
115
|
+
analyticsId: fileConfig.analyticsId
|
|
116
|
+
};
|
|
117
|
+
const parsed = finalConfigSchema.safeParse(merged);
|
|
118
|
+
if (!parsed.success) {
|
|
119
|
+
if (defaults.requiresApiKey && !merged.apiKey) {
|
|
120
|
+
await ensureConfigScaffold(configPath);
|
|
121
|
+
throw new ConfigurationError(`Missing AI_API_KEY. Set it in your environment or edit ${configPath}. A starter config has been created if it did not already exist.`);
|
|
122
|
+
}
|
|
123
|
+
throw new ConfigurationError("Invalid AI configuration.", parsed.error.flatten());
|
|
124
|
+
}
|
|
125
|
+
if (defaults.requiresApiKey && !parsed.data.apiKey) {
|
|
126
|
+
await ensureConfigScaffold(configPath);
|
|
127
|
+
throw new ConfigurationError(`Missing AI_API_KEY. Set it in your environment or edit ${configPath}. A starter config has been created if it did not already exist.`);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
provider: parsed.data.provider,
|
|
131
|
+
model: parsed.data.model,
|
|
132
|
+
baseUrl: parsed.data.baseUrl,
|
|
133
|
+
timeoutMs: parsed.data.timeoutMs,
|
|
134
|
+
analytics: parsed.data.analytics,
|
|
135
|
+
...(parsed.data.analyticsId
|
|
136
|
+
? { analyticsId: parsed.data.analyticsId }
|
|
137
|
+
: {}),
|
|
138
|
+
...(parsed.data.apiKey ? { apiKey: parsed.data.apiKey } : {})
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=userConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userConfig.js","sourceRoot":"","sources":["../../src/config/userConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainCommand.js","sourceRoot":"","sources":["../../src/core/explainCommand.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,UAA6B;IAC1D,OAAO,UAAU,CAAC,WAAW,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { buildGenerateObjectRequest } from "./prompts.js";
|
|
2
|
+
import { parseProviderPayload } from "./response.js";
|
|
3
|
+
import { classifyRisk } from "../safety/classifyRisk.js";
|
|
4
|
+
export async function generateCommand(options) {
|
|
5
|
+
const request = buildGenerateObjectRequest({
|
|
6
|
+
question: options.question,
|
|
7
|
+
platform: options.platform,
|
|
8
|
+
explainRequested: options.explainRequested ?? true,
|
|
9
|
+
history: options.history ?? [],
|
|
10
|
+
...(options.workspaceContext
|
|
11
|
+
? { workspaceContext: options.workspaceContext }
|
|
12
|
+
: {})
|
|
13
|
+
});
|
|
14
|
+
const response = await options.provider.generateObject(request);
|
|
15
|
+
const payload = parseProviderPayload(response.rawText);
|
|
16
|
+
const platformNotes = [
|
|
17
|
+
...(payload.platformNotes ?? []),
|
|
18
|
+
...(options.platform.os === "unsupported"
|
|
19
|
+
? [
|
|
20
|
+
"Detected unsupported host OS; generated a best-effort Unix-style command."
|
|
21
|
+
]
|
|
22
|
+
: [])
|
|
23
|
+
];
|
|
24
|
+
return {
|
|
25
|
+
question: options.question,
|
|
26
|
+
command: payload.command,
|
|
27
|
+
explanation: payload.explanation,
|
|
28
|
+
risk: classifyRisk(payload.command),
|
|
29
|
+
platform: options.platform,
|
|
30
|
+
...(platformNotes.length > 0 ? { platformNotes } : {}),
|
|
31
|
+
...(payload.assumptions ? { assumptions: payload.assumptions } : {})
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=generateCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateCommand.js","sourceRoot":"","sources":["../../src/core/generateCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAMzD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA+B;IAE/B,MAAM,OAAO,GAAG,0BAA0B,CAAC;QACzC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;QAClD,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,GAAG,CAAC,OAAO,CAAC,gBAAgB;YAC1B,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG;QACpB,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QAChC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,aAAa;YACvC,CAAC,CAAC;gBACE,2EAA2E;aAC5E;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CommandSuggestion, OutputOptions } from "../types/index.js";
|
|
2
|
+
export declare function formatSuggestion(suggestion: CommandSuggestion, options: OutputOptions): string;
|
|
3
|
+
export declare function formatExplanationOnly(suggestion: CommandSuggestion, color: boolean): string;
|
|
4
|
+
export declare function formatReplHelp(color: boolean): string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Chalk } from "chalk";
|
|
2
|
+
function createPalette(color) {
|
|
3
|
+
return new Chalk({ level: color ? 1 : 0 });
|
|
4
|
+
}
|
|
5
|
+
function colorizeRisk(chalk, risk) {
|
|
6
|
+
if (risk === "high") {
|
|
7
|
+
return chalk.red(risk);
|
|
8
|
+
}
|
|
9
|
+
if (risk === "medium") {
|
|
10
|
+
return chalk.yellow(risk);
|
|
11
|
+
}
|
|
12
|
+
return chalk.green(risk);
|
|
13
|
+
}
|
|
14
|
+
export function formatSuggestion(suggestion, options) {
|
|
15
|
+
if (options.json) {
|
|
16
|
+
return JSON.stringify({
|
|
17
|
+
question: suggestion.question,
|
|
18
|
+
command: suggestion.command,
|
|
19
|
+
explanation: suggestion.explanation,
|
|
20
|
+
risk: suggestion.risk,
|
|
21
|
+
platformNotes: suggestion.platformNotes,
|
|
22
|
+
assumptions: suggestion.assumptions,
|
|
23
|
+
platform: suggestion.platform
|
|
24
|
+
}, null, 2);
|
|
25
|
+
}
|
|
26
|
+
const chalk = createPalette(options.color);
|
|
27
|
+
const lines = [
|
|
28
|
+
chalk.bold("Command"),
|
|
29
|
+
chalk.cyan(suggestion.command)
|
|
30
|
+
];
|
|
31
|
+
if (options.explain) {
|
|
32
|
+
lines.push("", chalk.bold("Explanation"), suggestion.explanation, "");
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
lines.push("");
|
|
36
|
+
}
|
|
37
|
+
lines.push(`${chalk.bold("Risk")} ${colorizeRisk(chalk, suggestion.risk)}`);
|
|
38
|
+
if (suggestion.assumptions && suggestion.assumptions.length > 0) {
|
|
39
|
+
lines.push("", chalk.bold("Assumptions"), ...suggestion.assumptions.map((item) => `- ${item}`));
|
|
40
|
+
}
|
|
41
|
+
if (suggestion.platformNotes && suggestion.platformNotes.length > 0) {
|
|
42
|
+
lines.push("", chalk.bold("Platform Notes"), ...suggestion.platformNotes.map((item) => `- ${item}`));
|
|
43
|
+
}
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
}
|
|
46
|
+
export function formatExplanationOnly(suggestion, color) {
|
|
47
|
+
const chalk = createPalette(color);
|
|
48
|
+
const lines = [chalk.bold("Explanation"), suggestion.explanation];
|
|
49
|
+
if (suggestion.assumptions && suggestion.assumptions.length > 0) {
|
|
50
|
+
lines.push("", chalk.bold("Assumptions"), ...suggestion.assumptions.map((item) => `- ${item}`));
|
|
51
|
+
}
|
|
52
|
+
return lines.join("\n");
|
|
53
|
+
}
|
|
54
|
+
export function formatReplHelp(color) {
|
|
55
|
+
const chalk = createPalette(color);
|
|
56
|
+
return [
|
|
57
|
+
chalk.bold("Commands"),
|
|
58
|
+
"help Show this help",
|
|
59
|
+
"last Show the last suggested command",
|
|
60
|
+
"explain Show the explanation for the last command",
|
|
61
|
+
"run Execute the last command with confirmation",
|
|
62
|
+
"copy Copy the last command to the clipboard",
|
|
63
|
+
"clear Clear session memory",
|
|
64
|
+
"exit Leave ai-cmd"
|
|
65
|
+
].join("\n");
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAI9B,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,KAAuC,EAAE,IAAe;IAC5E,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,UAA6B,EAC7B,OAAsB;IAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG;QACZ,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;KAC/B,CAAC;IAEF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAChE,CAAC;IAEF,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,IAAI,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CACR,EAAE,EACF,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC5B,GAAG,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,UAA6B,EAC7B,KAAc;IAEd,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAElE,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnC,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QACtB,0BAA0B;QAC1B,2CAA2C;QAC3C,qDAAqD;QACrD,sDAAsD;QACtD,kDAAkD;QAClD,gCAAgC;QAChC,wBAAwB;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ConversationTurn, GenerateObjectRequest, PlatformContext } from "../types/index.js";
|
|
2
|
+
export declare function buildGenerateObjectRequest(options: {
|
|
3
|
+
question: string;
|
|
4
|
+
platform: PlatformContext;
|
|
5
|
+
explainRequested: boolean;
|
|
6
|
+
history: ConversationTurn[];
|
|
7
|
+
workspaceContext?: string;
|
|
8
|
+
}): GenerateObjectRequest;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export function buildGenerateObjectRequest(options) {
|
|
2
|
+
const schema = {
|
|
3
|
+
type: "object",
|
|
4
|
+
additionalProperties: false,
|
|
5
|
+
required: ["command", "explanation"],
|
|
6
|
+
properties: {
|
|
7
|
+
command: {
|
|
8
|
+
type: "string",
|
|
9
|
+
description: "Exactly one best shell command on a single line. Use operators like && only when required."
|
|
10
|
+
},
|
|
11
|
+
explanation: {
|
|
12
|
+
type: "string",
|
|
13
|
+
description: "A short practical explanation of what the command does."
|
|
14
|
+
},
|
|
15
|
+
platformNotes: {
|
|
16
|
+
type: "array",
|
|
17
|
+
items: { type: "string" }
|
|
18
|
+
},
|
|
19
|
+
assumptions: {
|
|
20
|
+
type: "array",
|
|
21
|
+
items: { type: "string" }
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const systemPrompt = [
|
|
26
|
+
"You are ai-cmd, a shell command assistant for Unix-like environments.",
|
|
27
|
+
"Return exactly one best command for the user's current environment.",
|
|
28
|
+
"Prefer standard native tools over obscure alternatives.",
|
|
29
|
+
"Do not invent commands, package names, or service names.",
|
|
30
|
+
"Tailor the command to the detected OS, shell, and service manager.",
|
|
31
|
+
"If the environment is uncertain, make the safest reasonable assumption and state it in assumptions.",
|
|
32
|
+
"Keep explanations concise and practical.",
|
|
33
|
+
"Return valid JSON only. Do not include markdown fences or prose outside the JSON object."
|
|
34
|
+
].join(" ");
|
|
35
|
+
const historyBlock = options.history.length === 0
|
|
36
|
+
? "No previous conversation context."
|
|
37
|
+
: JSON.stringify(options.history.slice(-4), null, 2);
|
|
38
|
+
const userPrompt = [
|
|
39
|
+
"Environment context:",
|
|
40
|
+
JSON.stringify({
|
|
41
|
+
os: options.platform.os,
|
|
42
|
+
shell: options.platform.shell,
|
|
43
|
+
serviceManager: options.platform.serviceManager,
|
|
44
|
+
cwdName: options.platform.cwdName
|
|
45
|
+
}, null, 2),
|
|
46
|
+
"",
|
|
47
|
+
"Conversation context:",
|
|
48
|
+
historyBlock,
|
|
49
|
+
"",
|
|
50
|
+
"Workspace context:",
|
|
51
|
+
options.workspaceContext ?? "Unavailable.",
|
|
52
|
+
"",
|
|
53
|
+
`Explain output requested: ${options.explainRequested ? "yes" : "no"}`,
|
|
54
|
+
`User question: ${options.question}`,
|
|
55
|
+
"",
|
|
56
|
+
"Response schema:",
|
|
57
|
+
JSON.stringify(schema, null, 2),
|
|
58
|
+
"",
|
|
59
|
+
"Rules:",
|
|
60
|
+
"- command must be a single string on one line",
|
|
61
|
+
"- do not return multiple alternatives",
|
|
62
|
+
"- use workspace context when it helps choose project-aware commands",
|
|
63
|
+
"- use assumptions only when needed",
|
|
64
|
+
"- use platformNotes for short platform-specific caveats"
|
|
65
|
+
].join("\n");
|
|
66
|
+
return {
|
|
67
|
+
systemPrompt,
|
|
68
|
+
userPrompt,
|
|
69
|
+
schemaName: "command_suggestion",
|
|
70
|
+
schemaDescription: "A single shell command suggestion for the current environment.",
|
|
71
|
+
jsonSchema: schema,
|
|
72
|
+
temperature: 0.1
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,0BAA0B,CAAC,OAM1C;IACC,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,QAAQ;QACd,oBAAoB,EAAE,KAAK;QAC3B,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;QACpC,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4FAA4F;aAC/F;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yDAAyD;aACvE;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B;SACF;KACgC,CAAC;IAEpC,MAAM,YAAY,GAAG;QACnB,uEAAuE;QACvE,qEAAqE;QACrE,yDAAyD;QACzD,0DAA0D;QAC1D,oEAAoE;QACpE,qGAAqG;QACrG,0CAA0C;QAC1C,0FAA0F;KAC3F,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,MAAM,YAAY,GAChB,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAC1B,CAAC,CAAC,mCAAmC;QACrC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG;QACjB,sBAAsB;QACtB,IAAI,CAAC,SAAS,CACZ;YACE,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YACvB,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK;YAC7B,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc;YAC/C,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;SAClC,EACD,IAAI,EACJ,CAAC,CACF;QACD,EAAE;QACF,uBAAuB;QACvB,YAAY;QACZ,EAAE;QACF,oBAAoB;QACpB,OAAO,CAAC,gBAAgB,IAAI,cAAc;QAC1C,EAAE;QACF,6BAA6B,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QACtE,kBAAkB,OAAO,CAAC,QAAQ,EAAE;QACpC,EAAE;QACF,kBAAkB;QAClB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,EAAE;QACF,QAAQ;QACR,+CAA+C;QAC/C,uCAAuC;QACvC,qEAAqE;QACrE,oCAAoC;QACpC,yDAAyD;KAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,YAAY;QACZ,UAAU;QACV,UAAU,EAAE,oBAAoB;QAChC,iBAAiB,EACf,gEAAgE;QAClE,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,GAAG;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ProviderCommandPayload } from "../types/index.js";
|
|
3
|
+
export declare const providerCommandSchema: z.ZodObject<{
|
|
4
|
+
command: z.ZodString;
|
|
5
|
+
explanation: z.ZodString;
|
|
6
|
+
platformNotes: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
7
|
+
assumptions: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
command: string;
|
|
10
|
+
explanation: string;
|
|
11
|
+
platformNotes?: string[] | undefined;
|
|
12
|
+
assumptions?: string[] | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
command: string;
|
|
15
|
+
explanation: string;
|
|
16
|
+
platformNotes?: string[] | undefined;
|
|
17
|
+
assumptions?: string[] | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function parseProviderPayload(rawText: string): ProviderCommandPayload;
|