@zhijiewang/openharness 0.1.0
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/CHANGELOG.md +18 -0
- package/CONTRIBUTING.md +55 -0
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/data/models.json +74 -0
- package/data/prompts/system.md +25 -0
- package/data/skills/code-review.md +19 -0
- package/data/skills/commit.md +17 -0
- package/data/skills/debug.md +24 -0
- package/data/skills/tdd.md +22 -0
- package/dist/Tool.d.ts +45 -0
- package/dist/Tool.d.ts.map +1 -0
- package/dist/Tool.js +62 -0
- package/dist/Tool.js.map +1 -0
- package/dist/components/App.d.ts +16 -0
- package/dist/components/App.d.ts.map +1 -0
- package/dist/components/App.js +25 -0
- package/dist/components/App.js.map +1 -0
- package/dist/components/Messages.d.ts +9 -0
- package/dist/components/Messages.d.ts.map +1 -0
- package/dist/components/Messages.js +23 -0
- package/dist/components/Messages.js.map +1 -0
- package/dist/components/PermissionPrompt.d.ts +9 -0
- package/dist/components/PermissionPrompt.d.ts.map +1 -0
- package/dist/components/PermissionPrompt.js +18 -0
- package/dist/components/PermissionPrompt.js.map +1 -0
- package/dist/components/REPL.d.ts +15 -0
- package/dist/components/REPL.d.ts.map +1 -0
- package/dist/components/REPL.js +114 -0
- package/dist/components/REPL.js.map +1 -0
- package/dist/components/Spinner.d.ts +7 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +7 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/TextInput.d.ts +7 -0
- package/dist/components/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput.js +37 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/ToolCallDisplay.d.ts +12 -0
- package/dist/components/ToolCallDisplay.d.ts.map +1 -0
- package/dist/components/ToolCallDisplay.js +16 -0
- package/dist/components/ToolCallDisplay.js.map +1 -0
- package/dist/harness/cost.d.ts +33 -0
- package/dist/harness/cost.d.ts.map +1 -0
- package/dist/harness/cost.js +68 -0
- package/dist/harness/cost.js.map +1 -0
- package/dist/harness/onboarding.d.ts +17 -0
- package/dist/harness/onboarding.d.ts.map +1 -0
- package/dist/harness/onboarding.js +99 -0
- package/dist/harness/onboarding.js.map +1 -0
- package/dist/harness/rules.d.ts +8 -0
- package/dist/harness/rules.d.ts.map +1 -0
- package/dist/harness/rules.js +66 -0
- package/dist/harness/rules.js.map +1 -0
- package/dist/harness/session.d.ts +24 -0
- package/dist/harness/session.d.ts.map +1 -0
- package/dist/harness/session.js +56 -0
- package/dist/harness/session.js.map +1 -0
- package/dist/main.d.ts +12 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +177 -0
- package/dist/main.js.map +1 -0
- package/dist/providers/anthropic.d.ts +27 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +291 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +41 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +5 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +12 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +57 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +19 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +233 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +21 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +242 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +25 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +278 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/query.d.ts +35 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +185 -0
- package/dist/query.js.map +1 -0
- package/dist/tools/BashTool/index.d.ts +15 -0
- package/dist/tools/BashTool/index.d.ts.map +1 -0
- package/dist/tools/BashTool/index.js +78 -0
- package/dist/tools/BashTool/index.js.map +1 -0
- package/dist/tools/FileEditTool/index.d.ts +21 -0
- package/dist/tools/FileEditTool/index.d.ts.map +1 -0
- package/dist/tools/FileEditTool/index.js +70 -0
- package/dist/tools/FileEditTool/index.js.map +1 -0
- package/dist/tools/FileReadTool/index.d.ts +18 -0
- package/dist/tools/FileReadTool/index.d.ts.map +1 -0
- package/dist/tools/FileReadTool/index.js +63 -0
- package/dist/tools/FileReadTool/index.js.map +1 -0
- package/dist/tools/FileWriteTool/index.d.ts +15 -0
- package/dist/tools/FileWriteTool/index.d.ts.map +1 -0
- package/dist/tools/FileWriteTool/index.js +42 -0
- package/dist/tools/FileWriteTool/index.js.map +1 -0
- package/dist/tools/GlobTool/index.d.ts +15 -0
- package/dist/tools/GlobTool/index.d.ts.map +1 -0
- package/dist/tools/GlobTool/index.js +126 -0
- package/dist/tools/GlobTool/index.js.map +1 -0
- package/dist/tools/GrepTool/index.d.ts +21 -0
- package/dist/tools/GrepTool/index.d.ts.map +1 -0
- package/dist/tools/GrepTool/index.js +125 -0
- package/dist/tools/GrepTool/index.js.map +1 -0
- package/dist/tools/WebFetchTool/index.d.ts +12 -0
- package/dist/tools/WebFetchTool/index.d.ts.map +1 -0
- package/dist/tools/WebFetchTool/index.js +98 -0
- package/dist/tools/WebFetchTool/index.js.map +1 -0
- package/dist/tools.d.ts +9 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +25 -0
- package/dist/tools.js.map +1 -0
- package/dist/types/events.d.ts +49 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +5 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/message.d.ts +27 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +22 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/permissions.d.ts +22 -0
- package/dist/types/permissions.d.ts.map +1 -0
- package/dist/types/permissions.js +27 -0
- package/dist/types/permissions.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as fs from "fs/promises";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
const inputSchema = z.object({
|
|
5
|
+
pattern: z.string(),
|
|
6
|
+
path: z.string().optional(),
|
|
7
|
+
});
|
|
8
|
+
const MAX_RESULTS = 500;
|
|
9
|
+
async function walkDir(dir) {
|
|
10
|
+
const results = [];
|
|
11
|
+
try {
|
|
12
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
15
|
+
continue;
|
|
16
|
+
const full = path.join(dir, entry.name);
|
|
17
|
+
if (entry.isDirectory()) {
|
|
18
|
+
results.push(...(await walkDir(full)));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
results.push(full);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// skip unreadable dirs
|
|
27
|
+
}
|
|
28
|
+
return results;
|
|
29
|
+
}
|
|
30
|
+
function matchGlob(filePath, pattern) {
|
|
31
|
+
// Convert glob pattern to regex
|
|
32
|
+
const regexStr = pattern
|
|
33
|
+
.replace(/\\/g, "/")
|
|
34
|
+
.replace(/\*\*/g, "{{GLOBSTAR}}")
|
|
35
|
+
.replace(/\*/g, "[^/]*")
|
|
36
|
+
.replace(/\?/g, "[^/]")
|
|
37
|
+
.replace(/{{GLOBSTAR}}/g, ".*")
|
|
38
|
+
.replace(/\./g, "\\.");
|
|
39
|
+
// Rebuild with escaped dots applied before star conversion artifacts
|
|
40
|
+
const escaped = pattern
|
|
41
|
+
.replace(/\\/g, "/")
|
|
42
|
+
.split("")
|
|
43
|
+
.map((c, i, arr) => {
|
|
44
|
+
if (c === "*" && arr[i + 1] === "*")
|
|
45
|
+
return null;
|
|
46
|
+
if (c === "*" && arr[i - 1] === "*")
|
|
47
|
+
return "GLOBSTAR";
|
|
48
|
+
if (c === "*")
|
|
49
|
+
return "[^/]*";
|
|
50
|
+
if (c === "?")
|
|
51
|
+
return "[^/]";
|
|
52
|
+
if (c === ".")
|
|
53
|
+
return "\\.";
|
|
54
|
+
return c;
|
|
55
|
+
})
|
|
56
|
+
.filter((c) => c !== null)
|
|
57
|
+
.join("")
|
|
58
|
+
.replace(/GLOBSTAR/g, ".*");
|
|
59
|
+
try {
|
|
60
|
+
const re = new RegExp("^" + escaped + "$");
|
|
61
|
+
return re.test(filePath.replace(/\\/g, "/"));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return filePath.includes(pattern.replace(/\*/g, ""));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export const GlobTool = {
|
|
68
|
+
name: "Glob",
|
|
69
|
+
description: "Find files matching a glob pattern.",
|
|
70
|
+
inputSchema,
|
|
71
|
+
riskLevel: "low",
|
|
72
|
+
isReadOnly() {
|
|
73
|
+
return true;
|
|
74
|
+
},
|
|
75
|
+
isConcurrencySafe() {
|
|
76
|
+
return true;
|
|
77
|
+
},
|
|
78
|
+
async call(input, context) {
|
|
79
|
+
const baseDir = input.path
|
|
80
|
+
? path.isAbsolute(input.path)
|
|
81
|
+
? input.path
|
|
82
|
+
: path.resolve(context.workingDir, input.path)
|
|
83
|
+
: context.workingDir;
|
|
84
|
+
try {
|
|
85
|
+
// Try Node 22+ fs.glob first
|
|
86
|
+
if (typeof fs.glob === "function") {
|
|
87
|
+
const matches = [];
|
|
88
|
+
for await (const entry of fs.glob(input.pattern, { cwd: baseDir })) {
|
|
89
|
+
matches.push(entry);
|
|
90
|
+
if (matches.length >= MAX_RESULTS)
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
matches.sort();
|
|
94
|
+
return {
|
|
95
|
+
output: matches.length
|
|
96
|
+
? matches.join("\n")
|
|
97
|
+
: "No files matched the pattern.",
|
|
98
|
+
isError: false,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Fallback: recursive readdir + pattern match
|
|
102
|
+
const allFiles = await walkDir(baseDir);
|
|
103
|
+
const relative = allFiles.map((f) => path.relative(baseDir, f));
|
|
104
|
+
const matched = relative
|
|
105
|
+
.filter((f) => matchGlob(f, input.pattern))
|
|
106
|
+
.slice(0, MAX_RESULTS)
|
|
107
|
+
.sort();
|
|
108
|
+
return {
|
|
109
|
+
output: matched.length
|
|
110
|
+
? matched.join("\n")
|
|
111
|
+
: "No files matched the pattern.",
|
|
112
|
+
isError: false,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
return { output: `Error: ${err.message}`, isError: true };
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
prompt() {
|
|
120
|
+
return `Find files matching a glob pattern. Parameters:
|
|
121
|
+
- pattern (string, required): Glob pattern (e.g. "**/*.ts", "src/**/*.js").
|
|
122
|
+
- path (string, optional): Base directory to search in (default: working directory).
|
|
123
|
+
Returns up to 500 matching file paths, sorted alphabetically.`;
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/GlobTool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
pattern: z.ZodString;
|
|
5
|
+
path: z.ZodOptional<z.ZodString>;
|
|
6
|
+
glob: z.ZodOptional<z.ZodString>;
|
|
7
|
+
context: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
pattern: string;
|
|
10
|
+
path?: string | undefined;
|
|
11
|
+
glob?: string | undefined;
|
|
12
|
+
context?: number | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
pattern: string;
|
|
15
|
+
path?: string | undefined;
|
|
16
|
+
glob?: string | undefined;
|
|
17
|
+
context?: number | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export declare const GrepTool: Tool<typeof inputSchema>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/GrepTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAEnE,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAKf,CAAC;AAkCH,eAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,OAAO,WAAW,CAqF7C,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as fs from "fs/promises";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
const inputSchema = z.object({
|
|
5
|
+
pattern: z.string(),
|
|
6
|
+
path: z.string().optional(),
|
|
7
|
+
glob: z.string().optional(),
|
|
8
|
+
context: z.number().optional(),
|
|
9
|
+
});
|
|
10
|
+
const MAX_MATCHES = 100;
|
|
11
|
+
async function walkDir(dir, globFilter) {
|
|
12
|
+
const results = [];
|
|
13
|
+
try {
|
|
14
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
17
|
+
continue;
|
|
18
|
+
const full = path.join(dir, entry.name);
|
|
19
|
+
if (entry.isDirectory()) {
|
|
20
|
+
results.push(...(await walkDir(full, globFilter)));
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
if (globFilter) {
|
|
24
|
+
// Simple extension-based filter from glob like "*.ts" or "*.{ts,tsx}"
|
|
25
|
+
const ext = path.extname(entry.name);
|
|
26
|
+
const bracketMatch = globFilter.match(/\*\.(?:\{([^}]+)\}|(\w+))/);
|
|
27
|
+
if (bracketMatch) {
|
|
28
|
+
const exts = (bracketMatch[1] || bracketMatch[2])
|
|
29
|
+
.split(",")
|
|
30
|
+
.map((e) => "." + e.trim());
|
|
31
|
+
if (!exts.includes(ext))
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
results.push(full);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// skip unreadable
|
|
41
|
+
}
|
|
42
|
+
return results;
|
|
43
|
+
}
|
|
44
|
+
export const GrepTool = {
|
|
45
|
+
name: "Grep",
|
|
46
|
+
description: "Search file contents using a regex pattern.",
|
|
47
|
+
inputSchema,
|
|
48
|
+
riskLevel: "low",
|
|
49
|
+
isReadOnly() {
|
|
50
|
+
return true;
|
|
51
|
+
},
|
|
52
|
+
isConcurrencySafe() {
|
|
53
|
+
return true;
|
|
54
|
+
},
|
|
55
|
+
async call(input, context) {
|
|
56
|
+
const baseDir = input.path
|
|
57
|
+
? path.isAbsolute(input.path)
|
|
58
|
+
? input.path
|
|
59
|
+
: path.resolve(context.workingDir, input.path)
|
|
60
|
+
: context.workingDir;
|
|
61
|
+
const ctxLines = input.context ?? 0;
|
|
62
|
+
let re;
|
|
63
|
+
try {
|
|
64
|
+
re = new RegExp(input.pattern, "g");
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return { output: `Invalid regex: ${err.message}`, isError: true };
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const files = await walkDir(baseDir, input.glob);
|
|
71
|
+
const matches = [];
|
|
72
|
+
for (const file of files) {
|
|
73
|
+
if (matches.length >= MAX_MATCHES)
|
|
74
|
+
break;
|
|
75
|
+
try {
|
|
76
|
+
const content = await fs.readFile(file, "utf-8");
|
|
77
|
+
const lines = content.split("\n");
|
|
78
|
+
const relPath = path.relative(context.workingDir, file);
|
|
79
|
+
for (let i = 0; i < lines.length; i++) {
|
|
80
|
+
if (matches.length >= MAX_MATCHES)
|
|
81
|
+
break;
|
|
82
|
+
re.lastIndex = 0;
|
|
83
|
+
if (re.test(lines[i])) {
|
|
84
|
+
const start = Math.max(0, i - ctxLines);
|
|
85
|
+
const end = Math.min(lines.length - 1, i + ctxLines);
|
|
86
|
+
if (ctxLines > 0) {
|
|
87
|
+
for (let j = start; j <= end; j++) {
|
|
88
|
+
const prefix = j === i ? ">" : " ";
|
|
89
|
+
matches.push(`${relPath}:${j + 1}:${prefix} ${lines[j]}`);
|
|
90
|
+
}
|
|
91
|
+
matches.push("--");
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
matches.push(`${relPath}:${i + 1}: ${lines[i]}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// skip binary/unreadable files
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (matches.length === 0) {
|
|
104
|
+
return { output: "No matches found.", isError: false };
|
|
105
|
+
}
|
|
106
|
+
let output = matches.join("\n");
|
|
107
|
+
if (matches.length >= MAX_MATCHES) {
|
|
108
|
+
output += "\n... (limited to 100 matches)";
|
|
109
|
+
}
|
|
110
|
+
return { output, isError: false };
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
return { output: `Error: ${err.message}`, isError: true };
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
prompt() {
|
|
117
|
+
return `Search file contents using a regular expression. Parameters:
|
|
118
|
+
- pattern (string, required): Regex pattern to search for.
|
|
119
|
+
- path (string, optional): Directory to search in (default: working directory).
|
|
120
|
+
- glob (string, optional): Glob filter for files (e.g. "*.ts").
|
|
121
|
+
- context (number, optional): Lines of context to show around matches.
|
|
122
|
+
Returns up to 100 matches in file:line format.`;
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/GrepTool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
url: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
url: string;
|
|
7
|
+
}, {
|
|
8
|
+
url: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const WebFetchTool: Tool<typeof inputSchema>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/WebFetchTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAEnE,QAAA,MAAM,WAAW;;;;;;EAEf,CAAC;AA4CH,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,OAAO,WAAW,CAkEjD,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const inputSchema = z.object({
|
|
3
|
+
url: z.string(),
|
|
4
|
+
});
|
|
5
|
+
const MAX_OUTPUT = 50_000;
|
|
6
|
+
const PRIVATE_IP_PATTERNS = [
|
|
7
|
+
/^127\./,
|
|
8
|
+
/^10\./,
|
|
9
|
+
/^172\.(1[6-9]|2\d|3[01])\./,
|
|
10
|
+
/^192\.168\./,
|
|
11
|
+
/^0\./,
|
|
12
|
+
/^169\.254\./,
|
|
13
|
+
/^::1$/,
|
|
14
|
+
/^fc00:/i,
|
|
15
|
+
/^fd/i,
|
|
16
|
+
/^fe80:/i,
|
|
17
|
+
];
|
|
18
|
+
function isBlockedHost(hostname) {
|
|
19
|
+
if (hostname === "localhost" ||
|
|
20
|
+
hostname === "0.0.0.0" ||
|
|
21
|
+
hostname.endsWith(".local") ||
|
|
22
|
+
hostname.endsWith(".internal")) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
return PRIVATE_IP_PATTERNS.some((re) => re.test(hostname));
|
|
26
|
+
}
|
|
27
|
+
function stripHtml(html) {
|
|
28
|
+
return html
|
|
29
|
+
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
30
|
+
.replace(/<style[\s\S]*?<\/style>/gi, "")
|
|
31
|
+
.replace(/<[^>]+>/g, " ")
|
|
32
|
+
.replace(/ /g, " ")
|
|
33
|
+
.replace(/&/g, "&")
|
|
34
|
+
.replace(/</g, "<")
|
|
35
|
+
.replace(/>/g, ">")
|
|
36
|
+
.replace(/"/g, '"')
|
|
37
|
+
.replace(/'/g, "'")
|
|
38
|
+
.replace(/\s+/g, " ")
|
|
39
|
+
.trim();
|
|
40
|
+
}
|
|
41
|
+
export const WebFetchTool = {
|
|
42
|
+
name: "WebFetch",
|
|
43
|
+
description: "Fetch a URL and return its content as text.",
|
|
44
|
+
inputSchema,
|
|
45
|
+
riskLevel: "medium",
|
|
46
|
+
isReadOnly() {
|
|
47
|
+
return true;
|
|
48
|
+
},
|
|
49
|
+
isConcurrencySafe() {
|
|
50
|
+
return true;
|
|
51
|
+
},
|
|
52
|
+
async call(input, _context) {
|
|
53
|
+
let url;
|
|
54
|
+
try {
|
|
55
|
+
url = new URL(input.url);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { output: "Error: Invalid URL.", isError: true };
|
|
59
|
+
}
|
|
60
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
61
|
+
return { output: "Error: Only http and https URLs are allowed.", isError: true };
|
|
62
|
+
}
|
|
63
|
+
if (isBlockedHost(url.hostname)) {
|
|
64
|
+
return { output: "Error: Access to private/internal hosts is blocked.", isError: true };
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const response = await fetch(input.url, {
|
|
68
|
+
headers: { "User-Agent": "OpenHarness/1.0" },
|
|
69
|
+
redirect: "error", // Block redirects — prevents SSRF via redirect to private IPs
|
|
70
|
+
signal: AbortSignal.timeout(30_000),
|
|
71
|
+
});
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
return {
|
|
74
|
+
output: `Error: HTTP ${response.status} ${response.statusText}`,
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
let text = await response.text();
|
|
79
|
+
const contentType = response.headers.get("content-type") || "";
|
|
80
|
+
if (contentType.includes("html")) {
|
|
81
|
+
text = stripHtml(text);
|
|
82
|
+
}
|
|
83
|
+
if (text.length > MAX_OUTPUT) {
|
|
84
|
+
text = text.slice(0, MAX_OUTPUT) + "\n... [truncated]";
|
|
85
|
+
}
|
|
86
|
+
return { output: text, isError: false };
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return { output: `Error fetching URL: ${err.message}`, isError: true };
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
prompt() {
|
|
93
|
+
return `Fetch a URL and return its text content. Parameters:
|
|
94
|
+
- url (string, required): The URL to fetch (http/https only).
|
|
95
|
+
HTML tags are stripped. Output is truncated at 50K characters. Private/internal hosts are blocked for security.`;
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/WebFetchTool/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AASvC;;GAEG;AACH,wBAAgB,WAAW,IAAI,KAAK,CAUnC"}
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool registry — aggregates all available tools.
|
|
3
|
+
*/
|
|
4
|
+
import { BashTool } from "./tools/BashTool/index.js";
|
|
5
|
+
import { FileReadTool } from "./tools/FileReadTool/index.js";
|
|
6
|
+
import { FileWriteTool } from "./tools/FileWriteTool/index.js";
|
|
7
|
+
import { FileEditTool } from "./tools/FileEditTool/index.js";
|
|
8
|
+
import { GlobTool } from "./tools/GlobTool/index.js";
|
|
9
|
+
import { GrepTool } from "./tools/GrepTool/index.js";
|
|
10
|
+
import { WebFetchTool } from "./tools/WebFetchTool/index.js";
|
|
11
|
+
/**
|
|
12
|
+
* Returns all registered tools.
|
|
13
|
+
*/
|
|
14
|
+
export function getAllTools() {
|
|
15
|
+
return [
|
|
16
|
+
BashTool,
|
|
17
|
+
FileReadTool,
|
|
18
|
+
FileWriteTool,
|
|
19
|
+
FileEditTool,
|
|
20
|
+
GlobTool,
|
|
21
|
+
GrepTool,
|
|
22
|
+
WebFetchTool,
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming event types for the agent loop.
|
|
3
|
+
*/
|
|
4
|
+
export type TextDelta = {
|
|
5
|
+
readonly type: "text_delta";
|
|
6
|
+
readonly content: string;
|
|
7
|
+
};
|
|
8
|
+
export type ToolCallStart = {
|
|
9
|
+
readonly type: "tool_call_start";
|
|
10
|
+
readonly toolName: string;
|
|
11
|
+
readonly callId: string;
|
|
12
|
+
};
|
|
13
|
+
export type ToolCallComplete = {
|
|
14
|
+
readonly type: "tool_call_complete";
|
|
15
|
+
readonly callId: string;
|
|
16
|
+
readonly toolName: string;
|
|
17
|
+
readonly arguments: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
export type ToolCallEnd = {
|
|
20
|
+
readonly type: "tool_call_end";
|
|
21
|
+
readonly callId: string;
|
|
22
|
+
readonly output: string;
|
|
23
|
+
readonly isError: boolean;
|
|
24
|
+
};
|
|
25
|
+
export type PermissionRequest = {
|
|
26
|
+
readonly type: "permission_request";
|
|
27
|
+
readonly toolName: string;
|
|
28
|
+
readonly callId: string;
|
|
29
|
+
readonly description: string;
|
|
30
|
+
readonly riskLevel: string;
|
|
31
|
+
};
|
|
32
|
+
export type CostUpdate = {
|
|
33
|
+
readonly type: "cost_update";
|
|
34
|
+
readonly inputTokens: number;
|
|
35
|
+
readonly outputTokens: number;
|
|
36
|
+
readonly cost: number;
|
|
37
|
+
readonly model: string;
|
|
38
|
+
};
|
|
39
|
+
export type TurnComplete = {
|
|
40
|
+
readonly type: "turn_complete";
|
|
41
|
+
readonly reason: string;
|
|
42
|
+
readonly sessionId?: string;
|
|
43
|
+
};
|
|
44
|
+
export type ErrorEvent = {
|
|
45
|
+
readonly type: "error";
|
|
46
|
+
readonly message: string;
|
|
47
|
+
};
|
|
48
|
+
export type StreamEvent = TextDelta | ToolCallStart | ToolCallComplete | ToolCallEnd | PermissionRequest | CostUpdate | TurnComplete | ErrorEvent;
|
|
49
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,WAAW,GACX,iBAAiB,GACjB,UAAU,GACV,YAAY,GACZ,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core message types — mirrors Claude Code's types/message.ts pattern.
|
|
3
|
+
*/
|
|
4
|
+
export type Role = "user" | "assistant" | "system" | "tool";
|
|
5
|
+
export type ToolCall = {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly toolName: string;
|
|
8
|
+
readonly arguments: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
export type ToolResult = {
|
|
11
|
+
readonly callId: string;
|
|
12
|
+
readonly output: string;
|
|
13
|
+
readonly isError: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type Message = {
|
|
16
|
+
readonly role: Role;
|
|
17
|
+
readonly content: string;
|
|
18
|
+
readonly toolCalls?: readonly ToolCall[];
|
|
19
|
+
readonly toolResults?: readonly ToolResult[];
|
|
20
|
+
readonly uuid: string;
|
|
21
|
+
readonly timestamp: number;
|
|
22
|
+
};
|
|
23
|
+
export declare function createMessage(role: Role, content: string, extra?: Partial<Pick<Message, "toolCalls" | "toolResults">>): Message;
|
|
24
|
+
export declare function createUserMessage(content: string): Message;
|
|
25
|
+
export declare function createAssistantMessage(content: string, toolCalls?: readonly ToolCall[]): Message;
|
|
26
|
+
export declare function createToolResultMessage(result: ToolResult): Message;
|
|
27
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,CAAC,GAC1D,OAAO,CAQT;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,GAC9B,OAAO,CAET;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEnE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core message types — mirrors Claude Code's types/message.ts pattern.
|
|
3
|
+
*/
|
|
4
|
+
export function createMessage(role, content, extra) {
|
|
5
|
+
return {
|
|
6
|
+
role,
|
|
7
|
+
content,
|
|
8
|
+
uuid: crypto.randomUUID(),
|
|
9
|
+
timestamp: Date.now(),
|
|
10
|
+
...extra,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function createUserMessage(content) {
|
|
14
|
+
return createMessage("user", content);
|
|
15
|
+
}
|
|
16
|
+
export function createAssistantMessage(content, toolCalls) {
|
|
17
|
+
return createMessage("assistant", content, { toolCalls });
|
|
18
|
+
}
|
|
19
|
+
export function createToolResultMessage(result) {
|
|
20
|
+
return createMessage("tool", result.output, { toolResults: [result] });
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,MAAM,UAAU,aAAa,CAC3B,IAAU,EACV,OAAe,EACf,KAA2D;IAE3D,OAAO;QACL,IAAI;QACJ,OAAO;QACP,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE;QACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,KAAK;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,SAA+B;IAE/B,OAAO,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAkB;IACxD,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission types — mirrors Claude Code's ToolPermissionContext.
|
|
3
|
+
*/
|
|
4
|
+
export type PermissionMode = "ask" | "trust" | "deny";
|
|
5
|
+
export type RiskLevel = "low" | "medium" | "high";
|
|
6
|
+
export type PermissionResult = {
|
|
7
|
+
readonly allowed: boolean;
|
|
8
|
+
readonly reason: string;
|
|
9
|
+
readonly riskLevel: RiskLevel;
|
|
10
|
+
};
|
|
11
|
+
export type AskUserFn = (toolName: string, description: string) => Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Permission gate — decides if a tool call should be allowed.
|
|
14
|
+
*
|
|
15
|
+
* Decision matrix (mirrors Claude Code):
|
|
16
|
+
* - LOW risk + read-only: always allow
|
|
17
|
+
* - trust mode: always allow
|
|
18
|
+
* - deny mode: only allow LOW read-only
|
|
19
|
+
* - ask mode: prompt user for MEDIUM/HIGH risk
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkPermission(mode: PermissionMode, riskLevel: RiskLevel, isReadOnly: boolean): PermissionResult;
|
|
22
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/types/permissions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,CACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,OAAO,GAClB,gBAAgB,CAgBlB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission types — mirrors Claude Code's ToolPermissionContext.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Permission gate — decides if a tool call should be allowed.
|
|
6
|
+
*
|
|
7
|
+
* Decision matrix (mirrors Claude Code):
|
|
8
|
+
* - LOW risk + read-only: always allow
|
|
9
|
+
* - trust mode: always allow
|
|
10
|
+
* - deny mode: only allow LOW read-only
|
|
11
|
+
* - ask mode: prompt user for MEDIUM/HIGH risk
|
|
12
|
+
*/
|
|
13
|
+
export function checkPermission(mode, riskLevel, isReadOnly) {
|
|
14
|
+
// Always allow low-risk read-only
|
|
15
|
+
if (riskLevel === "low" && isReadOnly) {
|
|
16
|
+
return { allowed: true, reason: "auto-approved", riskLevel };
|
|
17
|
+
}
|
|
18
|
+
if (mode === "trust") {
|
|
19
|
+
return { allowed: true, reason: "trust-mode", riskLevel };
|
|
20
|
+
}
|
|
21
|
+
if (mode === "deny") {
|
|
22
|
+
return { allowed: false, reason: "deny-mode", riskLevel };
|
|
23
|
+
}
|
|
24
|
+
// ask mode — needs user approval (handled by caller)
|
|
25
|
+
return { allowed: false, reason: "needs-approval", riskLevel };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/types/permissions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAoB,EACpB,SAAoB,EACpB,UAAmB;IAEnB,kCAAkC;IAClC,IAAI,SAAS,KAAK,KAAK,IAAI,UAAU,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;IAC/D,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,qDAAqD;IACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;AACjE,CAAC"}
|