agentvault 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/.dfx/local/network-id +4 -0
- package/.next/trace +2 -0
- package/.vercel/README.txt +11 -0
- package/.vercel/project.json +1 -0
- package/AGENTS.md +43 -0
- package/CHANGELOG.md +196 -0
- package/LICENSE +21 -0
- package/PLAN_VAULT_INTEGRATION.md +318 -0
- package/README.md +253 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +28 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +1 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +28 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +1 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +28 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +1 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +28 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +1 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +1 -0
- package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +28 -0
- package/backups/test-backup.json +28 -0
- package/dist/cli/commands/approve.d.ts +4 -0
- package/dist/cli/commands/approve.js +232 -0
- package/dist/cli/commands/archive.d.ts +4 -0
- package/dist/cli/commands/archive.js +192 -0
- package/dist/cli/commands/backup.d.ts +4 -0
- package/dist/cli/commands/backup.js +164 -0
- package/dist/cli/commands/cloud-backup.d.ts +4 -0
- package/dist/cli/commands/cloud-backup.js +221 -0
- package/dist/cli/commands/cycles.d.ts +8 -0
- package/dist/cli/commands/cycles.js +83 -0
- package/dist/cli/commands/decrypt.d.ts +16 -0
- package/dist/cli/commands/decrypt.js +101 -0
- package/dist/cli/commands/deploy.d.ts +32 -0
- package/dist/cli/commands/deploy.js +208 -0
- package/dist/cli/commands/exec.d.ts +26 -0
- package/dist/cli/commands/exec.js +109 -0
- package/dist/cli/commands/fetch.d.ts +23 -0
- package/dist/cli/commands/fetch.js +164 -0
- package/dist/cli/commands/health.d.ts +8 -0
- package/dist/cli/commands/health.js +72 -0
- package/dist/cli/commands/identity.d.ts +8 -0
- package/dist/cli/commands/identity.js +140 -0
- package/dist/cli/commands/inference.d.ts +4 -0
- package/dist/cli/commands/inference.js +225 -0
- package/dist/cli/commands/info.d.ts +8 -0
- package/dist/cli/commands/info.js +59 -0
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.js +135 -0
- package/dist/cli/commands/instrument.d.ts +8 -0
- package/dist/cli/commands/instrument.js +35 -0
- package/dist/cli/commands/list.d.ts +36 -0
- package/dist/cli/commands/list.js +173 -0
- package/dist/cli/commands/logs.d.ts +8 -0
- package/dist/cli/commands/logs.js +96 -0
- package/dist/cli/commands/monitor.d.ts +8 -0
- package/dist/cli/commands/monitor.js +84 -0
- package/dist/cli/commands/network.d.ts +14 -0
- package/dist/cli/commands/network.js +258 -0
- package/dist/cli/commands/package.d.ts +36 -0
- package/dist/cli/commands/package.js +188 -0
- package/dist/cli/commands/profile.d.ts +8 -0
- package/dist/cli/commands/profile.js +76 -0
- package/dist/cli/commands/promote.d.ts +8 -0
- package/dist/cli/commands/promote.js +89 -0
- package/dist/cli/commands/rebuild.d.ts +21 -0
- package/dist/cli/commands/rebuild.js +140 -0
- package/dist/cli/commands/rollback.d.ts +8 -0
- package/dist/cli/commands/rollback.js +120 -0
- package/dist/cli/commands/show.d.ts +36 -0
- package/dist/cli/commands/show.js +200 -0
- package/dist/cli/commands/stats.d.ts +8 -0
- package/dist/cli/commands/stats.js +34 -0
- package/dist/cli/commands/status.d.ts +14 -0
- package/dist/cli/commands/status.js +83 -0
- package/dist/cli/commands/test.d.ts +8 -0
- package/dist/cli/commands/test.js +109 -0
- package/dist/cli/commands/tokens.d.ts +8 -0
- package/dist/cli/commands/tokens.js +62 -0
- package/dist/cli/commands/trace.d.ts +8 -0
- package/dist/cli/commands/trace.js +68 -0
- package/dist/cli/commands/wallet-export.d.ts +13 -0
- package/dist/cli/commands/wallet-export.js +140 -0
- package/dist/cli/commands/wallet-history.d.ts +10 -0
- package/dist/cli/commands/wallet-history.js +127 -0
- package/dist/cli/commands/wallet-import.d.ts +10 -0
- package/dist/cli/commands/wallet-import.js +209 -0
- package/dist/cli/commands/wallet-multi-send.d.ts +17 -0
- package/dist/cli/commands/wallet-multi-send.js +195 -0
- package/dist/cli/commands/wallet-process-queue.d.ts +19 -0
- package/dist/cli/commands/wallet-process-queue.js +209 -0
- package/dist/cli/commands/wallet-sign.d.ts +13 -0
- package/dist/cli/commands/wallet-sign.js +207 -0
- package/dist/cli/commands/wallet.d.ts +12 -0
- package/dist/cli/commands/wallet.js +794 -0
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.js +96 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.js +14 -0
- package/fixup_1_0_OSS_release.md +136 -0
- package/fixup_REALEASE_PRD.md +136 -0
- package/package.json +79 -0
- package/pnpm-workspace.yaml +5 -0
- package/scripts/dev-dashboard.mjs +84 -0
- package/site/README.md +63 -0
- package/site/docusaurus.config.ts +148 -0
- package/site/package-lock.json +18383 -0
- package/site/package.json +47 -0
- package/site/sidebars.ts +86 -0
- package/site/static/.gitkeep +0 -0
- package/site/static/img/logo.svg +28 -0
- package/site/static/img/og-image.svg +35 -0
- package/src/archival/archive-manager.ts +372 -0
- package/src/archival/arweave-client.ts +289 -0
- package/src/archival/index.ts +8 -0
- package/src/backup/backup.ts +315 -0
- package/src/backup/index.ts +7 -0
- package/src/cloud-storage/cloud-sync.ts +461 -0
- package/src/cloud-storage/index.ts +11 -0
- package/src/cloud-storage/provider-detector.ts +198 -0
- package/src/cloud-storage/types.ts +104 -0
- package/src/debugging/index.ts +6 -0
- package/src/debugging/logs.ts +193 -0
- package/src/debugging/types.ts +100 -0
- package/src/deployment/deployer.ts +274 -0
- package/src/deployment/icpClient.ts +620 -0
- package/src/deployment/index.ts +46 -0
- package/src/deployment/promotion.ts +161 -0
- package/src/deployment/types.ts +111 -0
- package/src/icp/batch.ts +374 -0
- package/src/icp/cycles.ts +50 -0
- package/src/icp/environment.ts +215 -0
- package/src/icp/icpcli.ts +438 -0
- package/src/icp/icwasm.ts +222 -0
- package/src/icp/identity.ts +77 -0
- package/src/icp/index.ts +94 -0
- package/src/icp/optimization.ts +242 -0
- package/src/icp/tokens.ts +36 -0
- package/src/icp/tool-detector.ts +110 -0
- package/src/icp/types.ts +574 -0
- package/src/index.ts +25 -0
- package/src/inference/bittensor-client.ts +304 -0
- package/src/inference/index.ts +8 -0
- package/src/inference/inference-manager.ts +327 -0
- package/src/metrics/index.ts +7 -0
- package/src/metrics/metrics.ts +186 -0
- package/src/monitoring/alerting.ts +190 -0
- package/src/monitoring/health.ts +197 -0
- package/src/monitoring/index.ts +38 -0
- package/src/monitoring/info.ts +114 -0
- package/src/monitoring/types.ts +99 -0
- package/src/network/index.ts +5 -0
- package/src/network/network-config.ts +129 -0
- package/src/packaging/compiler.ts +647 -0
- package/src/packaging/config-persistence.ts +135 -0
- package/src/packaging/config-schemas.ts +156 -0
- package/src/packaging/detector.ts +220 -0
- package/src/packaging/index.ts +90 -0
- package/src/packaging/packager.ts +118 -0
- package/src/packaging/parsers/clawdbot.ts +278 -0
- package/src/packaging/parsers/cline.ts +223 -0
- package/src/packaging/parsers/generic.ts +266 -0
- package/src/packaging/parsers/goose.ts +214 -0
- package/src/packaging/parsers/index.ts +11 -0
- package/src/packaging/serializer.ts +260 -0
- package/src/packaging/types.ts +144 -0
- package/src/packaging/wasmedge-compiler.ts +406 -0
- package/src/security/index.ts +17 -0
- package/src/security/multisig.ts +415 -0
- package/src/security/types.ts +416 -0
- package/src/security/vetkeys.ts +655 -0
- package/src/testing/index.ts +6 -0
- package/src/testing/local-runner.ts +264 -0
- package/src/testing/types.ts +104 -0
- package/src/wallet/cbor-serializer.ts +323 -0
- package/src/wallet/chain-dispatcher.ts +313 -0
- package/src/wallet/cross-chain-aggregator.ts +346 -0
- package/src/wallet/index.ts +76 -0
- package/src/wallet/key-derivation.ts +425 -0
- package/src/wallet/providers/base-provider.ts +154 -0
- package/src/wallet/providers/cketh-provider.ts +434 -0
- package/src/wallet/providers/polkadot-provider.ts +503 -0
- package/src/wallet/providers/solana-provider.ts +490 -0
- package/src/wallet/transaction-queue.ts +284 -0
- package/src/wallet/types.ts +178 -0
- package/src/wallet/vetkeys-adapter.ts +431 -0
- package/src/wallet/wallet-manager.ts +597 -0
- package/src/wallet/wallet-storage.ts +380 -0
- package/vercel.json +8 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic Configuration Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses generic agent configuration from JSON or YAML files.
|
|
5
|
+
* Reads agent.json, agent.yaml, agent.yml, or .agentvault.json file
|
|
6
|
+
* and constructs configuration object.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import * as yaml from 'yaml';
|
|
12
|
+
import type {
|
|
13
|
+
GenericConfig,
|
|
14
|
+
ConfigLocation,
|
|
15
|
+
ConfigValidationResult,
|
|
16
|
+
} from '../config-schemas.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Find Generic configuration file
|
|
20
|
+
*/
|
|
21
|
+
function findGenericConfig(sourcePath: string): ConfigLocation | null {
|
|
22
|
+
const absolutePath = path.resolve(sourcePath);
|
|
23
|
+
|
|
24
|
+
// Check for config files (priority order)
|
|
25
|
+
const configFiles = ['agent.json', 'agent.yaml', 'agent.yml', 'agentvault.json', '.agentvault.json'];
|
|
26
|
+
for (const file of configFiles) {
|
|
27
|
+
const filePath = path.join(absolutePath, file);
|
|
28
|
+
if (fs.existsSync(filePath)) {
|
|
29
|
+
// Determine type based on extension
|
|
30
|
+
const type = file.endsWith('.yaml') || file.endsWith('.yml') ? 'yaml' : 'json';
|
|
31
|
+
return {
|
|
32
|
+
path: filePath,
|
|
33
|
+
type,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Validate Generic configuration
|
|
43
|
+
*/
|
|
44
|
+
function validateGenericConfig(config: GenericConfig): ConfigValidationResult {
|
|
45
|
+
const errors: string[] = [];
|
|
46
|
+
const warnings: string[] = [];
|
|
47
|
+
|
|
48
|
+
// Validate name
|
|
49
|
+
if (!config.name || config.name.trim() === '') {
|
|
50
|
+
errors.push('Agent name is required');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Validate version format
|
|
54
|
+
if (config.version) {
|
|
55
|
+
const versionRegex = /^\d+\.\d+\.\d+$/;
|
|
56
|
+
if (!versionRegex.test(config.version)) {
|
|
57
|
+
errors.push(`Invalid version format: ${config.version}. Expected: X.Y.Z`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Validate entry point exists (if specified)
|
|
62
|
+
if (config.entryPoint) {
|
|
63
|
+
const sourcePath = process.cwd();
|
|
64
|
+
const entryPath = path.join(sourcePath, config.entryPoint);
|
|
65
|
+
if (!fs.existsSync(entryPath)) {
|
|
66
|
+
warnings.push(`Entry point does not exist: ${config.entryPoint}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Validate working directory exists (if specified)
|
|
71
|
+
if (config.workingDirectory) {
|
|
72
|
+
const workingDirPath = path.resolve(process.cwd(), config.workingDirectory);
|
|
73
|
+
if (!fs.existsSync(workingDirPath)) {
|
|
74
|
+
warnings.push(`Working directory does not exist: ${config.workingDirectory}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Validate allowedFiles format if specified
|
|
79
|
+
if (config.allowedFiles) {
|
|
80
|
+
if (!Array.isArray(config.allowedFiles)) {
|
|
81
|
+
errors.push('allowedFiles must be an array');
|
|
82
|
+
} else {
|
|
83
|
+
for (const pattern of config.allowedFiles) {
|
|
84
|
+
if (typeof pattern !== 'string' || pattern.trim() === '') {
|
|
85
|
+
errors.push(`Invalid file pattern in allowedFiles: ${pattern}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Validate maxFileSize if specified
|
|
92
|
+
if (config.maxFileSize !== undefined) {
|
|
93
|
+
if (typeof config.maxFileSize !== 'number' || config.maxFileSize <= 0) {
|
|
94
|
+
errors.push(`maxFileSize must be a positive number, got: ${config.maxFileSize}`);
|
|
95
|
+
} else {
|
|
96
|
+
// Warn if maxFileSize is very large (> 100MB)
|
|
97
|
+
if (config.maxFileSize > 100 * 1024 * 1024) {
|
|
98
|
+
warnings.push(`maxFileSize is very large (${(config.maxFileSize / 1024 / 1024).toFixed(0)}MB)`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Validate environment variables if specified
|
|
104
|
+
if (config.environment) {
|
|
105
|
+
if (typeof config.environment !== 'object' || config.environment === null) {
|
|
106
|
+
errors.push('environment must be an object');
|
|
107
|
+
} else {
|
|
108
|
+
for (const [key, value] of Object.entries(config.environment)) {
|
|
109
|
+
if (typeof value !== 'string') {
|
|
110
|
+
errors.push(`Environment variable ${key} must be a string`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Warn if no entry point defined
|
|
117
|
+
if (!config.entryPoint) {
|
|
118
|
+
warnings.push('No entry point defined. Agent may not be executable.');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
valid: errors.length === 0,
|
|
123
|
+
errors,
|
|
124
|
+
warnings,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Parse Generic agent configuration
|
|
130
|
+
*
|
|
131
|
+
* This function reads agent.json, agent.yaml, agent.yml, or .agentvault.json file
|
|
132
|
+
* and returns a fully validated configuration object.
|
|
133
|
+
*
|
|
134
|
+
* @param sourcePath - Path to agent source directory
|
|
135
|
+
* @param verbose - Enable verbose logging
|
|
136
|
+
* @returns Parsed and validated Generic configuration
|
|
137
|
+
*/
|
|
138
|
+
export async function parseGenericConfig(
|
|
139
|
+
sourcePath: string,
|
|
140
|
+
verbose: boolean = false
|
|
141
|
+
): Promise<GenericConfig> {
|
|
142
|
+
if (verbose) {
|
|
143
|
+
console.log(`[Generic] Parsing configuration from: ${sourcePath}`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const configLocation = findGenericConfig(sourcePath);
|
|
147
|
+
|
|
148
|
+
if (configLocation === null) {
|
|
149
|
+
throw new Error(
|
|
150
|
+
'No Generic agent configuration found. ' +
|
|
151
|
+
'Expected agent.json, agent.yaml, agent.yml, or .agentvault.json file in the agent source path.'
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (verbose) {
|
|
156
|
+
console.log(`[Generic] Found ${configLocation.type.toUpperCase()} config: ${configLocation.path}`);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let config: GenericConfig;
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
const content = fs.readFileSync(configLocation.path, 'utf-8');
|
|
163
|
+
|
|
164
|
+
// Parse based on file type
|
|
165
|
+
if (configLocation.type === 'json') {
|
|
166
|
+
const parsed = JSON.parse(content);
|
|
167
|
+
|
|
168
|
+
config = {
|
|
169
|
+
type: 'generic',
|
|
170
|
+
name: parsed.name || 'generic-agent',
|
|
171
|
+
version: parsed.version,
|
|
172
|
+
description: parsed.description,
|
|
173
|
+
entryPoint: parsed.entryPoint,
|
|
174
|
+
workingDirectory: parsed.workingDirectory,
|
|
175
|
+
environment: parsed.environment || {},
|
|
176
|
+
allowedFiles: parsed.allowedFiles,
|
|
177
|
+
maxFileSize: parsed.maxFileSize,
|
|
178
|
+
};
|
|
179
|
+
} else {
|
|
180
|
+
// YAML
|
|
181
|
+
const parsed = yaml.parse(content);
|
|
182
|
+
|
|
183
|
+
config = {
|
|
184
|
+
type: 'generic',
|
|
185
|
+
name: parsed.name || 'generic-agent',
|
|
186
|
+
version: parsed.version,
|
|
187
|
+
description: parsed.description,
|
|
188
|
+
entryPoint: parsed.entryPoint,
|
|
189
|
+
workingDirectory: parsed.workingDirectory,
|
|
190
|
+
environment: parsed.environment || {},
|
|
191
|
+
allowedFiles: parsed.allowedFiles,
|
|
192
|
+
maxFileSize: parsed.maxFileSize,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (verbose) {
|
|
197
|
+
console.log(`[Generic] Parsed name: ${config.name}`);
|
|
198
|
+
console.log(`[Generic] Parsed version: ${config.version}`);
|
|
199
|
+
console.log(`[Generic] Parsed entryPoint: ${config.entryPoint || 'none'}`);
|
|
200
|
+
console.log(`[Generic] Parsed workingDirectory: ${config.workingDirectory || 'none'}`);
|
|
201
|
+
console.log(`[Generic] Parsed environment keys: ${Object.keys(config.environment || {}).length}`);
|
|
202
|
+
console.log(`[Generic] Parsed allowedFiles: ${config.allowedFiles?.length || 0}`);
|
|
203
|
+
console.log(`[Generic] Parsed maxFileSize: ${config.maxFileSize || 'unlimited'}`);
|
|
204
|
+
}
|
|
205
|
+
} catch (error) {
|
|
206
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
207
|
+
throw new Error(`Failed to parse Generic config: ${message}`);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Validate configuration
|
|
211
|
+
const validation = validateGenericConfig(config);
|
|
212
|
+
|
|
213
|
+
if (!validation.valid) {
|
|
214
|
+
const errorMessage = `Generic agent configuration validation failed:\n${validation.errors.map(e => ` - ${e}`).join('\n')}`;
|
|
215
|
+
throw new Error(errorMessage);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Display warnings if verbose
|
|
219
|
+
if (verbose && validation.warnings.length > 0) {
|
|
220
|
+
console.log(`[Generic] Warnings:`);
|
|
221
|
+
for (const warning of validation.warnings) {
|
|
222
|
+
console.log(`[Generic] - ${warning}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return config;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Find all Generic configurations in a directory tree
|
|
231
|
+
*
|
|
232
|
+
* @param rootPath - Root directory to search
|
|
233
|
+
* @returns Array of paths to Generic configuration files
|
|
234
|
+
*/
|
|
235
|
+
export function findGenericConfigs(rootPath: string): string[] {
|
|
236
|
+
const configs: string[] = [];
|
|
237
|
+
|
|
238
|
+
function searchDirectory(dirPath: string): void {
|
|
239
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
240
|
+
|
|
241
|
+
for (const entry of entries) {
|
|
242
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
243
|
+
|
|
244
|
+
if (entry.isDirectory()) {
|
|
245
|
+
// Skip node_modules and .git
|
|
246
|
+
if (entry.name !== 'node_modules' && entry.name !== '.git') {
|
|
247
|
+
searchDirectory(fullPath);
|
|
248
|
+
}
|
|
249
|
+
} else if (entry.isFile()) {
|
|
250
|
+
// Check for Generic config files
|
|
251
|
+
if (
|
|
252
|
+
entry.name === 'agent.json' ||
|
|
253
|
+
entry.name === 'agent.yaml' ||
|
|
254
|
+
entry.name === 'agent.yml' ||
|
|
255
|
+
entry.name === 'agentvault.json' ||
|
|
256
|
+
entry.name === '.agentvault.json'
|
|
257
|
+
) {
|
|
258
|
+
configs.push(fullPath);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
searchDirectory(rootPath);
|
|
265
|
+
return configs;
|
|
266
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Goose Configuration Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Goose agent configuration from YAML files.
|
|
5
|
+
* Reads goose.yaml, goose.yml, or .gooserc files and constructs configuration object.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import * as yaml from 'yaml';
|
|
11
|
+
import type {
|
|
12
|
+
GooseConfig,
|
|
13
|
+
ConfigLocation,
|
|
14
|
+
ConfigValidationResult,
|
|
15
|
+
} from '../config-schemas.js';
|
|
16
|
+
import {
|
|
17
|
+
DEFAULT_GOOSE_CONFIG,
|
|
18
|
+
} from '../config-schemas.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Find Goose configuration file
|
|
22
|
+
*/
|
|
23
|
+
function findGooseConfig(sourcePath: string): ConfigLocation | null {
|
|
24
|
+
const absolutePath = path.resolve(sourcePath);
|
|
25
|
+
|
|
26
|
+
const configFiles = ['goose.yaml', 'goose.yml', '.gooserc'];
|
|
27
|
+
for (const file of configFiles) {
|
|
28
|
+
const filePath = path.join(absolutePath, file);
|
|
29
|
+
if (fs.existsSync(filePath)) {
|
|
30
|
+
return {
|
|
31
|
+
path: filePath,
|
|
32
|
+
type: 'yaml',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Validate Goose configuration
|
|
42
|
+
*/
|
|
43
|
+
function validateGooseConfig(config: GooseConfig): ConfigValidationResult {
|
|
44
|
+
const errors: string[] = [];
|
|
45
|
+
const warnings: string[] = [];
|
|
46
|
+
|
|
47
|
+
// Validate name
|
|
48
|
+
if (!config.name || config.name.trim() === '') {
|
|
49
|
+
errors.push('Agent name is required');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Validate model (required for Goose)
|
|
53
|
+
if (!config.model || config.model.trim() === '') {
|
|
54
|
+
errors.push('Model is required for Goose agent');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Validate version format
|
|
58
|
+
if (config.version) {
|
|
59
|
+
const versionRegex = /^\d+\.\d+\.\d+$/;
|
|
60
|
+
if (!versionRegex.test(config.version)) {
|
|
61
|
+
errors.push(`Invalid version format: ${config.version}. Expected: X.Y.Z`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Validate temperature (must be between 0 and 2)
|
|
66
|
+
if (config.temperature !== undefined) {
|
|
67
|
+
if (config.temperature < 0 || config.temperature > 2) {
|
|
68
|
+
errors.push(`Temperature must be between 0 and 2, got: ${config.temperature}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Validate maxTokens (must be positive)
|
|
73
|
+
if (config.maxTokens !== undefined) {
|
|
74
|
+
if (config.maxTokens <= 0) {
|
|
75
|
+
errors.push(`maxTokens must be positive, got: ${config.maxTokens}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Validate working directory exists (if specified)
|
|
80
|
+
if (config.workingDirectory) {
|
|
81
|
+
const workingDirPath = path.resolve(process.cwd(), config.workingDirectory);
|
|
82
|
+
if (!fs.existsSync(workingDirPath)) {
|
|
83
|
+
warnings.push(`Working directory does not exist: ${config.workingDirectory}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Warn if no tools defined
|
|
88
|
+
if (!config.tools || config.tools.length === 0) {
|
|
89
|
+
warnings.push('No tools defined in configuration');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
valid: errors.length === 0,
|
|
94
|
+
errors,
|
|
95
|
+
warnings,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Parse Goose agent configuration
|
|
101
|
+
*
|
|
102
|
+
* This function reads goose.yaml, goose.yml, or .gooserc file
|
|
103
|
+
* and returns a fully validated configuration object.
|
|
104
|
+
*
|
|
105
|
+
* @param sourcePath - Path to agent source directory
|
|
106
|
+
* @param verbose - Enable verbose logging
|
|
107
|
+
* @returns Parsed and validated Goose configuration
|
|
108
|
+
*/
|
|
109
|
+
export async function parseGooseConfig(
|
|
110
|
+
sourcePath: string,
|
|
111
|
+
verbose: boolean = false
|
|
112
|
+
): Promise<GooseConfig> {
|
|
113
|
+
if (verbose) {
|
|
114
|
+
console.log(`[Goose] Parsing configuration from: ${sourcePath}`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const configLocation = findGooseConfig(sourcePath);
|
|
118
|
+
|
|
119
|
+
if (configLocation === null) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
'No Goose configuration found. ' +
|
|
122
|
+
'Expected goose.yaml, goose.yml, or .gooserc file in the agent source path.'
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (verbose) {
|
|
127
|
+
console.log(`[Goose] Found YAML config: ${configLocation.path}`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let config: GooseConfig;
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
const content = fs.readFileSync(configLocation.path, 'utf-8');
|
|
134
|
+
const parsed = yaml.parse(content);
|
|
135
|
+
|
|
136
|
+
// Merge with defaults
|
|
137
|
+
config = {
|
|
138
|
+
type: 'goose',
|
|
139
|
+
name: parsed.name || DEFAULT_GOOSE_CONFIG.name,
|
|
140
|
+
version: parsed.version || DEFAULT_GOOSE_CONFIG.version,
|
|
141
|
+
description: parsed.description || DEFAULT_GOOSE_CONFIG.description,
|
|
142
|
+
model: parsed.model || DEFAULT_GOOSE_CONFIG.model,
|
|
143
|
+
temperature: parsed.temperature !== undefined ? parsed.temperature : DEFAULT_GOOSE_CONFIG.temperature,
|
|
144
|
+
maxTokens: parsed.maxTokens !== undefined ? parsed.maxTokens : DEFAULT_GOOSE_CONFIG.maxTokens,
|
|
145
|
+
systemPrompt: parsed.systemPrompt || DEFAULT_GOOSE_CONFIG.systemPrompt,
|
|
146
|
+
tools: parsed.tools || DEFAULT_GOOSE_CONFIG.tools,
|
|
147
|
+
workingDirectory: parsed.workingDirectory || DEFAULT_GOOSE_CONFIG.workingDirectory,
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
if (verbose) {
|
|
151
|
+
console.log(`[Goose] Parsed name: ${config.name}`);
|
|
152
|
+
console.log(`[Goose] Parsed version: ${config.version}`);
|
|
153
|
+
console.log(`[Goose] Parsed model: ${config.model}`);
|
|
154
|
+
console.log(`[Goose] Parsed temperature: ${config.temperature}`);
|
|
155
|
+
console.log(`[Goose] Parsed maxTokens: ${config.maxTokens}`);
|
|
156
|
+
console.log(`[Goose] Parsed tools: ${config.tools?.length || 0}`);
|
|
157
|
+
console.log(`[Goose] Parsed workingDirectory: ${config.workingDirectory}`);
|
|
158
|
+
}
|
|
159
|
+
} catch (error) {
|
|
160
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
161
|
+
throw new Error(`Failed to parse Goose config: ${message}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Validate configuration
|
|
165
|
+
const validation = validateGooseConfig(config);
|
|
166
|
+
|
|
167
|
+
if (!validation.valid) {
|
|
168
|
+
const errorMessage = `Goose configuration validation failed:\n${validation.errors.map(e => ` - ${e}`).join('\n')}`;
|
|
169
|
+
throw new Error(errorMessage);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Display warnings if verbose
|
|
173
|
+
if (verbose && validation.warnings.length > 0) {
|
|
174
|
+
console.log(`[Goose] Warnings:`);
|
|
175
|
+
for (const warning of validation.warnings) {
|
|
176
|
+
console.log(`[Goose] - ${warning}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return config;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Find all Goose configurations in a directory tree
|
|
185
|
+
*
|
|
186
|
+
* @param rootPath - Root directory to search
|
|
187
|
+
* @returns Array of paths to Goose configuration files
|
|
188
|
+
*/
|
|
189
|
+
export function findGooseConfigs(rootPath: string): string[] {
|
|
190
|
+
const configs: string[] = [];
|
|
191
|
+
|
|
192
|
+
function searchDirectory(dirPath: string): void {
|
|
193
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
194
|
+
|
|
195
|
+
for (const entry of entries) {
|
|
196
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
197
|
+
|
|
198
|
+
if (entry.isDirectory()) {
|
|
199
|
+
// Skip node_modules and .git
|
|
200
|
+
if (entry.name !== 'node_modules' && entry.name !== '.git') {
|
|
201
|
+
searchDirectory(fullPath);
|
|
202
|
+
}
|
|
203
|
+
} else if (entry.isFile()) {
|
|
204
|
+
// Check for Goose config files
|
|
205
|
+
if (entry.name === 'goose.yaml' || entry.name === 'goose.yml' || entry.name === '.gooserc') {
|
|
206
|
+
configs.push(fullPath);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
searchDirectory(rootPath);
|
|
213
|
+
return configs;
|
|
214
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Parser Registry
|
|
3
|
+
*
|
|
4
|
+
* Central exports for all agent configuration parsers.
|
|
5
|
+
* Provides convenient imports for Clawdbot, Goose, Cline, and Generic agents.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { parseClawdbotConfig, findClawdbotConfigs } from './clawdbot.js';
|
|
9
|
+
export { parseGooseConfig, findGooseConfigs } from './goose.js';
|
|
10
|
+
export { parseClineConfig, findClineConfigs } from './cline.js';
|
|
11
|
+
export { parseGenericConfig, findGenericConfigs } from './generic.js';
|