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,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Persistence Module
|
|
3
|
+
*
|
|
4
|
+
* Manages agent configuration storage in ~/.agentvault/agents/<agent-id>/
|
|
5
|
+
* Supports reading, writing, and listing agent configurations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import * as os from 'node:os';
|
|
11
|
+
import type { ParsedAgentConfig } from './config-schemas.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Base agent vault directory
|
|
15
|
+
*/
|
|
16
|
+
const AGENT_VAULT_DIR = path.join(os.homedir(), '.agentvault');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Agents directory within agent vault
|
|
20
|
+
*/
|
|
21
|
+
const AGENTS_DIR = path.join(AGENT_VAULT_DIR, 'agents');
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get config file path for an agent
|
|
25
|
+
*
|
|
26
|
+
* @param agentId - Agent identifier
|
|
27
|
+
* @param fileName - Name of the config file (default: 'agent.json')
|
|
28
|
+
*/
|
|
29
|
+
export function getConfigPath(agentId: string, fileName: string = 'agent.json'): string {
|
|
30
|
+
const agentDir = path.join(AGENTS_DIR, agentId);
|
|
31
|
+
return path.join(agentDir, fileName);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Ensure agent vault directories exist
|
|
36
|
+
*/
|
|
37
|
+
export function ensureVaultStructure(): void {
|
|
38
|
+
if (!fs.existsSync(AGENT_VAULT_DIR)) {
|
|
39
|
+
fs.mkdirSync(AGENT_VAULT_DIR, { recursive: true, mode: 0o700 });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!fs.existsSync(AGENTS_DIR)) {
|
|
43
|
+
fs.mkdirSync(AGENTS_DIR, { recursive: true, mode: 0o700 });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Write agent configuration to vault
|
|
49
|
+
*
|
|
50
|
+
* @param agentId - Agent identifier
|
|
51
|
+
* @param config - Parsed agent configuration
|
|
52
|
+
* @param fileName - Name of the config file (default: 'agent.json')
|
|
53
|
+
*/
|
|
54
|
+
export function writeAgentConfig(
|
|
55
|
+
agentId: string,
|
|
56
|
+
config: ParsedAgentConfig,
|
|
57
|
+
fileName: string = 'agent.json'
|
|
58
|
+
): void {
|
|
59
|
+
ensureVaultStructure();
|
|
60
|
+
|
|
61
|
+
const agentDir = path.join(AGENTS_DIR, agentId);
|
|
62
|
+
|
|
63
|
+
if (!fs.existsSync(agentDir)) {
|
|
64
|
+
fs.mkdirSync(agentDir, { recursive: true, mode: 0o700 });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const configPath = path.join(agentDir, fileName);
|
|
68
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Read agent configuration from vault
|
|
73
|
+
*
|
|
74
|
+
* @param agentId - Agent identifier
|
|
75
|
+
* @param fileName - Name of the config file (default: 'agent.json')
|
|
76
|
+
*/
|
|
77
|
+
export function readAgentConfig<T extends ParsedAgentConfig>(
|
|
78
|
+
agentId: string,
|
|
79
|
+
fileName: string = 'agent.json'
|
|
80
|
+
): T | null {
|
|
81
|
+
ensureVaultStructure();
|
|
82
|
+
|
|
83
|
+
const agentDir = path.join(AGENTS_DIR, agentId);
|
|
84
|
+
const configPath = path.join(agentDir, fileName);
|
|
85
|
+
|
|
86
|
+
if (!fs.existsSync(configPath)) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
92
|
+
return JSON.parse(content) as T;
|
|
93
|
+
} catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* List all agents in vault
|
|
100
|
+
*
|
|
101
|
+
* @returns Array of agent IDs
|
|
102
|
+
*/
|
|
103
|
+
export function listAgents(): string[] {
|
|
104
|
+
ensureVaultStructure();
|
|
105
|
+
|
|
106
|
+
if (!fs.existsSync(AGENTS_DIR)) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const entries = fs.readdirSync(AGENTS_DIR, { withFileTypes: true });
|
|
111
|
+
const agentIds: string[] = [];
|
|
112
|
+
|
|
113
|
+
for (const entry of entries) {
|
|
114
|
+
const entryPath = path.join(AGENTS_DIR, entry.name);
|
|
115
|
+
const stats = fs.statSync(entryPath);
|
|
116
|
+
if (stats.isDirectory() && fs.existsSync(path.join(entryPath, 'agent.json'))) {
|
|
117
|
+
agentIds.push(entry.name);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return agentIds;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Delete an agent's configuration from vault
|
|
126
|
+
*
|
|
127
|
+
* @param agentId - Agent identifier to remove
|
|
128
|
+
*/
|
|
129
|
+
export function deleteAgentConfig(agentId: string): void {
|
|
130
|
+
const agentDir = path.join(AGENTS_DIR, agentId);
|
|
131
|
+
|
|
132
|
+
if (fs.existsSync(agentDir)) {
|
|
133
|
+
fs.rmSync(agentDir, { recursive: true, force: true });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Configuration Schemas
|
|
3
|
+
*
|
|
4
|
+
* Defines types and schemas for different agent configurations.
|
|
5
|
+
* Supports Clawdbot, Goose, Cline, and Generic agents.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Base agent configuration interface
|
|
10
|
+
*/
|
|
11
|
+
export interface BaseAgentConfig {
|
|
12
|
+
name: string;
|
|
13
|
+
version?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Clawdbot configuration interface
|
|
19
|
+
* Clawdbot uses a .clawdbot directory with JSON files
|
|
20
|
+
*/
|
|
21
|
+
export interface ClawdbotConfig extends BaseAgentConfig {
|
|
22
|
+
type: 'clawdbot';
|
|
23
|
+
projects?: ClawdbotProject[];
|
|
24
|
+
tasks?: ClawdbotTask[];
|
|
25
|
+
context?: Record<string, unknown>;
|
|
26
|
+
settings?: ClawdbotSettings;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ClawdbotProject {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
path?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ClawdbotTask {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
prompt?: string;
|
|
41
|
+
systemPrompt?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface ClawdbotSettings {
|
|
45
|
+
model?: string;
|
|
46
|
+
temperature?: number;
|
|
47
|
+
maxTokens?: number;
|
|
48
|
+
systemPrompt?: string;
|
|
49
|
+
tools?: string[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Goose configuration interface
|
|
54
|
+
* Goose uses YAML configuration files
|
|
55
|
+
*/
|
|
56
|
+
export interface GooseConfig extends BaseAgentConfig {
|
|
57
|
+
type: 'goose';
|
|
58
|
+
model: string;
|
|
59
|
+
temperature?: number;
|
|
60
|
+
maxTokens?: number;
|
|
61
|
+
systemPrompt?: string;
|
|
62
|
+
tools?: string[];
|
|
63
|
+
workingDirectory?: string;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Cline configuration interface
|
|
68
|
+
* Cline uses JSON configuration
|
|
69
|
+
*/
|
|
70
|
+
export interface ClineConfig extends BaseAgentConfig {
|
|
71
|
+
type: 'cline';
|
|
72
|
+
mode?: 'auto' | 'request';
|
|
73
|
+
claudeVersion?: string;
|
|
74
|
+
workingDirectory?: string;
|
|
75
|
+
autoConfirm?: boolean;
|
|
76
|
+
useReadline?: boolean;
|
|
77
|
+
allowedCommands?: string[];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Generic agent configuration interface
|
|
82
|
+
* Generic agents use agent.json or agent.yaml
|
|
83
|
+
*/
|
|
84
|
+
export interface GenericConfig extends BaseAgentConfig {
|
|
85
|
+
type: 'generic';
|
|
86
|
+
entryPoint?: string;
|
|
87
|
+
workingDirectory?: string;
|
|
88
|
+
environment?: Record<string, string>;
|
|
89
|
+
allowedFiles?: string[];
|
|
90
|
+
maxFileSize?: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Union type for all agent configurations
|
|
95
|
+
*/
|
|
96
|
+
export type ParsedAgentConfig =
|
|
97
|
+
| ClawdbotConfig
|
|
98
|
+
| GooseConfig
|
|
99
|
+
| ClineConfig
|
|
100
|
+
| GenericConfig;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Validation result for agent configuration
|
|
104
|
+
*/
|
|
105
|
+
export interface ConfigValidationResult {
|
|
106
|
+
valid: boolean;
|
|
107
|
+
errors: string[];
|
|
108
|
+
warnings: string[];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Config file location
|
|
113
|
+
*/
|
|
114
|
+
export interface ConfigLocation {
|
|
115
|
+
path: string;
|
|
116
|
+
type: 'json' | 'yaml' | 'directory';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Default values for Clawdbot settings
|
|
121
|
+
*/
|
|
122
|
+
export const DEFAULT_CLAWDBOT_SETTINGS: ClawdbotSettings = {
|
|
123
|
+
model: 'claude-3-5-sonnet-20240229',
|
|
124
|
+
temperature: 0.7,
|
|
125
|
+
maxTokens: 4096,
|
|
126
|
+
systemPrompt: '',
|
|
127
|
+
tools: [],
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Default values for Goose configuration
|
|
132
|
+
*/
|
|
133
|
+
export const DEFAULT_GOOSE_CONFIG: Omit<GooseConfig, 'type'> = {
|
|
134
|
+
model: 'gpt-4',
|
|
135
|
+
temperature: 0.7,
|
|
136
|
+
maxTokens: 2048,
|
|
137
|
+
systemPrompt: '',
|
|
138
|
+
tools: [],
|
|
139
|
+
workingDirectory: '.',
|
|
140
|
+
name: 'Agent',
|
|
141
|
+
version: '1.0.0',
|
|
142
|
+
description: '',
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Default values for Cline configuration
|
|
147
|
+
*/
|
|
148
|
+
export const DEFAULT_CLINE_CONFIG: Omit<ClineConfig, 'type'> = {
|
|
149
|
+
mode: 'auto',
|
|
150
|
+
autoConfirm: false,
|
|
151
|
+
useReadline: true,
|
|
152
|
+
workingDirectory: '.',
|
|
153
|
+
name: 'Agent',
|
|
154
|
+
version: '1.0.0',
|
|
155
|
+
description: '',
|
|
156
|
+
};
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent type detection logic
|
|
3
|
+
*
|
|
4
|
+
* Detects what type of agent is in a given directory based on
|
|
5
|
+
* configuration files and directory structure.
|
|
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 { AgentType, AgentConfig } from './types.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Configuration file patterns for each agent type
|
|
15
|
+
*/
|
|
16
|
+
const AGENT_PATTERNS: Record<AgentType, { files: string[]; dirs: string[] }> = {
|
|
17
|
+
clawdbot: {
|
|
18
|
+
files: ['clawdbot.json', 'clawdbot.config.json', '.clawdbot'],
|
|
19
|
+
dirs: ['.clawdbot'],
|
|
20
|
+
},
|
|
21
|
+
goose: {
|
|
22
|
+
files: ['goose.yaml', 'goose.yml', 'goose.config.yaml', '.gooserc'],
|
|
23
|
+
dirs: ['.goose'],
|
|
24
|
+
},
|
|
25
|
+
cline: {
|
|
26
|
+
files: ['cline.json', 'cline.config.json', '.cline'],
|
|
27
|
+
dirs: ['.cline'],
|
|
28
|
+
},
|
|
29
|
+
generic: {
|
|
30
|
+
files: ['agent.json', 'agent.yaml', 'agent.yml', 'agentvault.json'],
|
|
31
|
+
dirs: [],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Check if a file exists at the given path
|
|
37
|
+
*/
|
|
38
|
+
function fileExists(filePath: string): boolean {
|
|
39
|
+
try {
|
|
40
|
+
return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Check if a directory exists at the given path
|
|
48
|
+
*/
|
|
49
|
+
function directoryExists(dirPath: string): boolean {
|
|
50
|
+
try {
|
|
51
|
+
return fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();
|
|
52
|
+
} catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Detect agent type from a source directory
|
|
59
|
+
*/
|
|
60
|
+
export function detectAgentType(sourcePath: string): AgentType {
|
|
61
|
+
const absolutePath = path.resolve(sourcePath);
|
|
62
|
+
|
|
63
|
+
for (const agentType of ['clawdbot', 'goose', 'cline'] as AgentType[]) {
|
|
64
|
+
const patterns = AGENT_PATTERNS[agentType];
|
|
65
|
+
|
|
66
|
+
for (const file of patterns.files) {
|
|
67
|
+
const filePath = path.join(absolutePath, file);
|
|
68
|
+
if (fileExists(filePath)) {
|
|
69
|
+
return agentType;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
for (const dir of patterns.dirs) {
|
|
74
|
+
const dirPath = path.join(absolutePath, dir);
|
|
75
|
+
if (directoryExists(dirPath)) {
|
|
76
|
+
return agentType;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return 'generic';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Extract agent name from the source path or config
|
|
86
|
+
*/
|
|
87
|
+
function extractAgentName(sourcePath: string, config: Record<string, unknown> | null): string {
|
|
88
|
+
if (config && typeof config.name === 'string' && config.name.trim()) {
|
|
89
|
+
return config.name.trim();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const dirName = path.basename(path.resolve(sourcePath));
|
|
93
|
+
|
|
94
|
+
const sanitizedName = dirName.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
95
|
+
|
|
96
|
+
return sanitizedName;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Find configuration file for a detected agent type
|
|
101
|
+
*/
|
|
102
|
+
function findConfigFile(sourcePath: string, agentType: AgentType): string | null {
|
|
103
|
+
const absolutePath = path.resolve(sourcePath);
|
|
104
|
+
const patterns = AGENT_PATTERNS[agentType];
|
|
105
|
+
|
|
106
|
+
for (const file of patterns.files) {
|
|
107
|
+
const filePath = path.join(absolutePath, file);
|
|
108
|
+
if (fileExists(filePath)) {
|
|
109
|
+
return filePath;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Detect entry point for an agent
|
|
118
|
+
*/
|
|
119
|
+
function detectEntryPoint(sourcePath: string, agentType: AgentType): string | undefined {
|
|
120
|
+
const absolutePath = path.resolve(sourcePath);
|
|
121
|
+
|
|
122
|
+
const entryPoints = [
|
|
123
|
+
'index.ts',
|
|
124
|
+
'index.js',
|
|
125
|
+
'main.ts',
|
|
126
|
+
'main.js',
|
|
127
|
+
'agent.ts',
|
|
128
|
+
'agent.js',
|
|
129
|
+
'src/index.ts',
|
|
130
|
+
'src/index.js',
|
|
131
|
+
'src/main.ts',
|
|
132
|
+
'src/main.js',
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
if (agentType === 'clawdbot') {
|
|
136
|
+
entryPoints.unshift('clawdbot.ts', 'clawdbot.js');
|
|
137
|
+
} else if (agentType === 'goose') {
|
|
138
|
+
entryPoints.unshift('goose.ts', 'goose.js');
|
|
139
|
+
} else if (agentType === 'cline') {
|
|
140
|
+
entryPoints.unshift('cline.ts', 'cline.js');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
for (const entry of entryPoints) {
|
|
144
|
+
const entryPath = path.join(absolutePath, entry);
|
|
145
|
+
if (fileExists(entryPath)) {
|
|
146
|
+
return entry;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Detect agent configuration from a source directory
|
|
155
|
+
*
|
|
156
|
+
* @param sourcePath - Path to agent directory
|
|
157
|
+
* @returns Agent configuration with basic detection
|
|
158
|
+
*/
|
|
159
|
+
export function detectAgent(sourcePath: string): AgentConfig {
|
|
160
|
+
const absolutePath = path.resolve(sourcePath);
|
|
161
|
+
|
|
162
|
+
const agentType = detectAgentType(sourcePath);
|
|
163
|
+
|
|
164
|
+
const configFile = findConfigFile(sourcePath, agentType);
|
|
165
|
+
const config = configFile ? tryReadConfig(configFile) : null;
|
|
166
|
+
|
|
167
|
+
const name = extractAgentName(sourcePath, config);
|
|
168
|
+
const entryPoint = detectEntryPoint(sourcePath, agentType);
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
name,
|
|
172
|
+
type: agentType,
|
|
173
|
+
sourcePath: absolutePath,
|
|
174
|
+
entryPoint,
|
|
175
|
+
version: (config?.version as string | undefined),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Validate that the source path exists and is a directory
|
|
181
|
+
*/
|
|
182
|
+
export function validateSourcePath(sourcePath: string): { valid: boolean; error?: string } {
|
|
183
|
+
const absolutePath = path.resolve(sourcePath);
|
|
184
|
+
|
|
185
|
+
if (!fs.existsSync(absolutePath)) {
|
|
186
|
+
return {
|
|
187
|
+
valid: false,
|
|
188
|
+
error: `Source path does not exist: ${absolutePath}`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (!fs.statSync(absolutePath).isDirectory()) {
|
|
193
|
+
return {
|
|
194
|
+
valid: false,
|
|
195
|
+
error: `Source path is not a directory: ${absolutePath}`,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return { valid: true };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Try to read configuration file (JSON or YAML)
|
|
204
|
+
*/
|
|
205
|
+
function tryReadConfig(filePath: string): Record<string, unknown> | null {
|
|
206
|
+
try {
|
|
207
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
208
|
+
|
|
209
|
+
// Check file extension to determine format
|
|
210
|
+
if (filePath.endsWith('.json')) {
|
|
211
|
+
return JSON.parse(content) as Record<string, unknown>;
|
|
212
|
+
} else if (filePath.endsWith('.yaml') || filePath.endsWith('.yml') || filePath.endsWith('.gooserc')) {
|
|
213
|
+
return yaml.parse(content) as Record<string, unknown>;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return null;
|
|
217
|
+
} catch {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Packaging Module
|
|
3
|
+
*
|
|
4
|
+
* Exports all packaging-related functionality.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Types
|
|
8
|
+
export type {
|
|
9
|
+
AgentType,
|
|
10
|
+
AgentConfig,
|
|
11
|
+
PackageOptions,
|
|
12
|
+
PackageResult,
|
|
13
|
+
ValidationError,
|
|
14
|
+
ValidationResult,
|
|
15
|
+
} from './types.js';
|
|
16
|
+
|
|
17
|
+
// Detection
|
|
18
|
+
export { detectAgent, detectAgentType, validateSourcePath } from './detector.js';
|
|
19
|
+
|
|
20
|
+
// Compilation
|
|
21
|
+
export {
|
|
22
|
+
compileToWasm,
|
|
23
|
+
generateWasm,
|
|
24
|
+
generateWat,
|
|
25
|
+
generateStateJson,
|
|
26
|
+
validateWasmFile,
|
|
27
|
+
} from './compiler.js';
|
|
28
|
+
|
|
29
|
+
// WasmEdge Compiler
|
|
30
|
+
export {
|
|
31
|
+
generateWasmEdgeWrapper,
|
|
32
|
+
validateWasmEdgeModule,
|
|
33
|
+
generateWasmEdgeConfig,
|
|
34
|
+
generateWasmEdgeManifest,
|
|
35
|
+
type WasmEdgeOptions,
|
|
36
|
+
DEFAULT_WASMEDGE_OPTIONS,
|
|
37
|
+
} from './wasmedge-compiler.js';
|
|
38
|
+
|
|
39
|
+
// Serialization
|
|
40
|
+
export {
|
|
41
|
+
serializeState,
|
|
42
|
+
deserializeState,
|
|
43
|
+
writeStateFile,
|
|
44
|
+
readStateFile,
|
|
45
|
+
createEmptyState,
|
|
46
|
+
mergeStates,
|
|
47
|
+
validateState,
|
|
48
|
+
} from './serializer.js';
|
|
49
|
+
|
|
50
|
+
// Parsers
|
|
51
|
+
export {
|
|
52
|
+
parseClawdbotConfig,
|
|
53
|
+
findClawdbotConfigs,
|
|
54
|
+
parseGooseConfig,
|
|
55
|
+
findGooseConfigs,
|
|
56
|
+
parseClineConfig,
|
|
57
|
+
findClineConfigs,
|
|
58
|
+
parseGenericConfig,
|
|
59
|
+
findGenericConfigs,
|
|
60
|
+
} from './parsers/index.js';
|
|
61
|
+
|
|
62
|
+
// Config Persistence
|
|
63
|
+
export {
|
|
64
|
+
getConfigPath,
|
|
65
|
+
writeAgentConfig,
|
|
66
|
+
readAgentConfig,
|
|
67
|
+
listAgents,
|
|
68
|
+
deleteAgentConfig,
|
|
69
|
+
} from './config-persistence.js';
|
|
70
|
+
|
|
71
|
+
// Config Schemas
|
|
72
|
+
export {
|
|
73
|
+
DEFAULT_CLAWDBOT_SETTINGS,
|
|
74
|
+
DEFAULT_GOOSE_CONFIG,
|
|
75
|
+
DEFAULT_CLINE_CONFIG,
|
|
76
|
+
} from './config-schemas.js';
|
|
77
|
+
|
|
78
|
+
// Summary - used by package command
|
|
79
|
+
export {
|
|
80
|
+
getPackageSummary,
|
|
81
|
+
packageAgent,
|
|
82
|
+
} from './packager.js';
|
|
83
|
+
|
|
84
|
+
export type {
|
|
85
|
+
Memory,
|
|
86
|
+
Task,
|
|
87
|
+
AgentState,
|
|
88
|
+
SerializedAgentState,
|
|
89
|
+
SerializationOptions,
|
|
90
|
+
} from './serializer.js';
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Packager
|
|
3
|
+
*
|
|
4
|
+
* Main orchestrator for the agent packaging pipeline.
|
|
5
|
+
* Coordinates detection, validation, and compilation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import type { PackageOptions, PackageResult, ValidationResult, ValidationError } from './types.js';
|
|
11
|
+
import { detectAgent, validateSourcePath } from './detector.js';
|
|
12
|
+
import { compileToWasm } from './compiler.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Default output directory name
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_OUTPUT_DIR = 'dist';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Validate agent before packaging
|
|
21
|
+
*/
|
|
22
|
+
export function validateAgent(sourcePath: string): ValidationResult {
|
|
23
|
+
const errors: ValidationError[] = [];
|
|
24
|
+
const warnings: string[] = [];
|
|
25
|
+
|
|
26
|
+
// Validate source path exists
|
|
27
|
+
const pathValidation = validateSourcePath(sourcePath);
|
|
28
|
+
if (!pathValidation.valid) {
|
|
29
|
+
errors.push({
|
|
30
|
+
code: 'INVALID_SOURCE_PATH',
|
|
31
|
+
message: pathValidation.error!,
|
|
32
|
+
filePath: sourcePath,
|
|
33
|
+
});
|
|
34
|
+
return { valid: false, errors, warnings };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Detect agent to check for basic configuration
|
|
38
|
+
const config = detectAgent(sourcePath);
|
|
39
|
+
|
|
40
|
+
// Warn if no entry point detected
|
|
41
|
+
if (!config.entryPoint) {
|
|
42
|
+
warnings.push(
|
|
43
|
+
`No entry point detected for agent '${config.name}'. Consider adding an index.ts or agent.ts file.`
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (config.type === 'goose' && !config.entryPoint) {
|
|
48
|
+
const pythonCandidates = ['goose.py', 'main.py'];
|
|
49
|
+
const hasPythonEntrypoint = pythonCandidates.some((candidate) =>
|
|
50
|
+
fs.existsSync(path.join(path.resolve(sourcePath), candidate))
|
|
51
|
+
);
|
|
52
|
+
if (hasPythonEntrypoint) {
|
|
53
|
+
warnings.push(
|
|
54
|
+
'Goose Python entrypoints are not supported by the bundler. Use a JS/TS entrypoint instead.'
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Warn if using generic type
|
|
60
|
+
if (config.type === 'generic') {
|
|
61
|
+
warnings.push(
|
|
62
|
+
`Agent type detected as 'generic'. For better support, add a config file for clawdbot, goose, or cline.`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
valid: errors.length === 0,
|
|
68
|
+
errors,
|
|
69
|
+
warnings,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Package an agent for deployment
|
|
75
|
+
*
|
|
76
|
+
* This is the main entry point for the packaging pipeline.
|
|
77
|
+
*
|
|
78
|
+
* @param options - Packaging options
|
|
79
|
+
* @returns Package result with paths to generated files
|
|
80
|
+
*/
|
|
81
|
+
export async function packageAgent(options: PackageOptions): Promise<PackageResult> {
|
|
82
|
+
const { sourcePath, outputPath, skipValidation = false } = options;
|
|
83
|
+
|
|
84
|
+
// Validate unless skipped
|
|
85
|
+
if (!skipValidation) {
|
|
86
|
+
const validation = validateAgent(sourcePath);
|
|
87
|
+
if (!validation.valid) {
|
|
88
|
+
const errorMessages = validation.errors.map((e) => e.message).join('; ');
|
|
89
|
+
throw new Error(`Validation failed: ${errorMessages}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Detect agent configuration
|
|
94
|
+
const config = detectAgent(sourcePath);
|
|
95
|
+
|
|
96
|
+
// Determine output directory
|
|
97
|
+
const outputDir = outputPath ?? path.join(path.resolve(sourcePath), DEFAULT_OUTPUT_DIR);
|
|
98
|
+
|
|
99
|
+
// Compile to WASM (includes ic-wasm optimization pipeline)
|
|
100
|
+
const result = await compileToWasm(config, options, outputDir);
|
|
101
|
+
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get a summary of what will be packaged
|
|
107
|
+
*
|
|
108
|
+
* Useful for preview/dry-run functionality
|
|
109
|
+
*/
|
|
110
|
+
export function getPackageSummary(sourcePath: string): {
|
|
111
|
+
config: ReturnType<typeof detectAgent>;
|
|
112
|
+
validation: ValidationResult;
|
|
113
|
+
} {
|
|
114
|
+
const config = detectAgent(sourcePath);
|
|
115
|
+
const validation = validateAgent(sourcePath);
|
|
116
|
+
|
|
117
|
+
return { config, validation };
|
|
118
|
+
}
|