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.
Files changed (188) hide show
  1. package/.dfx/local/network-id +4 -0
  2. package/.next/trace +2 -0
  3. package/.vercel/README.txt +11 -0
  4. package/.vercel/project.json +1 -0
  5. package/AGENTS.md +43 -0
  6. package/CHANGELOG.md +196 -0
  7. package/LICENSE +21 -0
  8. package/PLAN_VAULT_INTEGRATION.md +318 -0
  9. package/README.md +253 -0
  10. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-28-967Z.json +28 -0
  11. package/backups/agentvault-backup-test-agent-2026-02-12T17-54-29-032Z.backup +1 -0
  12. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-373Z.json +28 -0
  13. package/backups/agentvault-backup-test-agent-2026-02-12T17-57-42-428Z.backup +1 -0
  14. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-132Z.json +28 -0
  15. package/backups/agentvault-backup-test-agent-2026-02-12T18-52-25-247Z.backup +1 -0
  16. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-216Z.json +28 -0
  17. package/backups/agentvault-backup-test-agent-2026-02-12T18-54-09-283Z.backup +1 -0
  18. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-772Z.backup +1 -0
  19. package/backups/agentvault-backup-test-agent-2026-02-12T22-18-22-793Z.json +28 -0
  20. package/backups/test-backup.json +28 -0
  21. package/dist/cli/commands/approve.d.ts +4 -0
  22. package/dist/cli/commands/approve.js +232 -0
  23. package/dist/cli/commands/archive.d.ts +4 -0
  24. package/dist/cli/commands/archive.js +192 -0
  25. package/dist/cli/commands/backup.d.ts +4 -0
  26. package/dist/cli/commands/backup.js +164 -0
  27. package/dist/cli/commands/cloud-backup.d.ts +4 -0
  28. package/dist/cli/commands/cloud-backup.js +221 -0
  29. package/dist/cli/commands/cycles.d.ts +8 -0
  30. package/dist/cli/commands/cycles.js +83 -0
  31. package/dist/cli/commands/decrypt.d.ts +16 -0
  32. package/dist/cli/commands/decrypt.js +101 -0
  33. package/dist/cli/commands/deploy.d.ts +32 -0
  34. package/dist/cli/commands/deploy.js +208 -0
  35. package/dist/cli/commands/exec.d.ts +26 -0
  36. package/dist/cli/commands/exec.js +109 -0
  37. package/dist/cli/commands/fetch.d.ts +23 -0
  38. package/dist/cli/commands/fetch.js +164 -0
  39. package/dist/cli/commands/health.d.ts +8 -0
  40. package/dist/cli/commands/health.js +72 -0
  41. package/dist/cli/commands/identity.d.ts +8 -0
  42. package/dist/cli/commands/identity.js +140 -0
  43. package/dist/cli/commands/inference.d.ts +4 -0
  44. package/dist/cli/commands/inference.js +225 -0
  45. package/dist/cli/commands/info.d.ts +8 -0
  46. package/dist/cli/commands/info.js +59 -0
  47. package/dist/cli/commands/init.d.ts +19 -0
  48. package/dist/cli/commands/init.js +135 -0
  49. package/dist/cli/commands/instrument.d.ts +8 -0
  50. package/dist/cli/commands/instrument.js +35 -0
  51. package/dist/cli/commands/list.d.ts +36 -0
  52. package/dist/cli/commands/list.js +173 -0
  53. package/dist/cli/commands/logs.d.ts +8 -0
  54. package/dist/cli/commands/logs.js +96 -0
  55. package/dist/cli/commands/monitor.d.ts +8 -0
  56. package/dist/cli/commands/monitor.js +84 -0
  57. package/dist/cli/commands/network.d.ts +14 -0
  58. package/dist/cli/commands/network.js +258 -0
  59. package/dist/cli/commands/package.d.ts +36 -0
  60. package/dist/cli/commands/package.js +188 -0
  61. package/dist/cli/commands/profile.d.ts +8 -0
  62. package/dist/cli/commands/profile.js +76 -0
  63. package/dist/cli/commands/promote.d.ts +8 -0
  64. package/dist/cli/commands/promote.js +89 -0
  65. package/dist/cli/commands/rebuild.d.ts +21 -0
  66. package/dist/cli/commands/rebuild.js +140 -0
  67. package/dist/cli/commands/rollback.d.ts +8 -0
  68. package/dist/cli/commands/rollback.js +120 -0
  69. package/dist/cli/commands/show.d.ts +36 -0
  70. package/dist/cli/commands/show.js +200 -0
  71. package/dist/cli/commands/stats.d.ts +8 -0
  72. package/dist/cli/commands/stats.js +34 -0
  73. package/dist/cli/commands/status.d.ts +14 -0
  74. package/dist/cli/commands/status.js +83 -0
  75. package/dist/cli/commands/test.d.ts +8 -0
  76. package/dist/cli/commands/test.js +109 -0
  77. package/dist/cli/commands/tokens.d.ts +8 -0
  78. package/dist/cli/commands/tokens.js +62 -0
  79. package/dist/cli/commands/trace.d.ts +8 -0
  80. package/dist/cli/commands/trace.js +68 -0
  81. package/dist/cli/commands/wallet-export.d.ts +13 -0
  82. package/dist/cli/commands/wallet-export.js +140 -0
  83. package/dist/cli/commands/wallet-history.d.ts +10 -0
  84. package/dist/cli/commands/wallet-history.js +127 -0
  85. package/dist/cli/commands/wallet-import.d.ts +10 -0
  86. package/dist/cli/commands/wallet-import.js +209 -0
  87. package/dist/cli/commands/wallet-multi-send.d.ts +17 -0
  88. package/dist/cli/commands/wallet-multi-send.js +195 -0
  89. package/dist/cli/commands/wallet-process-queue.d.ts +19 -0
  90. package/dist/cli/commands/wallet-process-queue.js +209 -0
  91. package/dist/cli/commands/wallet-sign.d.ts +13 -0
  92. package/dist/cli/commands/wallet-sign.js +207 -0
  93. package/dist/cli/commands/wallet.d.ts +12 -0
  94. package/dist/cli/commands/wallet.js +794 -0
  95. package/dist/cli/index.d.ts +10 -0
  96. package/dist/cli/index.js +96 -0
  97. package/dist/vitest.config.d.ts +3 -0
  98. package/dist/vitest.config.js +14 -0
  99. package/fixup_1_0_OSS_release.md +136 -0
  100. package/fixup_REALEASE_PRD.md +136 -0
  101. package/package.json +79 -0
  102. package/pnpm-workspace.yaml +5 -0
  103. package/scripts/dev-dashboard.mjs +84 -0
  104. package/site/README.md +63 -0
  105. package/site/docusaurus.config.ts +148 -0
  106. package/site/package-lock.json +18383 -0
  107. package/site/package.json +47 -0
  108. package/site/sidebars.ts +86 -0
  109. package/site/static/.gitkeep +0 -0
  110. package/site/static/img/logo.svg +28 -0
  111. package/site/static/img/og-image.svg +35 -0
  112. package/src/archival/archive-manager.ts +372 -0
  113. package/src/archival/arweave-client.ts +289 -0
  114. package/src/archival/index.ts +8 -0
  115. package/src/backup/backup.ts +315 -0
  116. package/src/backup/index.ts +7 -0
  117. package/src/cloud-storage/cloud-sync.ts +461 -0
  118. package/src/cloud-storage/index.ts +11 -0
  119. package/src/cloud-storage/provider-detector.ts +198 -0
  120. package/src/cloud-storage/types.ts +104 -0
  121. package/src/debugging/index.ts +6 -0
  122. package/src/debugging/logs.ts +193 -0
  123. package/src/debugging/types.ts +100 -0
  124. package/src/deployment/deployer.ts +274 -0
  125. package/src/deployment/icpClient.ts +620 -0
  126. package/src/deployment/index.ts +46 -0
  127. package/src/deployment/promotion.ts +161 -0
  128. package/src/deployment/types.ts +111 -0
  129. package/src/icp/batch.ts +374 -0
  130. package/src/icp/cycles.ts +50 -0
  131. package/src/icp/environment.ts +215 -0
  132. package/src/icp/icpcli.ts +438 -0
  133. package/src/icp/icwasm.ts +222 -0
  134. package/src/icp/identity.ts +77 -0
  135. package/src/icp/index.ts +94 -0
  136. package/src/icp/optimization.ts +242 -0
  137. package/src/icp/tokens.ts +36 -0
  138. package/src/icp/tool-detector.ts +110 -0
  139. package/src/icp/types.ts +574 -0
  140. package/src/index.ts +25 -0
  141. package/src/inference/bittensor-client.ts +304 -0
  142. package/src/inference/index.ts +8 -0
  143. package/src/inference/inference-manager.ts +327 -0
  144. package/src/metrics/index.ts +7 -0
  145. package/src/metrics/metrics.ts +186 -0
  146. package/src/monitoring/alerting.ts +190 -0
  147. package/src/monitoring/health.ts +197 -0
  148. package/src/monitoring/index.ts +38 -0
  149. package/src/monitoring/info.ts +114 -0
  150. package/src/monitoring/types.ts +99 -0
  151. package/src/network/index.ts +5 -0
  152. package/src/network/network-config.ts +129 -0
  153. package/src/packaging/compiler.ts +647 -0
  154. package/src/packaging/config-persistence.ts +135 -0
  155. package/src/packaging/config-schemas.ts +156 -0
  156. package/src/packaging/detector.ts +220 -0
  157. package/src/packaging/index.ts +90 -0
  158. package/src/packaging/packager.ts +118 -0
  159. package/src/packaging/parsers/clawdbot.ts +278 -0
  160. package/src/packaging/parsers/cline.ts +223 -0
  161. package/src/packaging/parsers/generic.ts +266 -0
  162. package/src/packaging/parsers/goose.ts +214 -0
  163. package/src/packaging/parsers/index.ts +11 -0
  164. package/src/packaging/serializer.ts +260 -0
  165. package/src/packaging/types.ts +144 -0
  166. package/src/packaging/wasmedge-compiler.ts +406 -0
  167. package/src/security/index.ts +17 -0
  168. package/src/security/multisig.ts +415 -0
  169. package/src/security/types.ts +416 -0
  170. package/src/security/vetkeys.ts +655 -0
  171. package/src/testing/index.ts +6 -0
  172. package/src/testing/local-runner.ts +264 -0
  173. package/src/testing/types.ts +104 -0
  174. package/src/wallet/cbor-serializer.ts +323 -0
  175. package/src/wallet/chain-dispatcher.ts +313 -0
  176. package/src/wallet/cross-chain-aggregator.ts +346 -0
  177. package/src/wallet/index.ts +76 -0
  178. package/src/wallet/key-derivation.ts +425 -0
  179. package/src/wallet/providers/base-provider.ts +154 -0
  180. package/src/wallet/providers/cketh-provider.ts +434 -0
  181. package/src/wallet/providers/polkadot-provider.ts +503 -0
  182. package/src/wallet/providers/solana-provider.ts +490 -0
  183. package/src/wallet/transaction-queue.ts +284 -0
  184. package/src/wallet/types.ts +178 -0
  185. package/src/wallet/vetkeys-adapter.ts +431 -0
  186. package/src/wallet/wallet-manager.ts +597 -0
  187. package/src/wallet/wallet-storage.ts +380 -0
  188. 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';