azerclaw 1.0.1 → 1.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/bin/azerclaw.ts +348 -18
- package/dist/bin/azerclaw.d.ts +14 -8
- package/dist/bin/azerclaw.d.ts.map +1 -1
- package/dist/bin/azerclaw.js +311 -17
- package/dist/bin/azerclaw.js.map +1 -1
- package/dist/src/cli/animations/fish.d.ts +10 -7
- package/dist/src/cli/animations/fish.d.ts.map +1 -1
- package/dist/src/cli/animations/fish.js +116 -122
- package/dist/src/cli/animations/fish.js.map +1 -1
- package/dist/src/cli/commands/chat.d.ts +16 -0
- package/dist/src/cli/commands/chat.d.ts.map +1 -1
- package/dist/src/cli/commands/chat.js +142 -33
- package/dist/src/cli/commands/chat.js.map +1 -1
- package/dist/src/cli/commands/config.d.ts +1 -0
- package/dist/src/cli/commands/config.d.ts.map +1 -1
- package/dist/src/cli/commands/config.js +28 -11
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/onboard.d.ts +12 -1
- package/dist/src/cli/commands/onboard.d.ts.map +1 -1
- package/dist/src/cli/commands/onboard.js +384 -64
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/run.d.ts.map +1 -1
- package/dist/src/cli/commands/run.js +0 -2
- package/dist/src/cli/commands/run.js.map +1 -1
- package/dist/src/cli/commands/settings.d.ts +31 -0
- package/dist/src/cli/commands/settings.d.ts.map +1 -0
- package/dist/src/cli/commands/settings.js +566 -0
- package/dist/src/cli/commands/settings.js.map +1 -0
- package/dist/src/cli/commands/tui.d.ts +3 -0
- package/dist/src/cli/commands/tui.d.ts.map +1 -1
- package/dist/src/cli/commands/tui.js +197 -69
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/config/manager.d.ts +110 -8
- package/dist/src/config/manager.d.ts.map +1 -1
- package/dist/src/config/manager.js +331 -10
- package/dist/src/config/manager.js.map +1 -1
- package/dist/src/config/schema.d.ts +303 -1
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +70 -7
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/runtime.d.ts +8 -0
- package/dist/src/core/runtime.d.ts.map +1 -1
- package/dist/src/core/runtime.js +36 -14
- package/dist/src/core/runtime.js.map +1 -1
- package/dist/src/core/server.d.ts +15 -0
- package/dist/src/core/server.d.ts.map +1 -0
- package/dist/src/core/server.js +127 -0
- package/dist/src/core/server.js.map +1 -0
- package/dist/src/providers/router.d.ts.map +1 -1
- package/dist/src/providers/router.js +16 -0
- package/dist/src/providers/router.js.map +1 -1
- package/dist/src/tools/advanced.d.ts.map +1 -1
- package/dist/src/tools/advanced.js +3 -0
- package/dist/src/tools/advanced.js.map +1 -1
- package/dist/src/tools/filesystem.d.ts.map +1 -1
- package/dist/src/tools/filesystem.js +4 -0
- package/dist/src/tools/filesystem.js.map +1 -1
- package/dist/src/tools/index.d.ts +9 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +73 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/loader.d.ts +14 -0
- package/dist/src/tools/loader.d.ts.map +1 -0
- package/dist/src/tools/loader.js +115 -0
- package/dist/src/tools/loader.js.map +1 -0
- package/dist/src/tools/registry.d.ts +27 -0
- package/dist/src/tools/registry.d.ts.map +1 -1
- package/dist/src/tools/registry.js +80 -5
- package/dist/src/tools/registry.js.map +1 -1
- package/dist/src/tools/shell.d.ts.map +1 -1
- package/dist/src/tools/shell.js +1 -0
- package/dist/src/tools/shell.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ToolLoader = void 0;
|
|
37
|
+
exports.getToolLoader = getToolLoader;
|
|
38
|
+
const fs = __importStar(require("fs/promises"));
|
|
39
|
+
const fs_1 = require("fs");
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const registry_1 = require("./registry");
|
|
42
|
+
class ToolLoader {
|
|
43
|
+
registry = (0, registry_1.getToolRegistry)();
|
|
44
|
+
/**
|
|
45
|
+
* Dynamically loads all JS/TS tools from a given directory.
|
|
46
|
+
*/
|
|
47
|
+
async loadFromDirectory(directory) {
|
|
48
|
+
try {
|
|
49
|
+
if (!(0, fs_1.existsSync)(directory)) {
|
|
50
|
+
// Silently skip if directory doesn't exist (normal for default plugin paths)
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const stats = await fs.stat(directory);
|
|
54
|
+
if (!stats.isDirectory()) {
|
|
55
|
+
console.warn(`[ToolLoader] Path is not a directory: ${directory}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const files = await fs.readdir(directory);
|
|
59
|
+
let count = 0;
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
if (file.endsWith('.js') || (file.endsWith('.ts') && !file.endsWith('.d.ts'))) {
|
|
62
|
+
// Skip internal tool files
|
|
63
|
+
if (['index.ts', 'loader.ts', 'registry.ts', 'shell.ts', 'filesystem.ts', 'advanced.ts'].includes(file)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const fullPath = path.join(directory, file);
|
|
67
|
+
await this.loadPlugin(fullPath);
|
|
68
|
+
count++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (count > 0) {
|
|
72
|
+
console.log(`[ToolLoader] Loaded ${count} tools from ${directory}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(`[ToolLoader] Failed to load tools from directory ${directory}:`, error.message);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Loads a single tool plugin from a file.
|
|
81
|
+
* Expects the default export to be an object conforming to the Tool interface.
|
|
82
|
+
*/
|
|
83
|
+
async loadPlugin(filePath) {
|
|
84
|
+
try {
|
|
85
|
+
// Resolve absolute path for dynamic import
|
|
86
|
+
const absolutePath = path.resolve(filePath);
|
|
87
|
+
// Use dynamic import to load the module
|
|
88
|
+
// Note: for .ts files, we expect them to be pre-compiled or handled by ts-node/tsx
|
|
89
|
+
const module = await import(absolutePath);
|
|
90
|
+
const tool = module.default || module;
|
|
91
|
+
if (!tool || !tool.name || typeof tool.execute !== 'function') {
|
|
92
|
+
console.warn(`[ToolLoader] Invalid plugin format in ${filePath}. Must export a Tool object.`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Ensure version exists (fallback for legacy plugins)
|
|
96
|
+
if (!tool.version) {
|
|
97
|
+
tool.version = '0.0.1-legacy';
|
|
98
|
+
}
|
|
99
|
+
this.registry.register(tool);
|
|
100
|
+
console.log(`[ToolLoader] Registered tool: ${tool.name} (v${tool.version})`);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`[ToolLoader] Failed to load plugin ${filePath}:`, error.message);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ToolLoader = ToolLoader;
|
|
108
|
+
// Singleton for easy access
|
|
109
|
+
let instance = null;
|
|
110
|
+
function getToolLoader() {
|
|
111
|
+
if (!instance)
|
|
112
|
+
instance = new ToolLoader();
|
|
113
|
+
return instance;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/tools/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,21 +6,48 @@ export interface ToolResult {
|
|
|
6
6
|
success: boolean;
|
|
7
7
|
output: string;
|
|
8
8
|
error?: string;
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface ToolExecutionContext {
|
|
12
|
+
agentId?: string;
|
|
13
|
+
timeoutMs?: number;
|
|
9
14
|
}
|
|
10
15
|
export interface Tool {
|
|
11
16
|
name: string;
|
|
12
17
|
description: string;
|
|
18
|
+
version: string;
|
|
19
|
+
author?: string;
|
|
20
|
+
license?: string;
|
|
21
|
+
tags?: string[];
|
|
13
22
|
parameters: Record<string, unknown>;
|
|
14
23
|
execute(args: Record<string, unknown>): Promise<ToolResult>;
|
|
15
24
|
}
|
|
16
25
|
declare class ToolRegistry {
|
|
17
26
|
private tools;
|
|
27
|
+
private sandboxEnabled;
|
|
28
|
+
constructor(options?: {
|
|
29
|
+
sandbox?: boolean;
|
|
30
|
+
});
|
|
18
31
|
register(tool: Tool): void;
|
|
19
32
|
get(name: string): Tool | undefined;
|
|
20
33
|
getAll(): Tool[];
|
|
21
34
|
getDefinitions(): any[];
|
|
22
35
|
execute(name: string, args: Record<string, unknown>): Promise<ToolResult>;
|
|
36
|
+
private executeInSandbox;
|
|
37
|
+
private logTelemetry;
|
|
23
38
|
}
|
|
24
39
|
export declare function getToolRegistry(): ToolRegistry;
|
|
25
40
|
export { ToolRegistry };
|
|
41
|
+
/**
|
|
42
|
+
* Mock Tool Registry for unit testing.
|
|
43
|
+
* Does not load any tools by default and allows easy inspection of calls.
|
|
44
|
+
*/
|
|
45
|
+
export declare class MockToolRegistry extends ToolRegistry {
|
|
46
|
+
calls: Array<{
|
|
47
|
+
name: string;
|
|
48
|
+
args: Record<string, unknown>;
|
|
49
|
+
}>;
|
|
50
|
+
constructor();
|
|
51
|
+
execute(name: string, args: Record<string, unknown>): Promise<ToolResult>;
|
|
52
|
+
}
|
|
26
53
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7D;AAED,cAAM,YAAY;IAChB,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,cAAc,CAAkB;gBAE5B,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;IAI/C,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAI1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAInC,MAAM,IAAI,IAAI,EAAE;IAIhB,cAAc,IAAI,GAAG,EAAE;IAWjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;YAkCjE,gBAAgB;IA6B9B,OAAO,CAAC,YAAY;CAMrB;AAGD,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AACD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IACzC,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAM;;IAMpE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAMhF"}
|
|
@@ -4,10 +4,14 @@
|
|
|
4
4
|
* Manages all available tools that the agent can use.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ToolRegistry = void 0;
|
|
7
|
+
exports.MockToolRegistry = exports.ToolRegistry = void 0;
|
|
8
8
|
exports.getToolRegistry = getToolRegistry;
|
|
9
9
|
class ToolRegistry {
|
|
10
10
|
tools = new Map();
|
|
11
|
+
sandboxEnabled = false;
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.sandboxEnabled = options.sandbox || false;
|
|
14
|
+
}
|
|
11
15
|
register(tool) {
|
|
12
16
|
this.tools.set(tool.name, tool);
|
|
13
17
|
}
|
|
@@ -29,21 +33,92 @@ class ToolRegistry {
|
|
|
29
33
|
}
|
|
30
34
|
async execute(name, args) {
|
|
31
35
|
const tool = this.tools.get(name);
|
|
32
|
-
if (!tool)
|
|
36
|
+
if (!tool) {
|
|
37
|
+
console.warn(`[ToolRegistry] Attempted to execute unknown tool: ${name}`);
|
|
33
38
|
return { success: false, output: '', error: `Unknown tool: ${name}` };
|
|
39
|
+
}
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
console.log(`[ToolRegistry] Executing '${name}' (v${tool.version})...`);
|
|
34
42
|
try {
|
|
35
|
-
|
|
43
|
+
let result;
|
|
44
|
+
if (this.sandboxEnabled) {
|
|
45
|
+
result = await this.executeInSandbox(tool, args);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
result = await tool.execute(args);
|
|
49
|
+
}
|
|
50
|
+
const duration = Date.now() - startTime;
|
|
51
|
+
console.log(`[ToolRegistry] '${name}' completed in ${duration}ms. Success: ${result.success}`);
|
|
52
|
+
// Telemetry hook (local only as per AZERCLAW policy)
|
|
53
|
+
this.logTelemetry(name, duration, result.success);
|
|
54
|
+
return result;
|
|
36
55
|
}
|
|
37
56
|
catch (error) {
|
|
57
|
+
const duration = Date.now() - startTime;
|
|
58
|
+
console.error(`[ToolRegistry] '${name}' failed in ${duration}ms:`, error.message);
|
|
59
|
+
this.logTelemetry(name, duration, false, error.message);
|
|
38
60
|
return { success: false, output: '', error: error.message || 'Tool execution failed' };
|
|
39
61
|
}
|
|
40
62
|
}
|
|
63
|
+
async executeInSandbox(tool, args) {
|
|
64
|
+
// Basic VM sandboxing
|
|
65
|
+
const vm = require('vm');
|
|
66
|
+
const context = {
|
|
67
|
+
args,
|
|
68
|
+
tool,
|
|
69
|
+
console,
|
|
70
|
+
Buffer,
|
|
71
|
+
process: {
|
|
72
|
+
env: { ...process.env, OPENAI_API_KEY: undefined, ANTHROPIC_API_KEY: undefined, GOOGLE_API_KEY: undefined }
|
|
73
|
+
},
|
|
74
|
+
result: null
|
|
75
|
+
};
|
|
76
|
+
vm.createContext(context);
|
|
77
|
+
const code = `
|
|
78
|
+
(async () => {
|
|
79
|
+
try {
|
|
80
|
+
result = await tool.execute(args);
|
|
81
|
+
} catch (e) {
|
|
82
|
+
result = { success: false, output: '', error: e.message };
|
|
83
|
+
}
|
|
84
|
+
})()
|
|
85
|
+
`;
|
|
86
|
+
await vm.runInContext(code, context);
|
|
87
|
+
return context.result;
|
|
88
|
+
}
|
|
89
|
+
logTelemetry(toolName, duration, success, error) {
|
|
90
|
+
// AZERCLAW keeps telemetry local. We could write to a local log file or store in memory.
|
|
91
|
+
// For now, we'll just use a simple audit log style.
|
|
92
|
+
const { auditLog } = require('../core/security');
|
|
93
|
+
auditLog('TOOL_EXECUTION', `${toolName} | ${duration}ms | ${success ? 'SUCCESS' : 'FAILURE'}${error ? ` | ${error}` : ''}`);
|
|
94
|
+
}
|
|
41
95
|
}
|
|
42
96
|
exports.ToolRegistry = ToolRegistry;
|
|
43
97
|
let instance = null;
|
|
44
98
|
function getToolRegistry() {
|
|
45
|
-
if (!instance)
|
|
46
|
-
|
|
99
|
+
if (!instance) {
|
|
100
|
+
const { getConfigManager } = require('../config/manager');
|
|
101
|
+
const config = getConfigManager().getAll();
|
|
102
|
+
instance = new ToolRegistry({ sandbox: config.agent.sandboxMode });
|
|
103
|
+
}
|
|
47
104
|
return instance;
|
|
48
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Mock Tool Registry for unit testing.
|
|
108
|
+
* Does not load any tools by default and allows easy inspection of calls.
|
|
109
|
+
*/
|
|
110
|
+
class MockToolRegistry extends ToolRegistry {
|
|
111
|
+
calls = [];
|
|
112
|
+
constructor() {
|
|
113
|
+
super({ sandbox: false });
|
|
114
|
+
}
|
|
115
|
+
async execute(name, args) {
|
|
116
|
+
this.calls.push({ name, args });
|
|
117
|
+
const tool = this.get(name);
|
|
118
|
+
if (tool)
|
|
119
|
+
return tool.execute(args);
|
|
120
|
+
return { success: true, output: `Mock output for ${name}` };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.MockToolRegistry = MockToolRegistry;
|
|
49
124
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,SAAS,EAAE,IAqCvB,CAAC"}
|
package/dist/src/tools/shell.js
CHANGED
|
@@ -8,6 +8,7 @@ exports.shellTool = void 0;
|
|
|
8
8
|
const child_process_1 = require("child_process");
|
|
9
9
|
exports.shellTool = {
|
|
10
10
|
name: 'run_shell',
|
|
11
|
+
version: '1.0.0',
|
|
11
12
|
description: 'Execute a shell command on the local system. Use this for running scripts, installing packages, git operations, file manipulation, and system tasks.',
|
|
12
13
|
parameters: {
|
|
13
14
|
type: 'object',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAAgD;AAGnC,QAAA,SAAS,GAAS;IAC7B,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,sJAAsJ;IACnK,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACxE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACpE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;SACrF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,KAAK,CAAC,OAAO,CAAC,IAA6B;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;QACvC,MAAM,GAAG,GAAI,IAAI,CAAC,GAAc,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClD,MAAM,OAAO,GAAI,IAAI,CAAC,OAAkB,IAAI,KAAK,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,OAAO,EAAE;gBAC/B,GAAG;gBACH,OAAO;gBACP,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,EAAE,OAAO;gBACpC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,gBAAgB;aACnD,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAAgD;AAGnC,QAAA,SAAS,GAAS;IAC7B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,sJAAsJ;IACnK,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACxE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACpE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;SACrF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,KAAK,CAAC,OAAO,CAAC,IAA6B;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;QACvC,MAAM,GAAG,GAAI,IAAI,CAAC,GAAc,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClD,MAAM,OAAO,GAAI,IAAI,CAAC,OAAkB,IAAI,KAAK,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,OAAO,EAAE;gBAC/B,GAAG;gBACH,OAAO;gBACP,QAAQ,EAAE,OAAO;gBACjB,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,EAAE,EAAE,OAAO;gBACpC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,gBAAgB;aACnD,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "azerclaw",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "🐟 AZERCLAW — Open-source, BYOK AI agent for your terminal. Your AI, Your Keys, Your Way.",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"copy-skills": "cp -r skills dist/skills 2>/dev/null || true",
|
|
16
16
|
"doctor": "npx tsx bin/azerclaw.ts doctor",
|
|
17
17
|
"onboard": "npx tsx bin/azerclaw.ts onboard",
|
|
18
|
-
"test": "
|
|
18
|
+
"test": "vitest run",
|
|
19
19
|
"clean": "rimraf dist",
|
|
20
20
|
"prepublishOnly": "npm run clean && npm run build"
|
|
21
21
|
},
|
|
@@ -87,17 +87,19 @@
|
|
|
87
87
|
"ora": "^5.4.1",
|
|
88
88
|
"string-width": "^4.2.3",
|
|
89
89
|
"strip-ansi": "^6.0.1",
|
|
90
|
+
"vm": "^0.1.0",
|
|
90
91
|
"wrap-ansi": "^7.0.0",
|
|
91
92
|
"ws": "^8.18.2",
|
|
92
93
|
"zod": "^3.24.4"
|
|
93
94
|
},
|
|
94
95
|
"devDependencies": {
|
|
95
|
-
"@types/node": "^22.
|
|
96
|
+
"@types/node": "^22.19.18",
|
|
96
97
|
"@types/ws": "^8.18.1",
|
|
97
98
|
"rimraf": "^6.0.1",
|
|
98
99
|
"tsup": "^8.5.0",
|
|
99
100
|
"tsx": "^4.19.4",
|
|
100
|
-
"typescript": "^5.8.3"
|
|
101
|
+
"typescript": "^5.8.3",
|
|
102
|
+
"vitest": "^4.1.5"
|
|
101
103
|
},
|
|
102
104
|
"azerclaw": {
|
|
103
105
|
"security": {
|