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,77 @@
|
|
|
1
|
+
import { ProviderError } from "../utils/errors.js";
|
|
2
|
+
export class OpenAICompatibleProvider {
|
|
3
|
+
name;
|
|
4
|
+
config;
|
|
5
|
+
constructor(name, config) {
|
|
6
|
+
this.name = name;
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async generateObject(input) {
|
|
10
|
+
const controller = new AbortController();
|
|
11
|
+
const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);
|
|
12
|
+
try {
|
|
13
|
+
const headers = {
|
|
14
|
+
"Content-Type": "application/json"
|
|
15
|
+
};
|
|
16
|
+
if (this.config.apiKey) {
|
|
17
|
+
headers.Authorization = `Bearer ${this.config.apiKey}`;
|
|
18
|
+
}
|
|
19
|
+
const response = await fetch(`${this.config.baseUrl}/chat/completions`, {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers,
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
model: this.config.model,
|
|
24
|
+
temperature: input.temperature ?? 0.1,
|
|
25
|
+
response_format: {
|
|
26
|
+
type: "json_object"
|
|
27
|
+
},
|
|
28
|
+
messages: [
|
|
29
|
+
{
|
|
30
|
+
role: "system",
|
|
31
|
+
content: input.systemPrompt
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
role: "user",
|
|
35
|
+
content: input.userPrompt
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}),
|
|
39
|
+
signal: controller.signal
|
|
40
|
+
});
|
|
41
|
+
const data = (await response.json());
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new ProviderError(data.error?.message
|
|
44
|
+
? `Provider request failed: ${data.error.message}`
|
|
45
|
+
: `Provider request failed with status ${response.status}.`);
|
|
46
|
+
}
|
|
47
|
+
const message = data.choices?.[0]?.message?.content;
|
|
48
|
+
const rawText = Array.isArray(message)
|
|
49
|
+
? message
|
|
50
|
+
.map((part) => part.text)
|
|
51
|
+
.filter((part) => typeof part === "string")
|
|
52
|
+
.join("")
|
|
53
|
+
: message;
|
|
54
|
+
if (!rawText || rawText.trim().length === 0) {
|
|
55
|
+
throw new ProviderError("Provider returned an empty response.");
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
provider: this.name,
|
|
59
|
+
model: this.config.model,
|
|
60
|
+
rawText
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (error instanceof ProviderError) {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
if (error.name === "AbortError") {
|
|
68
|
+
throw new ProviderError(`Provider request timed out after ${this.config.timeoutMs}ms.`, error);
|
|
69
|
+
}
|
|
70
|
+
throw new ProviderError("Failed to reach AI provider.", error);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
clearTimeout(timeout);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { AIProvider, GenerateObjectRequest, ProviderTextResponse } from "../types/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RiskLevel } from "../types/index.js";
|
|
2
|
+
export interface RiskAssessment {
|
|
3
|
+
level: RiskLevel;
|
|
4
|
+
reasons: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function assessCommandRisk(command: string): RiskAssessment;
|
|
7
|
+
export declare function classifyRisk(command: string): RiskLevel;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { parse as parseShellCommand } from "shell-quote";
|
|
2
|
+
import { HIGH_RISK_RULES, MEDIUM_RISK_RULES } from "./dangerousPatterns.js";
|
|
3
|
+
const SAFE_DELETE_TARGETS = new Set([
|
|
4
|
+
"node_modules",
|
|
5
|
+
"./node_modules",
|
|
6
|
+
"dist",
|
|
7
|
+
"./dist",
|
|
8
|
+
"build",
|
|
9
|
+
"./build",
|
|
10
|
+
".turbo",
|
|
11
|
+
"./.turbo",
|
|
12
|
+
".next",
|
|
13
|
+
"./.next",
|
|
14
|
+
"coverage",
|
|
15
|
+
"./coverage"
|
|
16
|
+
]);
|
|
17
|
+
function tokenizeCommand(command) {
|
|
18
|
+
return parseShellCommand(command)
|
|
19
|
+
.filter((part) => typeof part === "string")
|
|
20
|
+
.map((part) => part.trim())
|
|
21
|
+
.filter((part) => part.length > 0);
|
|
22
|
+
}
|
|
23
|
+
function assessRecursiveDelete(command) {
|
|
24
|
+
if (!/\brm\b/i.test(command) || !/-[^\s]*r/i.test(command) || !/-[^\s]*f/i.test(command)) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const rmSegment = command
|
|
28
|
+
.split(/\s*(?:&&|\|\||;|\|)\s*/)
|
|
29
|
+
.find((segment) => /\brm\b/i.test(segment));
|
|
30
|
+
if (!rmSegment) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const tokens = tokenizeCommand(rmSegment);
|
|
34
|
+
const rmIndex = tokens.findIndex((token) => token === "rm" || token.endsWith("/rm"));
|
|
35
|
+
if (rmIndex === -1) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const targets = [];
|
|
39
|
+
for (const token of tokens.slice(rmIndex + 1)) {
|
|
40
|
+
if (token.startsWith("-")) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
targets.push(token);
|
|
44
|
+
}
|
|
45
|
+
if (targets.length === 0) {
|
|
46
|
+
return {
|
|
47
|
+
level: "high",
|
|
48
|
+
reasons: ["This recursive delete command does not clearly scope its targets."]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (targets.some((target) => [
|
|
52
|
+
"/",
|
|
53
|
+
"/*",
|
|
54
|
+
"~",
|
|
55
|
+
"~/",
|
|
56
|
+
".",
|
|
57
|
+
"./",
|
|
58
|
+
"..",
|
|
59
|
+
"../"
|
|
60
|
+
].includes(target)) ||
|
|
61
|
+
targets.some((target) => target.startsWith("/") || target.startsWith("~")) ||
|
|
62
|
+
targets.some((target) => target.includes("..")) ||
|
|
63
|
+
targets.some((target) => target.includes("*"))) {
|
|
64
|
+
return {
|
|
65
|
+
level: "high",
|
|
66
|
+
reasons: [
|
|
67
|
+
"This command can delete files recursively outside the current project."
|
|
68
|
+
]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (targets.every((target) => SAFE_DELETE_TARGETS.has(target))) {
|
|
72
|
+
return {
|
|
73
|
+
level: "medium",
|
|
74
|
+
reasons: ["This command recursively deletes common project build artifacts."]
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
level: "high",
|
|
79
|
+
reasons: ["This command recursively deletes directories with a broad target scope."]
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function assessCommandRisk(command) {
|
|
83
|
+
const reasons = [];
|
|
84
|
+
const recursiveDeleteRisk = assessRecursiveDelete(command);
|
|
85
|
+
if (recursiveDeleteRisk?.level === "high") {
|
|
86
|
+
return recursiveDeleteRisk;
|
|
87
|
+
}
|
|
88
|
+
for (const rule of HIGH_RISK_RULES) {
|
|
89
|
+
if (rule.pattern.test(command)) {
|
|
90
|
+
reasons.push(rule.reason);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (reasons.length > 0) {
|
|
94
|
+
return {
|
|
95
|
+
level: "high",
|
|
96
|
+
reasons
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (recursiveDeleteRisk?.level === "medium") {
|
|
100
|
+
reasons.push(...recursiveDeleteRisk.reasons);
|
|
101
|
+
}
|
|
102
|
+
for (const rule of MEDIUM_RISK_RULES) {
|
|
103
|
+
if (rule.pattern.test(command)) {
|
|
104
|
+
reasons.push(rule.reason);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
level: reasons.length > 0 ? "medium" : "low",
|
|
109
|
+
reasons
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function classifyRisk(command) {
|
|
113
|
+
return assessCommandRisk(command).level;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=classifyRisk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifyRisk.js","sourceRoot":"","sources":["../../src/safety/classifyRisk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export const HIGH_RISK_RULES = [
|
|
2
|
+
{
|
|
3
|
+
risk: "high",
|
|
4
|
+
pattern: /\b(?:curl|wget)\b[\s\S]*\|\s*(?:sudo\s+)?(?:sh|bash|zsh)\b/i,
|
|
5
|
+
reason: "This command downloads remote content and executes it in a shell."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
risk: "high",
|
|
9
|
+
pattern: /\b(?:dd|mkfs(?:\.\w+)?|fdisk|parted)\b/i,
|
|
10
|
+
reason: "This command can modify or erase disks."
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
risk: "high",
|
|
14
|
+
pattern: /\bchmod\s+-R\s+777\s+\//i,
|
|
15
|
+
reason: "This command recursively grants unsafe permissions at the filesystem root."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
risk: "high",
|
|
19
|
+
pattern: /\bgit\s+reset\s+--hard\b/i,
|
|
20
|
+
reason: "This command can permanently discard uncommitted changes."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
risk: "high",
|
|
24
|
+
pattern: /\b(?:apt(?:-get)?|yum|dnf|pacman|apk|zypper)\s+(?:purge|remove|autoremove)\b/i,
|
|
25
|
+
reason: "This command removes system packages and can affect system stability."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
risk: "high",
|
|
29
|
+
pattern: /\b(?:userdel|groupdel|deluser)\b/i,
|
|
30
|
+
reason: "This command removes system accounts."
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
export const MEDIUM_RISK_RULES = [
|
|
34
|
+
{
|
|
35
|
+
risk: "medium",
|
|
36
|
+
pattern: /\b(?:systemctl|service|rc-service)\s+(?:restart|stop)\b/i,
|
|
37
|
+
reason: "This command changes the state of a system service."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
risk: "medium",
|
|
41
|
+
pattern: /\b(?:launchctl\s+(?:stop|kickstart)|brew\s+services\s+(?:stop|restart))\b/i,
|
|
42
|
+
reason: "This command changes the state of a macOS service."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
risk: "medium",
|
|
46
|
+
pattern: /\b(?:npm|pnpm|yarn|bun)\s+(?:install|add|update|upgrade|remove|uninstall)\b/i,
|
|
47
|
+
reason: "This command changes project dependencies."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
risk: "medium",
|
|
51
|
+
pattern: /\bdocker\s+compose\s+down\b/i,
|
|
52
|
+
reason: "This command stops and removes running containers."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
risk: "medium",
|
|
56
|
+
pattern: /\b(?:kill|killall|pkill)\b/i,
|
|
57
|
+
reason: "This command stops running processes."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
risk: "medium",
|
|
61
|
+
pattern: /\b(?:reboot|shutdown)\b/i,
|
|
62
|
+
reason: "This command disrupts the current system session."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
risk: "medium",
|
|
66
|
+
pattern: /\bgit\s+clean\s+-f/i,
|
|
67
|
+
reason: "This command removes untracked files from the repository."
|
|
68
|
+
}
|
|
69
|
+
];
|
|
70
|
+
//# sourceMappingURL=dangerousPatterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dangerousPatterns.js","sourceRoot":"","sources":["../../src/safety/dangerousPatterns.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,eAAe,GAAe;IACzC;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,6DAA6D;QACtE,MAAM,EAAE,mEAAmE;KAC5E;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,yCAAyC;QAClD,MAAM,EAAE,yCAAyC;KAClD;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,4EAA4E;KACrF;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,2BAA2B;QACpC,MAAM,EAAE,2DAA2D;KACpE;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EACL,+EAA+E;QACjF,MAAM,EAAE,uEAAuE;KAChF;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,mCAAmC;QAC5C,MAAM,EAAE,uCAAuC;KAChD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0DAA0D;QACnE,MAAM,EAAE,qDAAqD;KAC9D;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,4EAA4E;QACrF,MAAM,EAAE,oDAAoD;KAC7D;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,8EAA8E;QACvF,MAAM,EAAE,4CAA4C;KACrD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE,oDAAoD;KAC7D;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,6BAA6B;QACtC,MAAM,EAAE,uCAAuC;KAChD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0BAA0B;QACnC,MAAM,EAAE,mDAAmD;KAC5D;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,qBAAqB;QAC9B,MAAM,EAAE,2DAA2D;KACpE;CACF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PromptAdapter, RiskLevel } from "../types/index.js";
|
|
2
|
+
export declare const HIGH_RISK_CONFIRMATION = "EXECUTE HIGH RISK COMMAND";
|
|
3
|
+
export declare function enforceExecutionPolicy(options: {
|
|
4
|
+
command: string;
|
|
5
|
+
risk: RiskLevel;
|
|
6
|
+
yes: boolean;
|
|
7
|
+
prompt: PromptAdapter;
|
|
8
|
+
reason?: string;
|
|
9
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ExecutionPolicyError, UserCancelledError } from "../utils/errors.js";
|
|
2
|
+
export const HIGH_RISK_CONFIRMATION = "EXECUTE HIGH RISK COMMAND";
|
|
3
|
+
export async function enforceExecutionPolicy(options) {
|
|
4
|
+
const riskLabel = options.risk.toUpperCase();
|
|
5
|
+
if (options.risk === "high") {
|
|
6
|
+
const detail = options.reason ?? "This command can make destructive system or filesystem changes.";
|
|
7
|
+
const confirmation = await options.prompt.text(`Risk: ${riskLabel}\n${detail}\nType ${HIGH_RISK_CONFIRMATION} to continue:`);
|
|
8
|
+
if (confirmation.trim() !== HIGH_RISK_CONFIRMATION) {
|
|
9
|
+
throw new ExecutionPolicyError("High-risk command confirmation was not accepted.");
|
|
10
|
+
}
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (options.yes) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const confirmed = await options.prompt.confirm(`Execute this ${options.risk}-risk command?\n${options.command}`, false);
|
|
17
|
+
if (!confirmed) {
|
|
18
|
+
throw new UserCancelledError("Command execution cancelled.");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=executionPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executionPolicy.js","sourceRoot":"","sources":["../../src/safety/executionPolicy.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAM5C;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE7C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,IAAI,iEAAiE,CAAC;QACtF,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAC5C,SAAS,SAAS,KAAK,MAAM,UAAU,sBAAsB,eAAe,CAC7E,CAAC;QAEF,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,sBAAsB,EAAE,CAAC;YACnD,MAAM,IAAI,oBAAoB,CAAC,kDAAkD,CAAC,CAAC;QACrF,CAAC;QAED,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5C,gBAAgB,OAAO,CAAC,IAAI,mBAAmB,OAAO,CAAC,OAAO,EAAE,EAChE,KAAK,CACN,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export type RiskLevel = "low" | "medium" | "high";
|
|
2
|
+
export type OperatingSystem = "linux" | "macos" | "wsl" | "unix" | "unsupported";
|
|
3
|
+
export type ShellType = "bash" | "zsh" | "sh" | "unknown";
|
|
4
|
+
export type ServiceManager = "systemctl" | "service" | "rc-service" | "launchctl" | "unknown";
|
|
5
|
+
export type ProviderName = "openai" | "anthropic" | "ollama" | "google" | "vllm";
|
|
6
|
+
export interface PlatformContext {
|
|
7
|
+
os: OperatingSystem;
|
|
8
|
+
shell: ShellType;
|
|
9
|
+
serviceManager: ServiceManager;
|
|
10
|
+
cwd: string;
|
|
11
|
+
cwdName: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ProviderCommandPayload {
|
|
14
|
+
command: string;
|
|
15
|
+
explanation: string;
|
|
16
|
+
platformNotes?: string[];
|
|
17
|
+
assumptions?: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface ConversationTurn {
|
|
20
|
+
question: string;
|
|
21
|
+
command: string;
|
|
22
|
+
explanation: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CommandSuggestion extends ProviderCommandPayload {
|
|
25
|
+
question: string;
|
|
26
|
+
risk: RiskLevel;
|
|
27
|
+
platform: PlatformContext;
|
|
28
|
+
}
|
|
29
|
+
export interface AppConfig {
|
|
30
|
+
provider: ProviderName;
|
|
31
|
+
model: string;
|
|
32
|
+
apiKey?: string;
|
|
33
|
+
baseUrl: string;
|
|
34
|
+
timeoutMs: number;
|
|
35
|
+
analytics: boolean;
|
|
36
|
+
analyticsId?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface GenerateObjectRequest {
|
|
39
|
+
systemPrompt: string;
|
|
40
|
+
userPrompt: string;
|
|
41
|
+
schemaName: string;
|
|
42
|
+
schemaDescription: string;
|
|
43
|
+
jsonSchema: Record<string, unknown>;
|
|
44
|
+
temperature?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface ProviderTextResponse {
|
|
47
|
+
provider: string;
|
|
48
|
+
model: string;
|
|
49
|
+
rawText: string;
|
|
50
|
+
}
|
|
51
|
+
export interface AIProvider {
|
|
52
|
+
readonly name: ProviderName;
|
|
53
|
+
generateObject(input: GenerateObjectRequest): Promise<ProviderTextResponse>;
|
|
54
|
+
}
|
|
55
|
+
export interface GenerateCommandOptions {
|
|
56
|
+
question: string;
|
|
57
|
+
platform: PlatformContext;
|
|
58
|
+
provider: AIProvider;
|
|
59
|
+
explainRequested?: boolean;
|
|
60
|
+
history?: ConversationTurn[];
|
|
61
|
+
workspaceContext?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface OutputOptions {
|
|
64
|
+
color: boolean;
|
|
65
|
+
explain: boolean;
|
|
66
|
+
json: boolean;
|
|
67
|
+
}
|
|
68
|
+
export interface CliOptions {
|
|
69
|
+
exec: boolean;
|
|
70
|
+
yes: boolean;
|
|
71
|
+
explain: boolean;
|
|
72
|
+
json: boolean;
|
|
73
|
+
version: boolean;
|
|
74
|
+
shell?: Exclude<ShellType, "unknown">;
|
|
75
|
+
noColor: boolean;
|
|
76
|
+
debug: boolean;
|
|
77
|
+
copy: boolean;
|
|
78
|
+
}
|
|
79
|
+
export interface PromptAdapter {
|
|
80
|
+
confirm(message: string, initial?: boolean): Promise<boolean>;
|
|
81
|
+
text(message: string): Promise<string>;
|
|
82
|
+
}
|
|
83
|
+
export interface AnalyticsClient {
|
|
84
|
+
trackCliStart(payload: {
|
|
85
|
+
os: string;
|
|
86
|
+
shell: string;
|
|
87
|
+
provider: ProviderName;
|
|
88
|
+
mode: "interactive" | "one-shot";
|
|
89
|
+
}): Promise<void>;
|
|
90
|
+
trackPromptSent(payload: {
|
|
91
|
+
os: string;
|
|
92
|
+
shell: string;
|
|
93
|
+
provider: ProviderName;
|
|
94
|
+
mode: "interactive" | "one-shot";
|
|
95
|
+
}): Promise<void>;
|
|
96
|
+
trackError(payload: {
|
|
97
|
+
prompt?: string;
|
|
98
|
+
os?: string;
|
|
99
|
+
shell?: string;
|
|
100
|
+
provider?: ProviderName;
|
|
101
|
+
message: string;
|
|
102
|
+
code?: string;
|
|
103
|
+
time: string;
|
|
104
|
+
}): Promise<void>;
|
|
105
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const APP_NAME = "AI-CMD";
|
|
2
|
+
export declare const APP_VERSION = "1.0.4";
|
|
3
|
+
export declare const BRAND_NAME = "Ottili ONE";
|
|
4
|
+
export declare const BRAND_URL = "ottili.one";
|
|
5
|
+
export declare function formatVersionBanner(): string;
|
|
6
|
+
export declare function formatReplBanner(): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const APP_NAME = "AI-CMD";
|
|
2
|
+
export const APP_VERSION = "1.0.4";
|
|
3
|
+
export const BRAND_NAME = "Ottili ONE";
|
|
4
|
+
export const BRAND_URL = "ottili.one";
|
|
5
|
+
export function formatVersionBanner() {
|
|
6
|
+
return [
|
|
7
|
+
APP_NAME,
|
|
8
|
+
`v. ${APP_VERSION}`,
|
|
9
|
+
`Powered by ${BRAND_NAME}`,
|
|
10
|
+
BRAND_URL
|
|
11
|
+
].join("\n");
|
|
12
|
+
}
|
|
13
|
+
export function formatReplBanner() {
|
|
14
|
+
return `${APP_NAME} | Powered by ${BRAND_NAME} | ${BRAND_URL}`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=branding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../../src/utils/branding.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AAEtC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,QAAQ;QACR,MAAM,WAAW,EAAE;QACnB,cAAc,UAAU,EAAE;QAC1B,SAAS;KACV,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,QAAQ,iBAAiB,UAAU,MAAM,SAAS,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare class AiCmdError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
constructor(code: string, message: string, cause?: unknown);
|
|
4
|
+
}
|
|
5
|
+
export declare class ConfigurationError extends AiCmdError {
|
|
6
|
+
constructor(message: string, cause?: unknown);
|
|
7
|
+
}
|
|
8
|
+
export declare class ProviderError extends AiCmdError {
|
|
9
|
+
constructor(message: string, cause?: unknown);
|
|
10
|
+
}
|
|
11
|
+
export declare class ResponseValidationError extends AiCmdError {
|
|
12
|
+
constructor(message: string, cause?: unknown);
|
|
13
|
+
}
|
|
14
|
+
export declare class ExecutionPolicyError extends AiCmdError {
|
|
15
|
+
constructor(message: string, cause?: unknown);
|
|
16
|
+
}
|
|
17
|
+
export declare class ExecutionError extends AiCmdError {
|
|
18
|
+
constructor(message: string, cause?: unknown);
|
|
19
|
+
}
|
|
20
|
+
export declare class ClipboardError extends AiCmdError {
|
|
21
|
+
constructor(message: string, cause?: unknown);
|
|
22
|
+
}
|
|
23
|
+
export declare class UserCancelledError extends AiCmdError {
|
|
24
|
+
constructor(message?: string);
|
|
25
|
+
}
|
|
26
|
+
export declare function getErrorMessage(error: unknown, debug?: boolean): string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export class AiCmdError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message, cause) {
|
|
4
|
+
super(message, cause ? { cause } : undefined);
|
|
5
|
+
this.name = this.constructor.name;
|
|
6
|
+
this.code = code;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class ConfigurationError extends AiCmdError {
|
|
10
|
+
constructor(message, cause) {
|
|
11
|
+
super("CONFIG_ERROR", message, cause);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class ProviderError extends AiCmdError {
|
|
15
|
+
constructor(message, cause) {
|
|
16
|
+
super("PROVIDER_ERROR", message, cause);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class ResponseValidationError extends AiCmdError {
|
|
20
|
+
constructor(message, cause) {
|
|
21
|
+
super("RESPONSE_VALIDATION_ERROR", message, cause);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export class ExecutionPolicyError extends AiCmdError {
|
|
25
|
+
constructor(message, cause) {
|
|
26
|
+
super("EXECUTION_POLICY_ERROR", message, cause);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class ExecutionError extends AiCmdError {
|
|
30
|
+
constructor(message, cause) {
|
|
31
|
+
super("EXECUTION_ERROR", message, cause);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class ClipboardError extends AiCmdError {
|
|
35
|
+
constructor(message, cause) {
|
|
36
|
+
super("CLIPBOARD_ERROR", message, cause);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export class UserCancelledError extends AiCmdError {
|
|
40
|
+
constructor(message = "Operation cancelled by user.") {
|
|
41
|
+
super("USER_CANCELLED", message);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function getErrorMessage(error, debug = false) {
|
|
45
|
+
if (error instanceof AiCmdError) {
|
|
46
|
+
if (debug && error.cause) {
|
|
47
|
+
return `${error.message}\nCause: ${String(error.cause)}`;
|
|
48
|
+
}
|
|
49
|
+
return error.message;
|
|
50
|
+
}
|
|
51
|
+
if (error instanceof Error) {
|
|
52
|
+
if (debug && error.stack) {
|
|
53
|
+
return error.stack;
|
|
54
|
+
}
|
|
55
|
+
return error.message;
|
|
56
|
+
}
|
|
57
|
+
return String(error);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAS;IAEtB,YAAmB,IAAY,EAAE,OAAe,EAAE,KAAe;QAC/D,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAmB,OAAe,EAAE,KAAe;QACjD,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3C,YAAmB,OAAe,EAAE,KAAe;QACjD,KAAK,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IACrD,YAAmB,OAAe,EAAE,KAAe;QACjD,KAAK,CAAC,2BAA2B,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAmB,OAAe,EAAE,KAAe;QACjD,KAAK,CAAC,wBAAwB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YAAmB,OAAe,EAAE,KAAe;QACjD,KAAK,CAAC,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YAAmB,OAAe,EAAE,KAAe;QACjD,KAAK,CAAC,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAmB,OAAO,GAAG,8BAA8B;QACzD,KAAK,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,KAAK,GAAG,KAAK;IAC3D,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,GAAG,KAAK,CAAC,OAAO,YAAY,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class Logger {
|
|
2
|
+
enabled;
|
|
3
|
+
constructor(enabled) {
|
|
4
|
+
this.enabled = enabled;
|
|
5
|
+
}
|
|
6
|
+
debug(message, data) {
|
|
7
|
+
if (!this.enabled) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const payload = data === undefined ? "" : ` ${JSON.stringify(data, null, 2)}`;
|
|
11
|
+
process.stderr.write(`[debug] ${message}${payload}\n`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,MAAM;IACmB;IAApC,YAAoC,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAG,CAAC;IAEjD,KAAK,CAAC,OAAe,EAAE,IAAc;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GACX,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function normalizeText(value: string): string;
|
|
2
|
+
export declare function normalizeOptionalList(values: string[] | undefined): string[] | undefined;
|
|
3
|
+
export declare function stripMarkdownCodeFence(input: string): string;
|
|
4
|
+
export declare function extractFirstJsonObject(input: string): string;
|
|
5
|
+
export declare function hasMultipleCommandLines(command: string): boolean;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function normalizeText(value) {
|
|
2
|
+
return value.replace(/\s+/g, " ").trim();
|
|
3
|
+
}
|
|
4
|
+
export function normalizeOptionalList(values) {
|
|
5
|
+
if (!values || values.length === 0) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
const items = values
|
|
9
|
+
.map((value) => normalizeText(value))
|
|
10
|
+
.filter((value, index, array) => value.length > 0 && array.indexOf(value) === index);
|
|
11
|
+
return items.length > 0 ? items : undefined;
|
|
12
|
+
}
|
|
13
|
+
export function stripMarkdownCodeFence(input) {
|
|
14
|
+
return input
|
|
15
|
+
.replace(/^```(?:json)?\s*/i, "")
|
|
16
|
+
.replace(/\s*```$/i, "")
|
|
17
|
+
.trim();
|
|
18
|
+
}
|
|
19
|
+
export function extractFirstJsonObject(input) {
|
|
20
|
+
const start = input.indexOf("{");
|
|
21
|
+
const end = input.lastIndexOf("}");
|
|
22
|
+
if (start === -1 || end === -1 || end <= start) {
|
|
23
|
+
return input.trim();
|
|
24
|
+
}
|
|
25
|
+
return input.slice(start, end + 1).trim();
|
|
26
|
+
}
|
|
27
|
+
export function hasMultipleCommandLines(command) {
|
|
28
|
+
return command.split(/\r?\n/).filter((line) => line.trim().length > 0).length > 1;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=strings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/utils/strings.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAA4B;IAE5B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM;SACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;IAEvF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,OAAO,KAAK;SACT,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function inspectWorkspace(cwd: string): Promise<string | undefined>;
|