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,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
+ }