halfcopilot 1.0.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/LICENSE +21 -0
- package/README.md +148 -0
- package/bin/halfcop.js +22 -0
- package/dist/index.js +3 -0
- package/dist/packages/cli/dist/halfcop.d.ts +6 -0
- package/dist/packages/cli/dist/halfcop.d.ts.map +1 -0
- package/dist/packages/cli/dist/halfcop.js +448 -0
- package/dist/packages/cli/dist/halfcop.js.map +1 -0
- package/dist/packages/cli/dist/index.d.ts +3 -0
- package/dist/packages/cli/dist/index.d.ts.map +1 -0
- package/dist/packages/cli/dist/index.js +251 -0
- package/dist/packages/cli/dist/index.js.map +1 -0
- package/dist/packages/cli/dist/tui/app.d.ts +11 -0
- package/dist/packages/cli/dist/tui/app.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/app.js +72 -0
- package/dist/packages/cli/dist/tui/app.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/ChatView.d.ts +12 -0
- package/dist/packages/cli/dist/tui/components/ChatView.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/ChatView.js +6 -0
- package/dist/packages/cli/dist/tui/components/ChatView.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/InputField.d.ts +8 -0
- package/dist/packages/cli/dist/tui/components/InputField.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/InputField.js +22 -0
- package/dist/packages/cli/dist/tui/components/InputField.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.d.ts +13 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.js +6 -0
- package/dist/packages/cli/dist/tui/components/StatusBar.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.d.ts +10 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.js +14 -0
- package/dist/packages/cli/dist/tui/components/ToolApproval.js.map +1 -0
- package/dist/packages/cli/dist/tui/components/index.d.ts +5 -0
- package/dist/packages/cli/dist/tui/components/index.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/components/index.js +5 -0
- package/dist/packages/cli/dist/tui/components/index.js.map +1 -0
- package/dist/packages/cli/dist/tui/index.d.ts +3 -0
- package/dist/packages/cli/dist/tui/index.d.ts.map +1 -0
- package/dist/packages/cli/dist/tui/index.js +3 -0
- package/dist/packages/cli/dist/tui/index.js.map +1 -0
- package/dist/packages/config/dist/defaults.d.ts +3 -0
- package/dist/packages/config/dist/defaults.d.ts.map +1 -0
- package/dist/packages/config/dist/defaults.js +30 -0
- package/dist/packages/config/dist/defaults.js.map +1 -0
- package/dist/packages/config/dist/index.d.ts +4 -0
- package/dist/packages/config/dist/index.d.ts.map +1 -0
- package/dist/packages/config/dist/index.js +4 -0
- package/dist/packages/config/dist/index.js.map +1 -0
- package/dist/packages/config/dist/loader.d.ts +4 -0
- package/dist/packages/config/dist/loader.d.ts.map +1 -0
- package/dist/packages/config/dist/loader.js +80 -0
- package/dist/packages/config/dist/loader.js.map +1 -0
- package/dist/packages/config/dist/schema.d.ts +323 -0
- package/dist/packages/config/dist/schema.d.ts.map +1 -0
- package/dist/packages/config/dist/schema.js +56 -0
- package/dist/packages/config/dist/schema.js.map +1 -0
- package/dist/packages/core/dist/agent-loop.d.ts +19 -0
- package/dist/packages/core/dist/agent-loop.d.ts.map +1 -0
- package/dist/packages/core/dist/agent-loop.js +140 -0
- package/dist/packages/core/dist/agent-loop.js.map +1 -0
- package/dist/packages/core/dist/conversation.d.ts +22 -0
- package/dist/packages/core/dist/conversation.d.ts.map +1 -0
- package/dist/packages/core/dist/conversation.js +66 -0
- package/dist/packages/core/dist/conversation.js.map +1 -0
- package/dist/packages/core/dist/hybrid/index.d.ts +4 -0
- package/dist/packages/core/dist/hybrid/index.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/index.js +4 -0
- package/dist/packages/core/dist/hybrid/index.js.map +1 -0
- package/dist/packages/core/dist/hybrid/mapper.d.ts +11 -0
- package/dist/packages/core/dist/hybrid/mapper.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/mapper.js +53 -0
- package/dist/packages/core/dist/hybrid/mapper.js.map +1 -0
- package/dist/packages/core/dist/hybrid/parser.d.ts +36 -0
- package/dist/packages/core/dist/hybrid/parser.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/parser.js +118 -0
- package/dist/packages/core/dist/hybrid/parser.js.map +1 -0
- package/dist/packages/core/dist/hybrid/provider.d.ts +14 -0
- package/dist/packages/core/dist/hybrid/provider.d.ts.map +1 -0
- package/dist/packages/core/dist/hybrid/provider.js +109 -0
- package/dist/packages/core/dist/hybrid/provider.js.map +1 -0
- package/dist/packages/core/dist/index.d.ts +5 -0
- package/dist/packages/core/dist/index.d.ts.map +1 -0
- package/dist/packages/core/dist/index.js +5 -0
- package/dist/packages/core/dist/index.js.map +1 -0
- package/dist/packages/core/dist/types.d.ts +36 -0
- package/dist/packages/core/dist/types.d.ts.map +1 -0
- package/dist/packages/core/dist/types.js +11 -0
- package/dist/packages/core/dist/types.js.map +1 -0
- package/dist/packages/mcp/dist/adapter.d.ts +15 -0
- package/dist/packages/mcp/dist/adapter.d.ts.map +1 -0
- package/dist/packages/mcp/dist/adapter.js +44 -0
- package/dist/packages/mcp/dist/adapter.js.map +1 -0
- package/dist/packages/mcp/dist/client.d.ts +31 -0
- package/dist/packages/mcp/dist/client.d.ts.map +1 -0
- package/dist/packages/mcp/dist/client.js +140 -0
- package/dist/packages/mcp/dist/client.js.map +1 -0
- package/dist/packages/mcp/dist/index.d.ts +6 -0
- package/dist/packages/mcp/dist/index.d.ts.map +1 -0
- package/dist/packages/mcp/dist/index.js +4 -0
- package/dist/packages/mcp/dist/index.js.map +1 -0
- package/dist/packages/mcp/dist/transport.d.ts +47 -0
- package/dist/packages/mcp/dist/transport.d.ts.map +1 -0
- package/dist/packages/mcp/dist/transport.js +123 -0
- package/dist/packages/mcp/dist/transport.js.map +1 -0
- package/dist/packages/mcp/dist/types.d.ts +64 -0
- package/dist/packages/mcp/dist/types.d.ts.map +1 -0
- package/dist/packages/mcp/dist/types.js +2 -0
- package/dist/packages/mcp/dist/types.js.map +1 -0
- package/dist/packages/memory/dist/index.d.ts +3 -0
- package/dist/packages/memory/dist/index.d.ts.map +1 -0
- package/dist/packages/memory/dist/index.js +2 -0
- package/dist/packages/memory/dist/index.js.map +1 -0
- package/dist/packages/memory/dist/store.d.ts +15 -0
- package/dist/packages/memory/dist/store.d.ts.map +1 -0
- package/dist/packages/memory/dist/store.js +93 -0
- package/dist/packages/memory/dist/store.js.map +1 -0
- package/dist/packages/memory/dist/types.d.ts +14 -0
- package/dist/packages/memory/dist/types.d.ts.map +1 -0
- package/dist/packages/memory/dist/types.js +2 -0
- package/dist/packages/memory/dist/types.js.map +1 -0
- package/dist/packages/provider/dist/anthropic.d.ts +21 -0
- package/dist/packages/provider/dist/anthropic.d.ts.map +1 -0
- package/dist/packages/provider/dist/anthropic.js +148 -0
- package/dist/packages/provider/dist/anthropic.js.map +1 -0
- package/dist/packages/provider/dist/base.d.ts +16 -0
- package/dist/packages/provider/dist/base.d.ts.map +1 -0
- package/dist/packages/provider/dist/base.js +9 -0
- package/dist/packages/provider/dist/base.js.map +1 -0
- package/dist/packages/provider/dist/index.d.ts +6 -0
- package/dist/packages/provider/dist/index.d.ts.map +1 -0
- package/dist/packages/provider/dist/index.js +5 -0
- package/dist/packages/provider/dist/index.js.map +1 -0
- package/dist/packages/provider/dist/openai.d.ts +23 -0
- package/dist/packages/provider/dist/openai.d.ts.map +1 -0
- package/dist/packages/provider/dist/openai.js +171 -0
- package/dist/packages/provider/dist/openai.js.map +1 -0
- package/dist/packages/provider/dist/registry.d.ts +11 -0
- package/dist/packages/provider/dist/registry.d.ts.map +1 -0
- package/dist/packages/provider/dist/registry.js +61 -0
- package/dist/packages/provider/dist/registry.js.map +1 -0
- package/dist/packages/provider/dist/types.d.ts +84 -0
- package/dist/packages/provider/dist/types.d.ts.map +1 -0
- package/dist/packages/provider/dist/types.js +3 -0
- package/dist/packages/provider/dist/types.js.map +1 -0
- package/dist/packages/shared/dist/errors.d.ts +18 -0
- package/dist/packages/shared/dist/errors.d.ts.map +1 -0
- package/dist/packages/shared/dist/errors.js +35 -0
- package/dist/packages/shared/dist/errors.js.map +1 -0
- package/dist/packages/shared/dist/index.d.ts +4 -0
- package/dist/packages/shared/dist/index.d.ts.map +1 -0
- package/dist/packages/shared/dist/index.js +4 -0
- package/dist/packages/shared/dist/index.js.map +1 -0
- package/dist/packages/shared/dist/logger.d.ts +18 -0
- package/dist/packages/shared/dist/logger.d.ts.map +1 -0
- package/dist/packages/shared/dist/logger.js +39 -0
- package/dist/packages/shared/dist/logger.js.map +1 -0
- package/dist/packages/shared/dist/utils.d.ts +5 -0
- package/dist/packages/shared/dist/utils.d.ts.map +1 -0
- package/dist/packages/shared/dist/utils.js +27 -0
- package/dist/packages/shared/dist/utils.js.map +1 -0
- package/dist/packages/skills/dist/builtins.d.ts +8 -0
- package/dist/packages/skills/dist/builtins.d.ts.map +1 -0
- package/dist/packages/skills/dist/builtins.js +144 -0
- package/dist/packages/skills/dist/builtins.js.map +1 -0
- package/dist/packages/skills/dist/index.d.ts +4 -0
- package/dist/packages/skills/dist/index.d.ts.map +1 -0
- package/dist/packages/skills/dist/index.js +3 -0
- package/dist/packages/skills/dist/index.js.map +1 -0
- package/dist/packages/skills/dist/registry.d.ts +13 -0
- package/dist/packages/skills/dist/registry.d.ts.map +1 -0
- package/dist/packages/skills/dist/registry.js +93 -0
- package/dist/packages/skills/dist/registry.js.map +1 -0
- package/dist/packages/skills/dist/types.d.ts +35 -0
- package/dist/packages/skills/dist/types.d.ts.map +1 -0
- package/dist/packages/skills/dist/types.js +2 -0
- package/dist/packages/skills/dist/types.js.map +1 -0
- package/dist/packages/tools/dist/builtins/bash.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/bash.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/bash.js +38 -0
- package/dist/packages/tools/dist/builtins/bash.js.map +1 -0
- package/dist/packages/tools/dist/builtins/file-edit.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/file-edit.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/file-edit.js +45 -0
- package/dist/packages/tools/dist/builtins/file-edit.js.map +1 -0
- package/dist/packages/tools/dist/builtins/file-read.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/file-read.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/file-read.js +39 -0
- package/dist/packages/tools/dist/builtins/file-read.js.map +1 -0
- package/dist/packages/tools/dist/builtins/file-write.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/file-write.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/file-write.js +30 -0
- package/dist/packages/tools/dist/builtins/file-write.js.map +1 -0
- package/dist/packages/tools/dist/builtins/glob.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/glob.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/glob.js +33 -0
- package/dist/packages/tools/dist/builtins/glob.js.map +1 -0
- package/dist/packages/tools/dist/builtins/grep.d.ts +3 -0
- package/dist/packages/tools/dist/builtins/grep.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/grep.js +59 -0
- package/dist/packages/tools/dist/builtins/grep.js.map +1 -0
- package/dist/packages/tools/dist/builtins/index.d.ts +10 -0
- package/dist/packages/tools/dist/builtins/index.d.ts.map +1 -0
- package/dist/packages/tools/dist/builtins/index.js +18 -0
- package/dist/packages/tools/dist/builtins/index.js.map +1 -0
- package/dist/packages/tools/dist/executor.d.ts +11 -0
- package/dist/packages/tools/dist/executor.d.ts.map +1 -0
- package/dist/packages/tools/dist/executor.js +36 -0
- package/dist/packages/tools/dist/executor.js.map +1 -0
- package/dist/packages/tools/dist/index.d.ts +7 -0
- package/dist/packages/tools/dist/index.d.ts.map +1 -0
- package/dist/packages/tools/dist/index.js +6 -0
- package/dist/packages/tools/dist/index.js.map +1 -0
- package/dist/packages/tools/dist/permission.d.ts +17 -0
- package/dist/packages/tools/dist/permission.d.ts.map +1 -0
- package/dist/packages/tools/dist/permission.js +74 -0
- package/dist/packages/tools/dist/permission.js.map +1 -0
- package/dist/packages/tools/dist/registry.d.ts +13 -0
- package/dist/packages/tools/dist/registry.d.ts.map +1 -0
- package/dist/packages/tools/dist/registry.js +34 -0
- package/dist/packages/tools/dist/registry.js.map +1 -0
- package/dist/packages/tools/dist/types.d.ts +28 -0
- package/dist/packages/tools/dist/types.d.ts.map +1 -0
- package/dist/packages/tools/dist/types.js +16 -0
- package/dist/packages/tools/dist/types.js.map +1 -0
- package/package.json +47 -0
- package/scripts/postinstall.mjs +24 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export class SkillRegistry {
|
|
2
|
+
skills = new Map();
|
|
3
|
+
register(skill) {
|
|
4
|
+
this.skills.set(skill.name, skill);
|
|
5
|
+
}
|
|
6
|
+
unregister(name) {
|
|
7
|
+
this.skills.delete(name);
|
|
8
|
+
}
|
|
9
|
+
get(name) {
|
|
10
|
+
return this.skills.get(name);
|
|
11
|
+
}
|
|
12
|
+
has(name) {
|
|
13
|
+
return this.skills.has(name);
|
|
14
|
+
}
|
|
15
|
+
list() {
|
|
16
|
+
return Array.from(this.skills.values()).map(({ name, description, instructions, resources, triggers, metadata }) => ({
|
|
17
|
+
name,
|
|
18
|
+
description,
|
|
19
|
+
instructions,
|
|
20
|
+
resources,
|
|
21
|
+
triggers,
|
|
22
|
+
metadata,
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
findByTrigger(input) {
|
|
26
|
+
const results = [];
|
|
27
|
+
const lowerInput = input.toLowerCase();
|
|
28
|
+
for (const skill of this.skills.values()) {
|
|
29
|
+
if (!skill.triggers)
|
|
30
|
+
continue;
|
|
31
|
+
for (const trigger of skill.triggers) {
|
|
32
|
+
switch (trigger.type) {
|
|
33
|
+
case 'keyword':
|
|
34
|
+
if (lowerInput.includes(trigger.value.toLowerCase())) {
|
|
35
|
+
results.push(skill);
|
|
36
|
+
}
|
|
37
|
+
break;
|
|
38
|
+
case 'pattern':
|
|
39
|
+
try {
|
|
40
|
+
const regex = new RegExp(trigger.value, 'i');
|
|
41
|
+
if (regex.test(input)) {
|
|
42
|
+
results.push(skill);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Invalid regex
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
case 'intent':
|
|
50
|
+
// Simple intent matching
|
|
51
|
+
if (this.matchIntent(trigger.value, lowerInput)) {
|
|
52
|
+
results.push(skill);
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
async execute(name, context, input) {
|
|
61
|
+
const skill = this.skills.get(name);
|
|
62
|
+
if (!skill) {
|
|
63
|
+
return {
|
|
64
|
+
success: false,
|
|
65
|
+
output: `Skill "${name}" not found`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
return await skill.execute(context, input);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
output: err instanceof Error ? err.message : String(err),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
matchIntent(intent, input) {
|
|
79
|
+
const intentKeywords = {
|
|
80
|
+
'create-file': ['create', 'new file', 'make file', 'write file'],
|
|
81
|
+
'read-file': ['read', 'show', 'display', 'view', 'open'],
|
|
82
|
+
'edit-file': ['edit', 'modify', 'change', 'update', 'fix'],
|
|
83
|
+
'run-command': ['run', 'execute', 'start', 'launch'],
|
|
84
|
+
'search': ['find', 'search', 'look for', 'grep'],
|
|
85
|
+
'test': ['test', 'check', 'verify', 'validate'],
|
|
86
|
+
'build': ['build', 'compile', 'bundle', 'package'],
|
|
87
|
+
'deploy': ['deploy', 'publish', 'release', 'ship'],
|
|
88
|
+
};
|
|
89
|
+
const keywords = intentKeywords[intent] ?? [intent];
|
|
90
|
+
return keywords.some(kw => input.includes(kw));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface SkillDefinition {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
instructions: string;
|
|
5
|
+
resources?: SkillResource[];
|
|
6
|
+
triggers?: SkillTrigger[];
|
|
7
|
+
metadata?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface SkillResource {
|
|
10
|
+
type: 'file' | 'url' | 'template';
|
|
11
|
+
path: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SkillTrigger {
|
|
15
|
+
type: 'keyword' | 'pattern' | 'intent';
|
|
16
|
+
value: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SkillContext {
|
|
19
|
+
projectRoot: string;
|
|
20
|
+
workingDirectory: string;
|
|
21
|
+
sessionId: string;
|
|
22
|
+
variables: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface SkillResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
output: string;
|
|
27
|
+
artifacts?: Array<{
|
|
28
|
+
path: string;
|
|
29
|
+
content: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export interface Skill extends SkillDefinition {
|
|
33
|
+
execute(context: SkillContext, input: Record<string, unknown>): Promise<SkillResult>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,KAAM,SAAQ,eAAe;IAC5C,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACtF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/builtins/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAIjE,wBAAgB,cAAc,IAAI,IAAI,CAmCrC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { PermissionLevel } from '../types.js';
|
|
2
|
+
import { exec } from 'node:child_process';
|
|
3
|
+
export function createBashTool() {
|
|
4
|
+
return {
|
|
5
|
+
name: 'bash',
|
|
6
|
+
description: 'Execute a bash command and return its output',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
command: { type: 'string', description: 'The bash command to execute' },
|
|
11
|
+
timeout: { type: 'number', description: 'Timeout in milliseconds (default: 120000)' },
|
|
12
|
+
cwd: { type: 'string', description: 'Working directory' },
|
|
13
|
+
},
|
|
14
|
+
required: ['command'],
|
|
15
|
+
},
|
|
16
|
+
permissionLevel: PermissionLevel.UNSAFE,
|
|
17
|
+
async execute(input, context) {
|
|
18
|
+
const { command, timeout = 120000, cwd } = input;
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
exec(command, { timeout, cwd: cwd ?? context.workingDirectory, maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
21
|
+
let output = '';
|
|
22
|
+
if (stdout)
|
|
23
|
+
output += stdout;
|
|
24
|
+
if (stderr)
|
|
25
|
+
output += (output ? '\n' : '') + stderr;
|
|
26
|
+
if (error) {
|
|
27
|
+
output += (output ? '\n' : '') + `Exit code: ${error.code ?? 1}`;
|
|
28
|
+
resolve({ output, error: output });
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
resolve({ output: output || '(no output)' });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/builtins/bash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,8CAA8C;QAC3D,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;gBACvE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;gBACrF,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;aAC1D;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,eAAe,EAAE,eAAe,CAAC,MAAM;QACvC,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;YAChE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,KAI1C,CAAC;YACF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;oBACtH,IAAI,MAAM,GAAG,EAAE,CAAC;oBAChB,IAAI,MAAM;wBAAE,MAAM,IAAI,MAAM,CAAC;oBAC7B,IAAI,MAAM;wBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;oBACpD,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;wBACjE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBACrC,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-edit.d.ts","sourceRoot":"","sources":["../../src/builtins/file-edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAIjE,wBAAgB,kBAAkB,IAAI,IAAI,CA+CzC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { PermissionLevel } from '../types.js';
|
|
2
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
export function createFileEditTool() {
|
|
4
|
+
return {
|
|
5
|
+
name: 'file_edit',
|
|
6
|
+
description: 'Replace an exact string in a file with a new string',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
path: { type: 'string', description: 'Absolute path to the file' },
|
|
11
|
+
oldText: { type: 'string', description: 'Exact text to find and replace' },
|
|
12
|
+
newText: { type: 'string', description: 'Replacement text' },
|
|
13
|
+
replaceAll: { type: 'boolean', description: 'Replace all occurrences' },
|
|
14
|
+
},
|
|
15
|
+
required: ['path', 'oldText', 'newText'],
|
|
16
|
+
},
|
|
17
|
+
permissionLevel: PermissionLevel.WARN,
|
|
18
|
+
async execute(input, context) {
|
|
19
|
+
const { path, oldText, newText, replaceAll } = input;
|
|
20
|
+
try {
|
|
21
|
+
const content = readFileSync(path, 'utf-8');
|
|
22
|
+
if (!content.includes(oldText)) {
|
|
23
|
+
return { output: '', error: `Text not found in ${path}: "${oldText.slice(0, 50)}..."` };
|
|
24
|
+
}
|
|
25
|
+
let newContent;
|
|
26
|
+
if (replaceAll) {
|
|
27
|
+
newContent = content.split(oldText).join(newText);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const idx = content.indexOf(oldText);
|
|
31
|
+
if (content.indexOf(oldText, idx + 1) !== -1) {
|
|
32
|
+
return { output: '', error: `Multiple occurrences found in ${path}. Use replaceAll: true or provide more context.` };
|
|
33
|
+
}
|
|
34
|
+
newContent = content.slice(0, idx) + newText + content.slice(idx + oldText.length);
|
|
35
|
+
}
|
|
36
|
+
writeFileSync(path, newContent, 'utf-8');
|
|
37
|
+
return { output: `Successfully edited ${path}` };
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return { output: '', error: err instanceof Error ? err.message : String(err) };
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=file-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-edit.js","sourceRoot":"","sources":["../../src/builtins/file-edit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBAClE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;gBAC1E,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;gBAC5D,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE;aACxE;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;SACzC;QACD,eAAe,EAAE,eAAe,CAAC,IAAI;QACrC,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;YAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAK9C,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAE5C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,IAAI,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC1F,CAAC;gBAED,IAAI,UAAkB,CAAC;gBACvB,IAAI,UAAU,EAAE,CAAC;oBACf,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACrC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;wBAC7C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,iCAAiC,IAAI,iDAAiD,EAAE,CAAC;oBACvH,CAAC;oBACD,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrF,CAAC;gBAED,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBACzC,OAAO,EAAE,MAAM,EAAE,uBAAuB,IAAI,EAAE,EAAE,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-read.d.ts","sourceRoot":"","sources":["../../src/builtins/file-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAIjE,wBAAgB,kBAAkB,IAAI,IAAI,CAuCzC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { PermissionLevel } from '../types.js';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
export function createFileReadTool() {
|
|
4
|
+
return {
|
|
5
|
+
name: 'file_read',
|
|
6
|
+
description: 'Read the contents of a file at the given path',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
path: { type: 'string', description: 'Absolute path to the file' },
|
|
11
|
+
offset: { type: 'number', description: 'Line offset to start reading from' },
|
|
12
|
+
limit: { type: 'number', description: 'Maximum number of lines to read' },
|
|
13
|
+
showLineNumbers: { type: 'boolean', description: 'Show line numbers' },
|
|
14
|
+
},
|
|
15
|
+
required: ['path'],
|
|
16
|
+
},
|
|
17
|
+
permissionLevel: PermissionLevel.SAFE,
|
|
18
|
+
async execute(input, context) {
|
|
19
|
+
const { path, offset, limit, showLineNumbers } = input;
|
|
20
|
+
try {
|
|
21
|
+
const content = readFileSync(path, 'utf-8');
|
|
22
|
+
let lines = content.split('\n');
|
|
23
|
+
if (offset !== undefined)
|
|
24
|
+
lines = lines.slice(offset);
|
|
25
|
+
if (limit !== undefined)
|
|
26
|
+
lines = lines.slice(0, limit);
|
|
27
|
+
if (showLineNumbers) {
|
|
28
|
+
const startLine = (offset ?? 0) + 1;
|
|
29
|
+
return { output: lines.map((line, i) => `${startLine + i}\t${line}`).join('\n') };
|
|
30
|
+
}
|
|
31
|
+
return { output: lines.join('\n') };
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return { output: '', error: err instanceof Error ? err.message : String(err) };
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=file-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-read.js","sourceRoot":"","sources":["../../src/builtins/file-read.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,+CAA+C;QAC5D,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBAClE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;gBAC5E,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;gBACzE,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE;aACvE;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;QACD,eAAe,EAAE,eAAe,CAAC,IAAI;QACrC,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;YAChE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,KAKhD,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC5C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEhC,IAAI,MAAM,KAAK,SAAS;oBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtD,IAAI,KAAK,KAAK,SAAS;oBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAEvD,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBACpC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpF,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-write.d.ts","sourceRoot":"","sources":["../../src/builtins/file-write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAKjE,wBAAgB,mBAAmB,IAAI,IAAI,CAwB1C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PermissionLevel } from '../types.js';
|
|
2
|
+
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
export function createFileWriteTool() {
|
|
5
|
+
return {
|
|
6
|
+
name: 'file_write',
|
|
7
|
+
description: 'Write content to a file, creating parent directories if needed',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
type: 'object',
|
|
10
|
+
properties: {
|
|
11
|
+
path: { type: 'string', description: 'Absolute path to the file' },
|
|
12
|
+
content: { type: 'string', description: 'Content to write' },
|
|
13
|
+
},
|
|
14
|
+
required: ['path', 'content'],
|
|
15
|
+
},
|
|
16
|
+
permissionLevel: PermissionLevel.WARN,
|
|
17
|
+
async execute(input, context) {
|
|
18
|
+
const { path, content } = input;
|
|
19
|
+
try {
|
|
20
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
21
|
+
writeFileSync(path, content, 'utf-8');
|
|
22
|
+
return { output: `Successfully wrote to ${path}` };
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
return { output: '', error: err instanceof Error ? err.message : String(err) };
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=file-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-write.js","sourceRoot":"","sources":["../../src/builtins/file-write.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gEAAgE;QAC7E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBAClE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;aAC7D;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;SAC9B;QACD,eAAe,EAAE,eAAe,CAAC,IAAI;QACrC,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;YAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAA0C,CAAC;YACrE,IAAI,CAAC;gBACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtC,OAAO,EAAE,MAAM,EAAE,yBAAyB,IAAI,EAAE,EAAE,CAAC;YACrD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/builtins/glob.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAGjE,wBAAgB,cAAc,IAAI,IAAI,CA+BrC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { PermissionLevel } from '../types.js';
|
|
2
|
+
export function createGlobTool() {
|
|
3
|
+
return {
|
|
4
|
+
name: 'glob',
|
|
5
|
+
description: 'Find files matching a glob pattern',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
pattern: { type: 'string', description: 'Glob pattern (e.g. **/*.ts)' },
|
|
10
|
+
path: { type: 'string', description: 'Base directory to search in' },
|
|
11
|
+
},
|
|
12
|
+
required: ['pattern'],
|
|
13
|
+
},
|
|
14
|
+
permissionLevel: PermissionLevel.SAFE,
|
|
15
|
+
async execute(input, context) {
|
|
16
|
+
const { pattern, path = '.' } = input;
|
|
17
|
+
try {
|
|
18
|
+
const { glob } = await import('node:fs/promises');
|
|
19
|
+
const entries = [];
|
|
20
|
+
for await (const entry of glob(pattern, { cwd: path, withFileTypes: false })) {
|
|
21
|
+
entries.push(entry);
|
|
22
|
+
}
|
|
23
|
+
if (entries.length === 0)
|
|
24
|
+
return { output: 'No files found matching pattern' };
|
|
25
|
+
return { output: entries.join('\n') };
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
return { output: '', error: err instanceof Error ? err.message : String(err) };
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/builtins/glob.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,oCAAoC;QACjD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;gBACvE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;aACrE;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,eAAe,EAAE,eAAe,CAAC,IAAI;QACrC,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;YAChE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE,GAAG,KAA2C,CAAC;YAE5E,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAa,EAAE,CAAC;gBAE7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;oBAC7E,OAAO,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;gBAChC,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;gBAC/E,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/builtins/grep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAIjE,wBAAgB,cAAc,IAAI,IAAI,CAoDrC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { PermissionLevel } from '../types.js';
|
|
2
|
+
import { execSync } from 'node:child_process';
|
|
3
|
+
export function createGrepTool() {
|
|
4
|
+
return {
|
|
5
|
+
name: 'grep',
|
|
6
|
+
description: 'Search for a pattern in files using ripgrep or grep',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
pattern: { type: 'string', description: 'Regex pattern to search for' },
|
|
11
|
+
path: { type: 'string', description: 'Directory or file to search in' },
|
|
12
|
+
glob: { type: 'string', description: 'File glob pattern to filter' },
|
|
13
|
+
ignoreCase: { type: 'boolean', description: 'Case insensitive search' },
|
|
14
|
+
},
|
|
15
|
+
required: ['pattern'],
|
|
16
|
+
},
|
|
17
|
+
permissionLevel: PermissionLevel.SAFE,
|
|
18
|
+
async execute(input, context) {
|
|
19
|
+
const { pattern, path = '.', glob, ignoreCase } = input;
|
|
20
|
+
let cmd = 'grep';
|
|
21
|
+
try {
|
|
22
|
+
execSync('which rg', { stdio: 'ignore' });
|
|
23
|
+
cmd = 'rg';
|
|
24
|
+
}
|
|
25
|
+
catch { /* fallback to grep */ }
|
|
26
|
+
const args = [];
|
|
27
|
+
if (cmd === 'rg') {
|
|
28
|
+
args.push('--no-heading', '-n');
|
|
29
|
+
if (ignoreCase)
|
|
30
|
+
args.push('-i');
|
|
31
|
+
if (glob)
|
|
32
|
+
args.push('--glob', glob);
|
|
33
|
+
args.push('--', pattern, path);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
args.push('-n');
|
|
37
|
+
if (ignoreCase)
|
|
38
|
+
args.push('-i');
|
|
39
|
+
if (glob)
|
|
40
|
+
args.push('--include', glob);
|
|
41
|
+
args.push('-r', '--', pattern, path);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const result = execSync(`${cmd} ${args.map(a => `'${a}'`).join(' ')}`, {
|
|
45
|
+
encoding: 'utf-8',
|
|
46
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
47
|
+
timeout: 30000,
|
|
48
|
+
});
|
|
49
|
+
return { output: result.slice(0, 50000) || 'No matches found' };
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err.status === 1)
|
|
53
|
+
return { output: 'No matches found' };
|
|
54
|
+
return { output: '', error: err.message };
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=grep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/builtins/grep.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;gBACvE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;gBACvE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;gBACpE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE;aACxE;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,eAAe,EAAE,eAAe,CAAC,IAAI;QACrC,KAAK,CAAC,OAAO,CAAC,KAA8B,EAAE,OAAoB;YAChE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,KAKjD,CAAC;YAEF,IAAI,GAAG,GAAG,MAAM,CAAC;YACjB,IAAI,CAAC;gBAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC;YAE/F,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBAChC,IAAI,UAAU;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,IAAI;oBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,IAAI,UAAU;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,IAAI;oBAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;oBACrE,QAAQ,EAAE,OAAO;oBACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;oBAC3B,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC;YAClE,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBAC5D,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tool } from '../types.js';
|
|
2
|
+
import { createFileReadTool } from './file-read.js';
|
|
3
|
+
import { createFileWriteTool } from './file-write.js';
|
|
4
|
+
import { createFileEditTool } from './file-edit.js';
|
|
5
|
+
import { createBashTool } from './bash.js';
|
|
6
|
+
import { createGrepTool } from './grep.js';
|
|
7
|
+
import { createGlobTool } from './glob.js';
|
|
8
|
+
export declare function createBuiltinTools(): Tool[];
|
|
9
|
+
export { createFileReadTool, createFileWriteTool, createFileEditTool, createBashTool, createGrepTool, createGlobTool };
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAS3C;AAED,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createFileReadTool } from './file-read.js';
|
|
2
|
+
import { createFileWriteTool } from './file-write.js';
|
|
3
|
+
import { createFileEditTool } from './file-edit.js';
|
|
4
|
+
import { createBashTool } from './bash.js';
|
|
5
|
+
import { createGrepTool } from './grep.js';
|
|
6
|
+
import { createGlobTool } from './glob.js';
|
|
7
|
+
export function createBuiltinTools() {
|
|
8
|
+
return [
|
|
9
|
+
createFileReadTool(),
|
|
10
|
+
createFileWriteTool(),
|
|
11
|
+
createFileEditTool(),
|
|
12
|
+
createBashTool(),
|
|
13
|
+
createGrepTool(),
|
|
14
|
+
createGlobTool(),
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
export { createFileReadTool, createFileWriteTool, createFileEditTool, createBashTool, createGrepTool, createGlobTool };
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,kBAAkB,EAAE;QACpB,mBAAmB,EAAE;QACrB,kBAAkB,EAAE;QACpB,cAAc,EAAE;QAChB,cAAc,EAAE;QAChB,cAAc,EAAE;KACjB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolRegistry } from './registry.js';
|
|
2
|
+
import type { PermissionChecker } from './permission.js';
|
|
3
|
+
import type { ToolResult, ToolContext } from './types.js';
|
|
4
|
+
export declare class ToolExecutor {
|
|
5
|
+
private registry;
|
|
6
|
+
private permissions;
|
|
7
|
+
private onApprovalNeeded?;
|
|
8
|
+
constructor(registry: ToolRegistry, permissions: PermissionChecker, onApprovalNeeded?: ((toolName: string, input: Record<string, unknown>) => Promise<boolean>) | undefined);
|
|
9
|
+
execute(name: string, input: Record<string, unknown>, context: ToolContext): Promise<ToolResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,gBAAgB,CAAC;gBAFjB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,iBAAiB,EAC9B,gBAAgB,CAAC,GAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,aAAA;IAG7F,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAyBvG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { PermissionError } from '@halfcopilot/shared';
|
|
2
|
+
export class ToolExecutor {
|
|
3
|
+
registry;
|
|
4
|
+
permissions;
|
|
5
|
+
onApprovalNeeded;
|
|
6
|
+
constructor(registry, permissions, onApprovalNeeded) {
|
|
7
|
+
this.registry = registry;
|
|
8
|
+
this.permissions = permissions;
|
|
9
|
+
this.onApprovalNeeded = onApprovalNeeded;
|
|
10
|
+
}
|
|
11
|
+
async execute(name, input, context) {
|
|
12
|
+
const tool = this.registry.get(name);
|
|
13
|
+
const permResult = await this.permissions.check(name, input, tool.permissionLevel);
|
|
14
|
+
if (!permResult.approved) {
|
|
15
|
+
if (permResult.reason === 'requires_confirmation' && this.onApprovalNeeded) {
|
|
16
|
+
const userApproved = await this.onApprovalNeeded(name, input);
|
|
17
|
+
if (!userApproved) {
|
|
18
|
+
throw new PermissionError(name, 'User denied permission');
|
|
19
|
+
}
|
|
20
|
+
this.permissions.approve(name, input);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
throw new PermissionError(name, permResult.reason ?? 'Permission denied');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const result = await tool.execute(input, context);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
32
|
+
return { output: error.message, error: error.message };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,OAAO,YAAY;IAEb;IACA;IACA;IAHV,YACU,QAAsB,EACtB,WAA8B,EAC9B,gBAAyF;QAFzF,aAAQ,GAAR,QAAQ,CAAc;QACtB,gBAAW,GAAX,WAAW,CAAmB;QAC9B,qBAAgB,GAAhB,gBAAgB,CAAyE;IAChG,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAA8B,EAAE,OAAoB;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEnF,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACzB,IAAI,UAAU,CAAC,MAAM,KAAK,uBAAuB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;gBAC5D,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,IAAI,mBAAmB,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { Tool, ToolResult, ToolContext, PermissionResult } from './types.js';
|
|
2
|
+
export { PermissionLevel, TOOL_PERMISSIONS } from './types.js';
|
|
3
|
+
export { ToolRegistry } from './registry.js';
|
|
4
|
+
export { ToolExecutor } from './executor.js';
|
|
5
|
+
export { PermissionChecker, type PermissionConfig } from './permission.js';
|
|
6
|
+
export { createBuiltinTools, createFileReadTool, createFileWriteTool, createFileEditTool, createBashTool, createGrepTool, createGlobTool } from './builtins/index.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { PermissionLevel, TOOL_PERMISSIONS } from './types.js';
|
|
2
|
+
export { ToolRegistry } from './registry.js';
|
|
3
|
+
export { ToolExecutor } from './executor.js';
|
|
4
|
+
export { PermissionChecker } from './permission.js';
|
|
5
|
+
export { createBuiltinTools, createFileReadTool, createFileWriteTool, createFileEditTool, createBashTool, createGrepTool, createGlobTool } from './builtins/index.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAyB,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|