@calimero-network/registry-cli 1.5.2 ā 1.6.1
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/dist/index.js +270 -97
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../client-library/src/client.ts","../src/lib/local-config.ts","../src/lib/local-storage.ts","../src/lib/local-artifacts.ts","../src/lib/registry-client.ts","../src/commands/apps.ts","../src/commands/developers.ts","../src/commands/attestations.ts","../src/commands/health.ts","../src/lib/ipfs.ts","../src/utils/spinner.ts","../src/commands/ipfs.ts","../src/lib/local-server.ts","../src/commands/local.ts","../src/lib/remote-config.ts","../src/commands/bundle.ts","../src/commands/config.ts","../src/index.ts"],"names":["path","fs","spinner","ora","chalk","Command","table","os","crypto"],"mappings":"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","file":"index.js","sourcesContent":["import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport type {\n AppSummary,\n VersionInfo,\n AppManifest,\n DeveloperProfile,\n Attestation,\n ApiError,\n ClientConfig,\n} from './types';\n\n/**\n * SSApp Registry Client\n *\n * A TypeScript client for interacting with the SSApp (Smart Contract Application) Registry API.\n * Provides type-safe methods for managing applications, developers, and attestations.\n *\n * @example\n * ```typescript\n * import { SSAppRegistryClient } from '@calimero-network/registry-client';\n *\n * const client = new SSAppRegistryClient({\n * baseURL: 'https://api.calimero.network',\n * timeout: 10000,\n * });\n *\n * // Get all applications\n * const apps = await client.getApps();\n *\n * // Get specific application versions\n * const versions = await client.getAppVersions('developer-pubkey', 'app-name');\n * ```\n */\nexport class SSAppRegistryClient {\n private api: AxiosInstance;\n\n /**\n * Creates a new SSApp Registry client instance.\n *\n * @param config - Configuration options for the client\n * @param config.baseURL - Base URL for the API (default: 'http://localhost:8082')\n * @param config.timeout - Request timeout in milliseconds (default: 10000)\n * @param config.headers - Additional headers to include in requests\n *\n * @example\n * ```typescript\n * // Basic configuration\n * const client = new SSAppRegistryClient();\n *\n * // Custom configuration\n * const client = new SSAppRegistryClient({\n * baseURL: 'https://api.calimero.network',\n * timeout: 30000,\n * headers: {\n * 'Authorization': 'Bearer token',\n * },\n * });\n * ```\n */\n constructor(config: ClientConfig = {}) {\n this.api = axios.create({\n baseURL: config.baseURL || 'http://localhost:8082',\n timeout: config.timeout || 10000,\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n });\n\n // Error interceptor\n this.api.interceptors.response.use(\n (response: AxiosResponse) => response,\n error => {\n const apiError: ApiError = {\n message: error.response?.data?.message || error.message,\n code: error.response?.data?.code,\n details: error.response?.data?.details,\n };\n return Promise.reject(apiError);\n }\n );\n }\n\n /**\n * Retrieves a list of all applications with optional filtering.\n *\n * @param params - Optional filtering parameters\n * @param params.dev - Filter by developer public key\n * @param params.name - Filter by application name (partial match)\n * @returns Promise resolving to an array of application summaries\n *\n * @example\n * ```typescript\n * // Get all applications\n * const allApps = await client.getApps();\n *\n * // Filter by developer\n * const devApps = await client.getApps({ dev: 'ed25519:abc123...' });\n *\n * // Filter by name\n * const walletApps = await client.getApps({ name: 'wallet' });\n *\n * // Filter by both\n * const filteredApps = await client.getApps({\n * dev: 'ed25519:abc123...',\n * name: 'wallet'\n * });\n * ```\n *\n * @throws {ApiError} When the API request fails\n */\n async getApps(params?: {\n dev?: string;\n name?: string;\n }): Promise<AppSummary[]> {\n const response = await this.api.get('/apps', { params });\n return response.data;\n }\n\n /**\n * Retrieves all versions of a specific application.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param appName - Name of the application\n * @returns Promise resolving to an array of version information\n *\n * @example\n * ```typescript\n * const versions = await client.getAppVersions(\n * 'ed25519:abc123...',\n * 'my-wallet-app'\n * );\n *\n * versions.forEach(version => {\n * console.log(`Version ${version.semver}: ${version.cid}`);\n * if (version.yanked) {\n * console.log(' ā ļø This version has been yanked');\n * }\n * });\n * ```\n *\n * @throws {ApiError} When the application is not found or request fails\n */\n async getAppVersions(appId: string): Promise<VersionInfo[]> {\n const response = await this.api.get(`/apps/${appId}`);\n return response.data;\n }\n\n /**\n * Retrieves the complete manifest for a specific application version.\n *\n * @param appId - Unique application identifier\n * @param semver - Semantic version (e.g., '1.0.0', '2.1.3')\n * @returns Promise resolving to the application manifest\n *\n * @example\n * ```typescript\n * const manifest = await client.getAppManifest('my-wallet-app', '1.2.0');\n *\n * console.log(`App: ${manifest.app.name}`);\n * console.log(`Version: ${manifest.version.semver}`);\n * console.log(`Supported chains: ${manifest.supported_chains.join(', ')}`);\n *\n * // Check permissions\n * manifest.permissions.forEach(perm => {\n * console.log(`Permission: ${perm.cap} (${perm.bytes} bytes)`);\n * });\n *\n * // List artifacts\n * manifest.artifacts.forEach(artifact => {\n * console.log(`Artifact: ${artifact.type} -> ${artifact.cid}`);\n * });\n * ```\n *\n * @throws {ApiError} When the manifest is not found or request fails\n */\n async getAppManifest(appId: string, semver: string): Promise<AppManifest> {\n const response = await this.api.get(`/apps/${appId}/${semver}`);\n return response.data;\n }\n\n /**\n * Retrieves developer profile information.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @returns Promise resolving to the developer profile\n *\n * @example\n * ```typescript\n * const profile = await client.getDeveloper('ed25519:abc123...');\n *\n * console.log(`Developer: ${profile.display_name}`);\n * if (profile.website) {\n * console.log(`Website: ${profile.website}`);\n * }\n *\n * // Check verification proofs\n * profile.proofs.forEach(proof => {\n * const status = proof.verified ? 'ā
' : 'ā';\n * console.log(`${status} ${proof.type}: ${proof.value}`);\n * });\n * ```\n *\n * @throws {ApiError} When the developer is not found or request fails\n */\n async getDeveloper(pubkey: string): Promise<DeveloperProfile> {\n const response = await this.api.get(`/developers/${pubkey}`);\n return response.data;\n }\n\n /**\n * Retrieves attestation information for a specific application version.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param appName - Name of the application\n * @param semver - Semantic version (e.g., '1.0.0', '2.1.3')\n * @returns Promise resolving to the attestation information\n *\n * @example\n * ```typescript\n * const attestation = await client.getAttestation(\n * 'ed25519:abc123...',\n * 'my-wallet-app',\n * '1.2.0'\n * );\n *\n * console.log(`Status: ${attestation.status}`);\n * console.log(`Timestamp: ${attestation.timestamp}`);\n * if (attestation.comment) {\n * console.log(`Comment: ${attestation.comment}`);\n * }\n *\n * // Check status\n * switch (attestation.status) {\n * case 'ok':\n * console.log('ā
Application is verified and safe');\n * break;\n * case 'yanked':\n * console.log('ā ļø Application has been yanked');\n * break;\n * case 'tested':\n * console.log('š§Ŗ Application is in testing phase');\n * break;\n * }\n * ```\n *\n * @throws {ApiError} When the attestation is not found or request fails\n */\n async getAttestation(\n pubkey: string,\n appName: string,\n semver: string\n ): Promise<Attestation> {\n const response = await this.api.get(\n `/attestations/${pubkey}/${appName}/${semver}`\n );\n return response.data;\n }\n\n /**\n * Submits a new application manifest to the registry.\n *\n * @param manifest - Complete application manifest with signature\n * @returns Promise resolving to submission result\n *\n * @example\n * ```typescript\n * const manifest: AppManifest = {\n * manifest_version: '1.0.0',\n * app: {\n * name: 'my-wallet-app',\n * developer_pubkey: 'ed25519:abc123...',\n * id: 'unique-app-id',\n * alias: 'My Wallet',\n * },\n * version: {\n * semver: '1.0.0',\n * },\n * supported_chains: ['mainnet', 'testnet'],\n * permissions: [\n * { cap: 'wallet', bytes: 1024 },\n * { cap: 'network', bytes: 512 },\n * ],\n * artifacts: [\n * {\n * type: 'wasm',\n * target: 'browser',\n * cid: 'QmHash...',\n * size: 1024000,\n * },\n * ],\n * metadata: {\n * description: 'A secure wallet application',\n * author: 'John Doe',\n * },\n * distribution: 'ipfs',\n * signature: {\n * alg: 'ed25519',\n * sig: 'signature...',\n * signed_at: '2024-01-01T00:00:00Z',\n * },\n * };\n *\n * const result = await client.submitAppManifest(manifest);\n *\n * if (result.success) {\n * console.log('ā
Manifest submitted successfully');\n * console.log(result.message);\n * } else {\n * console.log('ā Submission failed');\n * console.log(result.message);\n * }\n * ```\n *\n * @throws {ApiError} When the submission fails (validation errors, etc.)\n */\n async submitAppManifest(\n manifest: AppManifest\n ): Promise<{ success: boolean; message: string }> {\n const response = await this.api.post('/apps', manifest);\n return response.data;\n }\n\n /**\n * Submits or updates developer profile information.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param profile - Developer profile information\n * @returns Promise resolving to submission result\n *\n * @example\n * ```typescript\n * const profile: DeveloperProfile = {\n * display_name: 'John Doe',\n * website: 'https://johndoe.dev',\n * proofs: [\n * {\n * type: 'github',\n * value: 'johndoe',\n * verified: true,\n * },\n * {\n * type: 'twitter',\n * value: '@johndoe',\n * verified: false,\n * },\n * ],\n * };\n *\n * const result = await client.submitDeveloperProfile(\n * 'ed25519:abc123...',\n * profile\n * );\n *\n * if (result.success) {\n * console.log('ā
Profile submitted successfully');\n * } else {\n * console.log('ā Submission failed:', result.message);\n * }\n * ```\n *\n * @throws {ApiError} When the submission fails (validation errors, etc.)\n */\n async submitDeveloperProfile(\n pubkey: string,\n profile: DeveloperProfile\n ): Promise<{ success: boolean; message: string }> {\n const response = await this.api.post('/developers', {\n pubkey,\n ...profile,\n });\n return response.data;\n }\n\n /**\n * Submits an attestation for a specific application version.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param appName - Name of the application\n * @param semver - Semantic version (e.g., '1.0.0', '2.1.3')\n * @param attestation - Attestation information\n * @returns Promise resolving to submission result\n *\n * @example\n * ```typescript\n * const attestation: Attestation = {\n * status: 'ok',\n * comment: 'Passed security audit and functionality testing',\n * timestamp: new Date().toISOString(),\n * };\n *\n * const result = await client.submitAttestation(\n * 'ed25519:abc123...',\n * 'my-wallet-app',\n * '1.2.0',\n * attestation\n * );\n *\n * if (result.success) {\n * console.log('ā
Attestation submitted successfully');\n * } else {\n * console.log('ā Submission failed:', result.message);\n * }\n * ```\n *\n * @throws {ApiError} When the submission fails (validation errors, etc.)\n */\n async submitAttestation(\n pubkey: string,\n appName: string,\n semver: string,\n attestation: Attestation\n ): Promise<{ success: boolean; message: string }> {\n const response = await this.api.post(\n `/attestations/${pubkey}/${appName}/${semver}`,\n attestation\n );\n return response.data;\n }\n\n /**\n * Checks if the API is healthy and responding.\n *\n * @returns Promise resolving to health status\n *\n * @example\n * ```typescript\n * try {\n * const health = await client.healthCheck();\n * console.log(`API Status: ${health.status}`);\n *\n * if (health.status === 'ok') {\n * console.log('ā
API is healthy');\n * } else {\n * console.log('ā ļø API has issues');\n * }\n * } catch (error) {\n * console.log('ā API is not responding');\n * }\n * ```\n *\n * @throws {ApiError} When the API is not responding\n */\n async healthCheck(): Promise<{ status: string }> {\n const response = await this.api.get('/healthz');\n return response.data;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface LocalConfigData {\n server: {\n port: number;\n host: string;\n publicHost: string;\n };\n data: {\n dir: string;\n artifactsDir: string;\n };\n artifacts: {\n storageDir: string;\n serveLocal: boolean;\n copyArtifacts: boolean;\n maxFileSize: string;\n allowedTypes: string[];\n };\n}\n\nexport class LocalConfig {\n private configPath: string;\n private dataDir: string;\n private config: LocalConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'config.json'\n );\n this.dataDir = path.join(os.homedir(), '.calimero-registry');\n this.config = this.loadConfig();\n }\n\n private loadConfig(): LocalConfigData {\n // Create default config\n const defaultConfig: LocalConfigData = {\n server: {\n port: 8082,\n host: '0.0.0.0',\n publicHost: 'host.docker.internal',\n },\n data: {\n dir: path.join(os.homedir(), '.calimero-registry', 'data'),\n artifactsDir: path.join(\n os.homedir(),\n '.calimero-registry',\n 'artifacts'\n ),\n },\n artifacts: {\n storageDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n serveLocal: true,\n copyArtifacts: true,\n maxFileSize: '100MB',\n allowedTypes: ['wasm', 'js', 'html'],\n },\n };\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n server: {\n ...defaultConfig.server,\n ...(existingConfig.server || {}),\n },\n data: {\n ...defaultConfig.data,\n ...(existingConfig.data || {}),\n },\n artifacts: {\n ...defaultConfig.artifacts,\n ...(existingConfig.artifacts || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaultConfig;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config\n fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n }\n\n // Server configuration\n getPort(): number {\n return this.config.server.port;\n }\n\n setPort(port: number): void {\n this.config.server.port = port;\n this.saveConfig();\n }\n\n getHost(): string {\n return this.config.server.host;\n }\n\n setHost(host: string): void {\n this.config.server.host = host;\n this.saveConfig();\n }\n\n getPublicHost(): string {\n return this.config.server.publicHost;\n }\n\n setPublicHost(host: string): void {\n this.config.server.publicHost = host;\n this.saveConfig();\n }\n\n // Data directory configuration\n getDataDir(): string {\n return this.config.data.dir;\n }\n\n setDataDir(dir: string): void {\n this.config.data.dir = dir;\n this.config.artifacts.storageDir = path.join(dir, 'artifacts');\n this.saveConfig();\n }\n\n getArtifactsDir(): string {\n return this.config.data.artifactsDir;\n }\n\n setArtifactsDir(dir: string): void {\n this.config.data.artifactsDir = dir;\n this.config.artifacts.storageDir = dir;\n this.saveConfig();\n }\n\n // Artifact configuration\n getArtifactsConfig() {\n return this.config.artifacts;\n }\n\n setArtifactsConfig(config: Partial<LocalConfigData['artifacts']>): void {\n this.config.artifacts = { ...this.config.artifacts, ...config };\n this.saveConfig();\n }\n\n // Utility methods\n ensureDirectories(): void {\n const dirs = [\n this.getDataDir(),\n this.getArtifactsDir(),\n path.join(this.getDataDir(), 'backups'),\n path.join(this.getDataDir(), 'logs'),\n ];\n\n dirs.forEach(dir => {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n });\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n\n // Get full configuration\n getConfig(): LocalConfigData {\n return { ...this.config };\n }\n\n // Reset to defaults\n reset(): void {\n this.config = {\n server: {\n port: 8082,\n host: 'localhost',\n },\n data: {\n dir: path.join(os.homedir(), '.calimero-registry', 'data'),\n artifactsDir: path.join(\n os.homedir(),\n '.calimero-registry',\n 'artifacts'\n ),\n },\n artifacts: {\n storageDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n serveLocal: true,\n copyArtifacts: true,\n maxFileSize: '100MB',\n allowedTypes: ['wasm', 'js', 'html'],\n },\n };\n this.saveConfig();\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { LocalConfig } from './local-config.js';\n\nexport interface AppSummary {\n id: string;\n name: string;\n latest_version: string;\n latest_digest: string;\n developer_pubkey?: string;\n alias?: string;\n}\n\nexport interface VersionInfo {\n semver: string;\n digest: string;\n cid: string; // Added for compatibility\n yanked: boolean;\n}\n\n// --- V2 / Bundle Manifest Support ---\n\nexport interface BundleArtifact {\n path: string;\n hash: string | null;\n size: number;\n}\n\nexport interface BundleMetadata {\n name: string;\n description?: string;\n icon?: string;\n tags?: string[];\n license?: string;\n}\n\nexport interface BundleInterfaces {\n exports?: string[];\n uses?: string[];\n}\n\nexport interface BundleLinks {\n frontend?: string;\n github?: string;\n docs?: string;\n}\n\nexport interface BundleSignature {\n alg: string;\n sig: string;\n pubkey: string;\n signed_at: string;\n}\n\nexport interface BundleManifest {\n version: string; // \"1.0\" (internal manifest version)\n package: string;\n appVersion: string;\n\n metadata?: BundleMetadata;\n interfaces?: BundleInterfaces;\n\n wasm?: BundleArtifact;\n abi?: BundleArtifact;\n migrations: BundleArtifact[];\n\n links?: BundleLinks;\n signature?: BundleSignature;\n}\n\nexport interface LocalRegistryData {\n apps: Map<string, AppSummary>;\n bundleManifests: Map<string, BundleManifest>; // Key: \"package/version\"\n artifacts: Map<string, string>; // digest -> file path\n}\n\nexport class LocalDataStore {\n private config: LocalConfig;\n private data: LocalRegistryData;\n private appsFile: string;\n private bundleManifestsFile: string;\n private artifactsFile: string;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.appsFile = path.join(config.getDataDir(), 'apps.json');\n this.bundleManifestsFile = path.join(\n config.getDataDir(),\n 'bundle_manifests.json'\n );\n this.artifactsFile = path.join(config.getDataDir(), 'artifacts.json');\n this.data = {\n apps: new Map(),\n bundleManifests: new Map(),\n artifacts: new Map(),\n };\n this.loadData();\n }\n\n private loadData(): void {\n try {\n // Load apps\n if (fs.existsSync(this.appsFile)) {\n const appsData = JSON.parse(fs.readFileSync(this.appsFile, 'utf8'));\n this.data.apps = new Map(Object.entries(appsData));\n }\n\n // Load bundle manifests\n if (fs.existsSync(this.bundleManifestsFile)) {\n const bundleManifestsData = JSON.parse(\n fs.readFileSync(this.bundleManifestsFile, 'utf8')\n );\n this.data.bundleManifests = new Map(\n Object.entries(bundleManifestsData)\n );\n }\n\n // Load artifacts\n if (fs.existsSync(this.artifactsFile)) {\n const artifactsData = JSON.parse(\n fs.readFileSync(this.artifactsFile, 'utf8')\n );\n this.data.artifacts = new Map(Object.entries(artifactsData));\n }\n } catch {\n console.warn('Failed to load existing data, starting fresh');\n }\n }\n\n private saveData(): void {\n try {\n // Ensure data directory exists\n this.config.ensureDirectories();\n\n // Save apps\n const appsObj = Object.fromEntries(this.data.apps);\n fs.writeFileSync(this.appsFile, JSON.stringify(appsObj, null, 2));\n\n // Save bundle manifests\n const bundleManifestsObj = Object.fromEntries(this.data.bundleManifests);\n fs.writeFileSync(\n this.bundleManifestsFile,\n JSON.stringify(bundleManifestsObj, null, 2)\n );\n\n // Save artifacts\n const artifactsObj = Object.fromEntries(this.data.artifacts);\n fs.writeFileSync(\n this.artifactsFile,\n JSON.stringify(artifactsObj, null, 2)\n );\n } catch (error) {\n throw new Error(\n `Failed to save data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n // Apps management\n getApps(filters?: { name?: string; dev?: string }): AppSummary[] {\n let apps = Array.from(this.data.apps.values());\n\n if (filters?.name) {\n apps = apps.filter(app => app.name.includes(filters.name!));\n }\n\n if (filters?.dev) {\n apps = apps.filter(app => app.developer_pubkey === filters.dev);\n }\n\n return apps;\n }\n\n getApp(appKey: string): AppSummary | undefined {\n return this.data.apps.get(appKey);\n }\n\n setApp(appKey: string, app: AppSummary): void {\n this.data.apps.set(appKey, app);\n this.saveData();\n }\n\n // Versions management (bundles only)\n getAppVersions(packageId: string): VersionInfo[] {\n const versions: VersionInfo[] = [];\n\n // Get bundle versions\n for (const [key, manifest] of this.data.bundleManifests.entries()) {\n if (key.startsWith(`${packageId}/`)) {\n const semver = key.split('/').pop()!;\n const digest = manifest.wasm?.hash || '';\n versions.push({\n semver,\n digest,\n cid: digest, // Compatibility\n yanked: false,\n });\n }\n }\n\n return versions.sort((a, b) =>\n a.semver.localeCompare(b.semver, undefined, { numeric: true })\n );\n }\n\n // Manifest management (V2 / Bundles)\n getBundleManifest(pkg: string, version: string): BundleManifest | undefined {\n const key = `${pkg}/${version}`;\n return this.data.bundleManifests.get(key);\n }\n\n setBundleManifest(\n pkg: string,\n version: string,\n manifest: BundleManifest\n ): void {\n const key = `${pkg}/${version}`;\n this.data.bundleManifests.set(key, manifest);\n this.saveData();\n }\n\n // Artifact management\n getArtifactPath(hash: string): string | undefined {\n return this.data.artifacts.get(hash);\n }\n\n setArtifactPath(hash: string, filePath: string): void {\n this.data.artifacts.set(hash, filePath);\n this.saveData();\n }\n\n // Statistics\n getStats() {\n return {\n publishedApps: this.data.apps.size,\n totalVersions: this.data.bundleManifests.size,\n totalArtifacts: this.data.artifacts.size,\n };\n }\n\n // Backup and restore\n async backup(outputPath?: string): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupPath =\n outputPath ||\n path.join(\n this.config.getDataDir(),\n 'backups',\n `backup-${timestamp}.json`\n );\n\n // Ensure backup directory exists\n const backupDir = path.dirname(backupPath);\n if (!fs.existsSync(backupDir)) {\n fs.mkdirSync(backupDir, { recursive: true });\n }\n\n const backupData = {\n timestamp: new Date().toISOString(),\n apps: Object.fromEntries(this.data.apps),\n bundleManifests: Object.fromEntries(this.data.bundleManifests),\n artifacts: Object.fromEntries(this.data.artifacts),\n };\n\n fs.writeFileSync(backupPath, JSON.stringify(backupData, null, 2));\n return backupPath;\n }\n\n async restore(backupPath: string): Promise<void> {\n if (!fs.existsSync(backupPath)) {\n throw new Error(`Backup file not found: ${backupPath}`);\n }\n\n const backupData = JSON.parse(fs.readFileSync(backupPath, 'utf8'));\n\n // Restore data\n this.data.apps = new Map(Object.entries(backupData.apps || {}));\n this.data.bundleManifests = new Map(\n Object.entries(backupData.bundleManifests || {})\n );\n this.data.artifacts = new Map(Object.entries(backupData.artifacts || {}));\n\n this.saveData();\n }\n\n // Reset data\n reset(): void {\n this.data.apps.clear();\n this.data.bundleManifests.clear();\n this.data.artifacts.clear();\n this.saveData();\n }\n\n /**\n * Get all bundle manifests\n */\n getAllBundles(): BundleManifest[] {\n return Array.from(this.data.bundleManifests.values());\n }\n\n // Seed with sample data\n async seed(): Promise<void> {\n // V2 Sample Bundle\n const bundleManifest: BundleManifest = {\n version: '1.0',\n package: 'com.calimero.sample-bundle',\n appVersion: '1.0.0',\n metadata: {\n name: 'Sample Bundle App',\n description: 'A sample application using V2 Bundle Manifest',\n tags: ['sample', 'v2'],\n license: 'MIT',\n },\n interfaces: {\n exports: ['com.calimero.sample.v1'],\n uses: [],\n },\n links: {\n frontend: 'https://example.com/app',\n github: 'https://github.com/example/app',\n },\n wasm: {\n path: 'app.wasm',\n size: 1024,\n hash: null,\n },\n abi: {\n path: 'abi.json',\n size: 512,\n hash: null,\n },\n migrations: [],\n };\n\n this.setBundleManifest(\n bundleManifest.package,\n bundleManifest.appVersion,\n bundleManifest\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { Buffer } from 'buffer';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore, V1Manifest } from './local-storage.js';\n\nexport class LocalArtifactServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactsDir: string;\n\n constructor(config: LocalConfig, dataStore: LocalDataStore) {\n this.config = config;\n this.dataStore = dataStore;\n this.artifactsDir = config.getArtifactsDir();\n this.ensureArtifactsDir();\n }\n\n private ensureArtifactsDir(): void {\n if (!fs.existsSync(this.artifactsDir)) {\n fs.mkdirSync(this.artifactsDir, { recursive: true });\n }\n }\n\n // Copy artifact to local storage\n async copyArtifactToLocal(\n sourcePath: string,\n appId: string,\n version: string,\n filename: string\n ): Promise<string> {\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Source file not found: ${sourcePath}`);\n }\n\n // Create app version directory\n const appVersionDir = path.join(this.artifactsDir, appId, version);\n if (!fs.existsSync(appVersionDir)) {\n fs.mkdirSync(appVersionDir, { recursive: true });\n }\n\n // Copy file to local storage\n const targetPath = path.join(appVersionDir, filename);\n fs.copyFileSync(sourcePath, targetPath);\n\n // Calculate file hash for tracking\n const fileHash = await this.calculateFileHash(targetPath);\n this.dataStore.setArtifactPath(fileHash, targetPath);\n\n return targetPath;\n }\n\n // Serve artifact by app ID, version, and filename\n async serveArtifact(\n appId: string,\n version: string,\n filename: string\n ): Promise<Buffer> {\n const artifactPath = path.join(this.artifactsDir, appId, version, filename);\n\n if (!fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found: ${artifactPath}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Serve artifact by hash\n async serveByHash(hash: string): Promise<Buffer> {\n const artifactPath = this.dataStore.getArtifactPath(hash);\n\n if (!artifactPath || !fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found for hash: ${hash}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Validate artifact file\n async validateArtifact(\n filePath: string\n ): Promise<{ size: number; sha256: string }> {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const stats = fs.statSync(filePath);\n const fileBuffer = fs.readFileSync(filePath);\n const sha256 = crypto.createHash('sha256').update(fileBuffer).digest('hex');\n\n return {\n size: stats.size,\n sha256,\n };\n }\n\n // Calculate file hash\n private async calculateFileHash(filePath: string): Promise<string> {\n const fileBuffer = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(fileBuffer).digest('hex');\n }\n\n // Get artifact URL for local serving\n getArtifactUrl(appId: string, version: string, filename: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${appId}/${version}/${filename}`;\n }\n\n // Get artifact URL by hash\n getArtifactUrlByHash(hash: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${hash}`;\n }\n\n // Update manifest artifact to use local URLs (and preserve HTTP access)\n updateManifestArtifact(manifest: V1Manifest): V1Manifest {\n const updatedManifest: V1Manifest = { ...manifest };\n\n if (!manifest.artifact?.uri) {\n return updatedManifest;\n }\n\n const uri = manifest.artifact.uri;\n\n if (uri.startsWith('/')) {\n updatedManifest.artifact = {\n ...manifest.artifact,\n uri: `${this.getArtifactUrl(manifest.id, manifest.version, path.basename(manifest.artifact.uri))}`,\n };\n } else if (uri.startsWith('file://')) {\n const filePath = uri.replace('file://', '');\n const filename = path.basename(filePath);\n updatedManifest.artifact = {\n ...manifest.artifact,\n uri: this.getArtifactUrl(manifest.id, manifest.version, filename),\n };\n }\n\n return updatedManifest;\n }\n\n // Clean up old artifacts\n async cleanupOldArtifacts(\n maxAge: number = 30 * 24 * 60 * 60 * 1000\n ): Promise<void> {\n const now = Date.now();\n\n // Get all artifact files\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n const age = now - stats.mtime.getTime();\n\n if (age > maxAge) {\n fs.unlinkSync(file);\n console.log(`Cleaned up old artifact: ${file}`);\n }\n }\n }\n\n // Get artifact statistics\n getArtifactStats(): {\n totalFiles: number;\n totalSize: number;\n oldestFile: Date | null;\n } {\n let totalFiles = 0;\n let totalSize = 0;\n let oldestFile: Date | null = null;\n\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n if (fs.existsSync(this.artifactsDir)) {\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n totalFiles++;\n totalSize += stats.size;\n\n if (!oldestFile || stats.mtime < oldestFile) {\n oldestFile = stats.mtime;\n }\n }\n }\n\n return {\n totalFiles,\n totalSize,\n oldestFile,\n };\n }\n}\n","import { SSAppRegistryClient } from '@calimero-network/registry-client';\nimport { LocalConfig } from './local-config.js';\nimport {\n LocalDataStore,\n AppSummary,\n VersionInfo,\n V1Manifest,\n} from './local-storage.js';\nimport { LocalArtifactServer } from './local-artifacts.js';\nimport fs from 'fs';\nimport path from 'path';\n\nexport interface RegistryClient {\n getApps(filters?: { name?: string }): Promise<AppSummary[]>;\n getAppVersions(appId: string): Promise<VersionInfo[]>;\n getAppManifest(appId: string, semver: string): Promise<V1Manifest>;\n submitAppManifest(\n manifest: V1Manifest\n ): Promise<{ success: boolean; message: string }>;\n healthCheck(): Promise<{ status: string }>;\n}\n\nexport class RemoteRegistryClient implements RegistryClient {\n private client: SSAppRegistryClient;\n\n constructor(baseURL: string, timeout: number) {\n this.client = new SSAppRegistryClient({\n baseURL,\n timeout,\n });\n }\n\n async getApps(filters?: { name?: string }): Promise<AppSummary[]> {\n return await this.client.getApps(filters);\n }\n\n async getAppVersions(appId: string): Promise<VersionInfo[]> {\n return await this.client.getAppVersions(appId);\n }\n\n async getAppManifest(appId: string, semver: string): Promise<V1Manifest> {\n return await this.client.getAppManifest(appId, semver);\n }\n\n async submitAppManifest(\n manifest: V1Manifest\n ): Promise<{ success: boolean; message: string }> {\n return await this.client.submitAppManifest(manifest);\n }\n\n async healthCheck(): Promise<{ status: string }> {\n return await this.client.healthCheck();\n }\n}\n\nexport class LocalRegistryClient implements RegistryClient {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactServer: LocalArtifactServer;\n\n constructor() {\n this.config = new LocalConfig();\n this.dataStore = new LocalDataStore(this.config);\n this.artifactServer = new LocalArtifactServer(this.config, this.dataStore);\n }\n\n async getApps(filters?: { name?: string }): Promise<AppSummary[]> {\n return this.dataStore.getApps(filters);\n }\n\n async getAppVersions(appId: string): Promise<VersionInfo[]> {\n return this.dataStore.getAppVersions(appId);\n }\n\n async getAppManifest(appId: string, semver: string): Promise<V1Manifest> {\n const manifest = this.dataStore.getManifest(appId, semver);\n if (!manifest) {\n throw new Error('Manifest not found');\n }\n return this.artifactServer.updateManifestArtifact(manifest);\n }\n\n async submitAppManifest(\n manifest: V1Manifest\n ): Promise<{ success: boolean; message: string }> {\n if (!this.validateManifest(manifest)) {\n throw new Error('Invalid manifest structure');\n }\n\n const processedManifest = await this.processManifestArtifacts(manifest);\n const manifestKey = `${processedManifest.id}/${processedManifest.version}`;\n this.dataStore.setManifest(manifestKey, processedManifest);\n\n const appSummary: AppSummary = {\n id: processedManifest.id,\n name: processedManifest.name,\n latest_version: processedManifest.version,\n latest_digest: processedManifest.artifact.digest,\n };\n this.dataStore.setApp(processedManifest.id, appSummary);\n\n return {\n success: true,\n message: 'App version registered successfully',\n };\n }\n\n async healthCheck(): Promise<{ status: string }> {\n return { status: 'ok' };\n }\n\n private validateManifest(manifest: V1Manifest): boolean {\n return !!(\n manifest.manifest_version &&\n manifest.id &&\n manifest.name &&\n manifest.version &&\n manifest.artifact &&\n manifest.artifact.type &&\n manifest.artifact.target &&\n manifest.artifact.digest &&\n manifest.artifact.uri\n );\n }\n\n private async processManifestArtifacts(\n manifest: V1Manifest\n ): Promise<V1Manifest> {\n const processedManifest: V1Manifest = { ...manifest };\n\n if (manifest.artifact?.uri?.startsWith('file://')) {\n const filePath = manifest.artifact.uri.replace('file://', '');\n\n if (fs.existsSync(filePath)) {\n const filename = path.basename(filePath);\n\n try {\n await this.artifactServer.copyArtifactToLocal(\n filePath,\n manifest.id,\n manifest.version,\n filename\n );\n\n processedManifest.artifact = {\n ...manifest.artifact,\n uri: this.artifactServer.getArtifactUrl(\n manifest.id,\n manifest.version,\n filename\n ),\n };\n } catch (error) {\n console.warn(`Failed to copy artifact ${filePath}:`, error);\n }\n }\n }\n\n return processedManifest;\n }\n}\n\nexport function createRegistryClient(\n useLocal: boolean,\n baseURL?: string,\n timeout?: number\n): RegistryClient {\n if (useLocal) {\n return new LocalRegistryClient();\n } else {\n return new RemoteRegistryClient(\n baseURL || 'http://localhost:8082',\n timeout || 10000\n );\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { table } from 'table';\nimport { createRegistryClient } from '../lib/registry-client.js';\nimport fs from 'fs';\nimport path from 'path';\n\nexport const appsCommand = new Command('apps')\n .description('Manage SSApp applications')\n .addCommand(\n new Command('list')\n .description('List all applications')\n .option('-n, --name <name>', 'Filter by application name')\n .action(async (options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora('Fetching applications...').start();\n\n try {\n const apps = await client.getApps({\n name: options.name,\n });\n\n spinner.succeed(`Found ${apps.length} application(s)`);\n\n if (apps.length === 0) {\n console.log(chalk.yellow('No applications found'));\n return;\n }\n\n const tableData = [\n ['ID', 'Name', 'Latest Version', 'Digest'],\n ...apps.map(app => [\n app.id,\n app.name,\n app.latest_version,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (app.latest_digest || (app as any).latest_cid || 'N/A')\n .toString()\n .substring(0, 12) + '...',\n ]),\n ];\n\n console.log(table(tableData));\n } catch (error) {\n spinner.fail('Failed to fetch applications');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('versions')\n .description('List versions of a specific application')\n .argument('<appId>', 'Application ID')\n .action(async (appId, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora(`Fetching versions for ${appId}...`).start();\n\n try {\n const versions = await client.getAppVersions(appId);\n\n spinner.succeed(`Found ${versions.length} version(s)`);\n\n if (versions.length === 0) {\n console.log(chalk.yellow('No versions found'));\n return;\n }\n\n const tableData = [\n ['Version', 'CID', 'Yanked'],\n ...versions.map(version => [\n version.semver,\n version.cid.substring(0, 12) + '...',\n version.yanked ? chalk.red('Yes') : chalk.green('No'),\n ]),\n ];\n\n console.log(table(tableData));\n } catch (error) {\n spinner.fail('Failed to fetch versions');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('manifest')\n .description('Get manifest for a specific application version')\n .argument('<appId>', 'Application ID')\n .argument('<version>', 'Application version')\n .action(async (appId, version, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora(\n `Fetching manifest for ${appId}@${version}...`\n ).start();\n\n try {\n const manifest = await client.getAppManifest(appId, version);\n\n spinner.succeed('Manifest fetched successfully');\n\n console.log(chalk.blue('\\nApplication Manifest:'));\n console.log(JSON.stringify(manifest, null, 2));\n } catch (error) {\n spinner.fail('Failed to fetch manifest');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('submit')\n .description('Submit a new application manifest')\n .argument('<manifest-file>', 'Path to the manifest JSON file')\n .action(async (manifestFile, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora('Reading manifest file...').start();\n\n try {\n // Read and parse the manifest file\n const manifestPath = path.resolve(manifestFile);\n if (!fs.existsSync(manifestPath)) {\n spinner.fail('Manifest file not found');\n console.error(chalk.red(`File not found: ${manifestFile}`));\n process.exit(1);\n }\n\n const manifestContent = fs.readFileSync(manifestPath, 'utf8');\n const manifest = JSON.parse(manifestContent);\n\n spinner.text = 'Submitting application manifest...';\n\n const result = await client.submitAppManifest(manifest);\n\n spinner.succeed('Application submitted successfully');\n console.log(chalk.green(`\\nā
${result.message}`));\n\n if (manifest.app?.name) {\n console.log(chalk.blue(`\\nš± App: ${manifest.app.name}`));\n console.log(\n chalk.blue(`š¤ Developer: ${manifest.app.developer_pubkey}`)\n );\n console.log(chalk.blue(`š¦ Version: ${manifest.version?.semver}`));\n }\n } catch (error) {\n spinner.fail('Failed to submit application');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { table } from 'table';\nimport { SSAppRegistryClient } from '@calimero-network/registry-client';\n\nexport const developersCommand = new Command('developers')\n .description('Manage developer profiles')\n .addCommand(\n new Command('get')\n .description('Get developer profile information')\n .argument('<pubkey>', 'Developer public key')\n .action(async (pubkey, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const client = new SSAppRegistryClient({\n baseURL: globalOpts?.url || 'http://localhost:8082',\n timeout: parseInt(globalOpts?.timeout || '10000'),\n });\n\n const spinner = ora('Fetching developer profile...').start();\n\n try {\n const profile = await client.getDeveloper(pubkey);\n\n spinner.succeed('Developer profile fetched successfully');\n\n console.log(chalk.blue('\\nDeveloper Profile:'));\n console.log(chalk.green('Display Name:'), profile.display_name);\n if (profile.website) {\n console.log(chalk.green('Website:'), profile.website);\n }\n\n if (profile.proofs.length > 0) {\n console.log(chalk.green('\\nProofs:'));\n const tableData = [\n ['Type', 'Value', 'Verified'],\n ...profile.proofs.map(proof => [\n proof.type,\n proof.value.substring(0, 20) + '...',\n proof.verified ? chalk.green('Yes') : chalk.red('No'),\n ]),\n ];\n console.log(table(tableData));\n } else {\n console.log(chalk.yellow('\\nNo proofs found'));\n }\n } catch (error) {\n spinner.fail('Failed to fetch developer profile');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('create')\n .description('Create a new developer profile')\n .argument('<pubkey>', 'Developer public key')\n .argument('<display-name>', 'Display name for the developer')\n .option('-w, --website <url>', 'Developer website URL')\n .option('-p, --proofs <proofs>', 'JSON string of proofs array')\n .action(async (pubkey, displayName, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const client = new SSAppRegistryClient({\n baseURL: globalOpts?.url || 'http://localhost:8082',\n timeout: parseInt(globalOpts?.timeout || '10000'),\n });\n\n const spinner = ora('Creating developer profile...').start();\n\n try {\n let proofs = [];\n if (options.proofs) {\n try {\n proofs = JSON.parse(options.proofs);\n } catch {\n spinner.fail('Invalid proofs JSON format');\n console.error(chalk.red('Proofs must be a valid JSON array'));\n process.exit(1);\n }\n }\n\n const profile = {\n pubkey,\n display_name: displayName,\n website: options.website,\n proofs,\n };\n\n const result = await client.submitDeveloperProfile(pubkey, profile);\n\n spinner.succeed('Developer profile created successfully');\n console.log(chalk.green(`\\nā
${result.message}`));\n console.log(chalk.blue(`\\nš¤ Developer: ${displayName}`));\n console.log(chalk.blue(`š Public Key: ${pubkey}`));\n if (options.website) {\n console.log(chalk.blue(`š Website: ${options.website}`));\n }\n } catch (error) {\n spinner.fail('Failed to create developer profile');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { SSAppRegistryClient } from '@calimero-network/registry-client';\n\nexport const attestationsCommand = new Command('attestations')\n .description('Manage application attestations')\n .addCommand(\n new Command('get')\n .description('Get attestation for a specific application version')\n .argument('<pubkey>', 'Developer public key')\n .argument('<name>', 'Application name')\n .argument('<version>', 'Application version')\n .action(async (pubkey, name, version, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const client = new SSAppRegistryClient({\n baseURL: globalOpts?.url || 'http://localhost:8082',\n timeout: parseInt(globalOpts?.timeout || '10000'),\n });\n\n const spinner = ora(\n `Fetching attestation for ${name}@${version}...`\n ).start();\n\n try {\n const attestation = await client.getAttestation(\n pubkey,\n name,\n version\n );\n\n spinner.succeed('Attestation fetched successfully');\n\n console.log(chalk.blue('\\nAttestation:'));\n console.log(chalk.green('Status:'), attestation.status);\n console.log(chalk.green('Timestamp:'), attestation.timestamp);\n if (attestation.comment) {\n console.log(chalk.green('Comment:'), attestation.comment);\n }\n } catch (error) {\n spinner.fail('Failed to fetch attestation');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { createRegistryClient } from '../lib/registry-client.js';\n\nexport const healthCommand = new Command('health')\n .description('Check the health of the SSApp Registry API')\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora('Checking API health...').start();\n\n try {\n const health = await client.healthCheck();\n spinner.succeed('API is healthy');\n console.log(chalk.green(`Status: ${health.status}`));\n } catch (error) {\n spinner.fail('API health check failed');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n });\n","import { writeFileSync, existsSync } from 'fs';\n\nexport async function uploadToIPFS(filePath: string): Promise<string> {\n try {\n // For now, we'll simulate IPFS upload since public gateways require authentication\n // In production, you'd use a service like Pinata, Infura, or your own IPFS node\n\n // Check if file exists (this satisfies the linter by using filePath)\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // Use a hardcoded valid CID for demo\n const simulatedCid = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG';\n\n console.log('ā ļø Using simulated IPFS upload for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n return simulatedCid;\n } catch (error) {\n throw new Error(\n `Failed to upload to IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\nexport async function downloadFromIPFS(\n cid: string,\n outputPath?: string\n): Promise<string> {\n try {\n // For demo purposes, we'll simulate IPFS download\n // In production, you'd actually download from IPFS\n\n console.log('ā ļø Using simulated IPFS download for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n // Generate a simulated file content based on CID\n const simulatedContent = `Simulated IPFS file content for CID: ${cid}\\nThis is a demo file that would normally contain the actual application data.`;\n\n // Determine output path\n const finalOutputPath = outputPath || `${cid}.wasm`;\n\n // Write the simulated content to file\n writeFileSync(finalOutputPath, simulatedContent);\n\n return finalOutputPath;\n } catch (error) {\n throw new Error(\n `Failed to download from IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n","import ora from 'ora';\n\nexport const spinner = (text: string) => ora(text);\n","import { Command } from 'commander';\nimport { uploadToIPFS, downloadFromIPFS } from '../lib/ipfs';\nimport { spinner } from '../utils/spinner';\n\nexport const ipfsCommand = new Command('ipfs')\n .description('IPFS operations')\n .addCommand(\n new Command('upload')\n .description('Upload a file to IPFS')\n .argument('<file>', 'Path to the file to upload')\n .action(async file => {\n const s = spinner('Uploading to IPFS...').start();\n\n try {\n const cid = await uploadToIPFS(file);\n s.succeed(`File uploaded successfully!`);\n console.log(`CID: ${cid}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Upload failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('download')\n .description('Download a file from IPFS')\n .argument('<cid>', 'IPFS CID to download')\n .argument('[output]', 'Output file path (optional)')\n .action(async (cid, output) => {\n const s = spinner('Downloading from IPFS...').start();\n\n try {\n const outputPath = await downloadFromIPFS(cid, output);\n s.succeed(`File downloaded successfully!`);\n console.log(`Saved to: ${outputPath}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Download failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n );\n","import fastify, { FastifyInstance } from 'fastify';\nimport cors from '@fastify/cors';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore, BundleManifest } from './local-storage.js';\nimport { LocalArtifactServer } from './local-artifacts.js';\nimport fs from 'fs';\n\nexport interface ServerStatus {\n running: boolean;\n url: string;\n dataDir: string;\n appsCount: number;\n artifactsCount: number;\n}\n\nexport class LocalRegistryServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactServer: LocalArtifactServer;\n private server: FastifyInstance | null = null;\n private isRunning = false;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.dataStore = new LocalDataStore(config);\n this.artifactServer = new LocalArtifactServer(config, this.dataStore);\n }\n\n async start(port?: number): Promise<void> {\n if (this.isRunning) {\n throw new Error('Local registry is already running');\n }\n\n const serverPort = port || this.config.getPort();\n const host = this.config.getHost();\n\n // Ensure directories exist\n this.config.ensureDirectories();\n\n // Create Fastify server\n this.server = fastify({\n logger: {\n level: 'info',\n },\n });\n\n // Register CORS\n await this.server.register(cors, {\n origin: true,\n credentials: true,\n });\n\n // Register routes\n await this.registerRoutes();\n\n // Start server\n await this.server.listen({ port: serverPort, host });\n this.isRunning = true;\n\n console.log(\n `Local registry server started on http://${host}:${serverPort}`\n );\n }\n\n async stop(): Promise<void> {\n if (!this.server || !this.isRunning) {\n throw new Error('Local registry is not running');\n }\n\n await this.server.close();\n this.isRunning = false;\n this.server = null;\n }\n\n async getStatus(): Promise<ServerStatus> {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n running: this.isRunning,\n url: `http://${this.config.getHost()}:${this.config.getPort()}`,\n dataDir: this.config.getDataDir(),\n appsCount: stats.publishedApps,\n artifactsCount: artifactStats.totalFiles,\n };\n }\n\n async reset(): Promise<void> {\n this.dataStore.reset();\n\n // Clean up artifacts directory\n const artifactsDir = this.config.getArtifactsDir();\n if (fs.existsSync(artifactsDir)) {\n fs.rmSync(artifactsDir, { recursive: true, force: true });\n }\n }\n\n async backup(outputPath?: string): Promise<string> {\n return await this.dataStore.backup(outputPath);\n }\n\n async restore(backupPath: string): Promise<void> {\n await this.dataStore.restore(backupPath);\n }\n\n async seed(): Promise<void> {\n await this.dataStore.seed();\n }\n\n private async registerRoutes(): Promise<void> {\n if (!this.server) {\n throw new Error('Server not initialized');\n }\n\n // Health endpoint\n this.server.get('/healthz', async () => {\n return { status: 'ok' };\n });\n\n // Statistics endpoint\n this.server.get('/stats', async () => {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n publishedApps: stats.publishedApps,\n totalVersions: stats.totalVersions,\n totalArtifacts: artifactStats.totalFiles,\n totalSize: artifactStats.totalSize,\n };\n });\n\n // Artifact endpoints\n this.server.get(\n '/artifacts/:appId/:version/:filename',\n async (request, reply) => {\n const { appId, version, filename } = request.params as {\n appId: string;\n version: string;\n filename: string;\n };\n\n try {\n const artifactData = await this.artifactServer.serveArtifact(\n appId,\n version,\n filename\n );\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n reply.header(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n }\n );\n\n this.server.get('/artifacts/:hash', async (request, reply) => {\n const { hash } = request.params as { hash: string };\n\n try {\n const artifactData = await this.artifactServer.serveByHash(hash);\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n });\n\n // Local registry management endpoints\n this.server.get('/local/status', async () => {\n return await this.getStatus();\n });\n\n this.server.post('/local/reset', async () => {\n await this.reset();\n return { message: 'Local registry data reset successfully' };\n });\n\n this.server.get('/local/backup', async request => {\n const query = request.query as { output?: string };\n const backupPath = await this.backup(query.output);\n return { backupPath };\n });\n\n this.server.post('/local/restore', async request => {\n const { backupPath } = request.body as { backupPath: string };\n await this.restore(backupPath);\n return { message: 'Data restored successfully' };\n });\n\n this.server.post('/local/seed', async () => {\n await this.seed();\n return { message: 'Sample data seeded successfully' };\n });\n\n // V2 Bundle API endpoints\n this.server.get('/api/v2/bundles', async (request, reply) => {\n const query = request.query as {\n package?: string;\n version?: string;\n developer?: string;\n };\n\n const { package: pkg, version, developer } = query;\n\n // If specific package and version requested, return single bundle\n if (pkg && version) {\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n if (!manifest) {\n return reply.code(404).send({\n error: 'bundle_not_found',\n message: `Bundle ${pkg}@${version} not found`,\n });\n }\n return [manifest];\n }\n\n // Get all bundles\n const allBundles = this.dataStore.getAllBundles();\n const bundles = [];\n\n for (const bundle of allBundles) {\n // Filter by package if specified\n if (pkg && bundle.package !== pkg) {\n continue;\n }\n\n // Filter by developer pubkey if specified\n if (developer) {\n const bundlePubkey = bundle.signature?.pubkey;\n if (!bundlePubkey || bundlePubkey !== developer) {\n continue;\n }\n }\n\n bundles.push(bundle);\n }\n\n // Sort by package name, then by version (descending)\n bundles.sort((a, b) => {\n const pkgCompare = a.package.localeCompare(b.package);\n if (pkgCompare !== 0) return pkgCompare;\n // For same package, sort by version descending\n return b.appVersion.localeCompare(a.appVersion, undefined, {\n numeric: true,\n });\n });\n\n // If filtering by package, return all versions\n // Otherwise, return only latest version per package\n if (pkg) {\n return bundles;\n }\n\n // Group by package and return only latest version\n const latestByPackage = new Map<string, BundleManifest>();\n for (const bundle of bundles) {\n const existing = latestByPackage.get(bundle.package);\n if (!existing || bundle.appVersion > existing.appVersion) {\n latestByPackage.set(bundle.package, bundle);\n }\n }\n\n return Array.from(latestByPackage.values());\n });\n\n this.server.get(\n '/api/v2/bundles/:package/:version',\n async (request, reply) => {\n const { package: pkg, version } = request.params as {\n package: string;\n version: string;\n };\n\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n\n if (!manifest) {\n return reply.code(404).send({\n error: 'manifest_not_found',\n message: `Manifest not found for ${pkg}@${version}`,\n });\n }\n\n return manifest;\n }\n );\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { LocalRegistryServer } from '../lib/local-server.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport fs from 'fs';\n\nconst localCommand = new Command('local').description(\n 'Manage local registry for development'\n);\n\n// Start local registry\nlocalCommand.addCommand(\n new Command('start')\n .description('Start local registry server')\n .option('-p, --port <port>', 'Port to run the server on', '8082')\n .option('-h, --host <host>', 'Host to bind the server to', '0.0.0.0')\n .option(\n '--public-host <host>',\n 'Public host exposed in manifest artifact URLs',\n 'host.docker.internal'\n )\n .action(async options => {\n const spinner = ora('Starting local registry...').start();\n\n try {\n const config = new LocalConfig();\n config.setHost(options.host);\n config.setPublicHost(options.publicHost);\n config.setPort(parseInt(options.port, 10));\n const server = new LocalRegistryServer(config);\n\n await server.start(parseInt(options.port));\n\n spinner.succeed(\n `Local registry started on http://${config.getHost()}:${config.getPort()}`\n );\n console.log(chalk.blue('\\nš± Local Registry Status:'));\n console.log(\n chalk.green(\n `ā
Server: http://${config.getHost()}:${config.getPort()}`\n )\n );\n console.log(\n chalk.green(\n `š Public URL: http://${config.getPublicHost()}:${config.getPort()}`\n )\n );\n console.log(chalk.green(`š Data: ${config.getDataDir()}`));\n console.log(\n chalk.green(\n `š Health: http://${config.getHost()}:${config.getPort()}/healthz`\n )\n );\n console.log(\n chalk.green(\n `š Stats: http://${config.getHost()}:${config.getPort()}/stats`\n )\n );\n console.log(\n chalk.blue(\n '\\nš” Use --local flag with other commands to use local registry'\n )\n );\n } catch (error) {\n spinner.fail('Failed to start local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Stop local registry\nlocalCommand.addCommand(\n new Command('stop')\n .description('Stop local registry server')\n .action(async () => {\n const spinner = ora('Stopping local registry...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.stop();\n\n spinner.succeed('Local registry stopped');\n } catch (error) {\n spinner.fail('Failed to stop local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Status check\nlocalCommand.addCommand(\n new Command('status')\n .description('Check local registry status')\n .action(async () => {\n const spinner = ora('Checking local registry status...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const status = await server.getStatus();\n\n if (status.running) {\n spinner.succeed('Local registry is running');\n console.log(chalk.green(`ā
Server: ${status.url}`));\n console.log(chalk.green(`š Data: ${status.dataDir}`));\n console.log(chalk.green(`š Apps: ${status.appsCount} applications`));\n console.log(\n chalk.green(`š¦ Artifacts: ${status.artifactsCount} artifacts`)\n );\n } else {\n spinner.warn('Local registry is not running');\n console.log(\n chalk.yellow(\n 'š” Run \"calimero-registry local start\" to start the local registry'\n )\n );\n }\n } catch (error) {\n spinner.fail('Failed to check local registry status');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Reset local data\nlocalCommand.addCommand(\n new Command('reset')\n .description('Reset local registry data')\n .option('-f, --force', 'Force reset without confirmation')\n .action(async options => {\n if (!options.force) {\n console.log(\n chalk.yellow('ā ļø This will delete all local registry data!')\n );\n console.log(chalk.yellow(' Use --force flag to confirm'));\n return;\n }\n\n const spinner = ora('Resetting local registry data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.reset();\n\n spinner.succeed('Local registry data reset');\n console.log(chalk.green('ā
All local data has been cleared'));\n } catch (error) {\n spinner.fail('Failed to reset local registry data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Backup local data\nlocalCommand.addCommand(\n new Command('backup')\n .description('Backup local registry data')\n .option('-o, --output <file>', 'Output file path')\n .action(async options => {\n const spinner = ora('Creating backup...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const backupPath = await server.backup(options.output);\n\n spinner.succeed('Backup created successfully');\n console.log(chalk.green(`š¦ Backup saved to: ${backupPath}`));\n } catch (error) {\n spinner.fail('Failed to create backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Restore from backup\nlocalCommand.addCommand(\n new Command('restore')\n .description('Restore local registry data from backup')\n .argument('<backup-file>', 'Path to backup file')\n .action(async backupFile => {\n const spinner = ora('Restoring from backup...').start();\n\n try {\n if (!fs.existsSync(backupFile)) {\n spinner.fail('Backup file not found');\n console.error(chalk.red(`File not found: ${backupFile}`));\n process.exit(1);\n }\n\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.restore(backupFile);\n\n spinner.succeed('Data restored successfully');\n console.log(chalk.green(`ā
Restored from: ${backupFile}`));\n } catch (error) {\n spinner.fail('Failed to restore from backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Seed with sample data\nlocalCommand.addCommand(\n new Command('seed')\n .description('Seed local registry with sample data')\n .action(async () => {\n const spinner = ora('Seeding local registry with sample data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.seed();\n\n spinner.succeed('Sample data seeded successfully');\n console.log(\n chalk.green('ā
Local registry populated with sample applications')\n );\n console.log(\n chalk.blue(\n 'š” Run \"calimero-registry apps list --local\" to see the sample apps'\n )\n );\n } catch (error) {\n spinner.fail('Failed to seed sample data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\nexport { localCommand };\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface RemoteConfigData {\n registry: {\n url: string;\n apiKey?: string;\n };\n}\n\nexport class RemoteConfig {\n private configPath: string;\n private config: RemoteConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'remote-config.json'\n );\n this.config = this.loadConfig();\n }\n\n private loadConfig(): RemoteConfigData {\n // Create default config\n const defaultConfig: RemoteConfigData = {\n registry: {\n url: 'https://apps.calimero.network',\n },\n };\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n registry: {\n ...defaultConfig.registry,\n ...(existingConfig.registry || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaultConfig;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config - always save API key if it's set in config\n // (env var takes precedence when reading, but doesn't prevent saving)\n const configToSave: RemoteConfigData = {\n registry: {\n url: this.config.registry.url,\n // Save API key if it exists in config (regardless of env var)\n ...(this.config.registry.apiKey\n ? { apiKey: this.config.registry.apiKey }\n : {}),\n },\n };\n fs.writeFileSync(this.configPath, JSON.stringify(configToSave, null, 2));\n }\n\n /**\n * Get registry URL with priority:\n * 1. Environment variable CALIMERO_REGISTRY_URL\n * 2. Config file value\n * 3. Default value\n */\n getRegistryUrl(): string {\n return (\n process.env.CALIMERO_REGISTRY_URL ||\n this.config.registry.url ||\n 'https://apps.calimero.network'\n );\n }\n\n /**\n * Set registry URL\n */\n setRegistryUrl(url: string): void {\n this.config.registry.url = url;\n this.saveConfig();\n }\n\n /**\n * Get API key with priority:\n * 1. Environment variable CALIMERO_API_KEY\n * 2. Config file value\n * 3. undefined\n */\n getApiKey(): string | undefined {\n return process.env.CALIMERO_API_KEY || this.config.registry.apiKey;\n }\n\n /**\n * Set API key (stored in config file)\n */\n setApiKey(apiKey: string): void {\n this.config.registry.apiKey = apiKey;\n this.saveConfig();\n }\n\n /**\n * Remove API key from config\n */\n removeApiKey(): void {\n delete this.config.registry.apiKey;\n this.saveConfig();\n }\n\n /**\n * Get full configuration\n */\n getConfig(): RemoteConfigData {\n return {\n registry: {\n url: this.getRegistryUrl(),\n // Don't expose API key in getConfig (security)\n apiKey: this.getApiKey() ? '***' : undefined,\n },\n };\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Reset to defaults\n */\n reset(): void {\n this.config = {\n registry: {\n url: 'https://apps.calimero.network',\n },\n };\n this.saveConfig();\n }\n}\n","/**\n * Bundle Management Commands\n *\n * Implements:\n * - bundle push <file.mpk>\n * - bundle get <package> <version>\n */\n\nimport { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport * as tar from 'tar';\nimport crypto from 'crypto';\nimport { LocalDataStore, BundleManifest } from '../lib/local-storage.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport { LocalArtifactServer } from '../lib/local-artifacts.js';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\ninterface BundlePushPayload {\n version: string;\n package: string;\n appVersion: string;\n _binary: string;\n _overwrite: boolean;\n metadata?: BundleManifest['metadata'];\n interfaces?: BundleManifest['interfaces'];\n wasm?: BundleManifest['wasm'];\n abi?: BundleManifest['abi'];\n migrations?: BundleManifest['migrations'];\n links?: BundleManifest['links'];\n signature?: BundleManifest['signature'];\n}\n\ninterface ApiResponseBody {\n message?: string;\n error?: string;\n package?: string;\n version?: string;\n [key: string]: unknown;\n}\n\nexport const bundleCommand = new Command('bundle')\n .description('Manage application bundles (V2)')\n .addCommand(createCreateCommand())\n .addCommand(createPushCommand())\n .addCommand(createGetCommand());\n\nfunction createCreateCommand(): Command {\n return new Command('create')\n .description('Create an MPK bundle from a WASM file')\n .argument('<wasm-file>', 'Path to the WASM file')\n .argument('<package>', 'Package name (e.g. com.calimero.myapp)')\n .argument('<version>', 'Version (e.g. 1.0.0)')\n .option('-o, --output <path>', 'Output path for the MPK file')\n .option('--name <name>', 'Application name')\n .option('--description <description>', 'Application description')\n .option('--author <author>', 'Application author', 'Calimero Team')\n .option('--frontend <url>', 'Frontend URL')\n .option('--github <url>', 'GitHub URL')\n .option('--docs <url>', 'Documentation URL')\n .option(\n '--export <interface>',\n 'Export interface (can be specified multiple times)',\n (value, prev) => {\n return [...(prev || []), value];\n }\n )\n .option(\n '--use <interface>',\n 'Use interface (can be specified multiple times)',\n (value, prev) => {\n return [...(prev || []), value];\n }\n )\n .action(async (wasmFile, pkg, version, options) => {\n try {\n const wasmPath = path.resolve(wasmFile);\n if (!fs.existsSync(wasmPath)) {\n console.error(`ā WASM file not found: ${wasmFile}`);\n process.exit(1);\n }\n\n console.log(`š¦ Creating MPK bundle from: ${path.basename(wasmPath)}`);\n\n // Read WASM file\n const wasmContent = fs.readFileSync(wasmPath);\n const wasmSize = wasmContent.length;\n\n // Calculate SHA256 hash\n const hash = crypto\n .createHash('sha256')\n .update(wasmContent)\n .digest('hex');\n\n // Build metadata\n const metadata: {\n name: string;\n description: string;\n author: string;\n } = {\n name: options.name || pkg,\n description: options.description || '',\n author: options.author || 'Calimero Team',\n };\n\n // Build links if provided\n const links: {\n frontend?: string;\n github?: string;\n docs?: string;\n } = {};\n if (options.frontend) links.frontend = options.frontend;\n if (options.github) links.github = options.github;\n if (options.docs) links.docs = options.docs;\n\n // Build interfaces\n const interfaces = {\n exports: options.export || [],\n uses: options.use || [],\n };\n\n // Create bundle manifest\n const manifest: BundleManifest = {\n version: '1.0',\n package: pkg,\n appVersion: version,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n interfaces:\n interfaces.exports.length > 0 || interfaces.uses.length > 0\n ? interfaces\n : undefined,\n wasm: {\n path: 'app.wasm',\n hash: hash,\n size: wasmSize,\n },\n abi: null,\n migrations: [],\n links: Object.keys(links).length > 0 ? links : undefined,\n signature: undefined,\n };\n\n // Determine output path\n let outputPath = options.output;\n if (!outputPath) {\n const outputDir = path.join(process.cwd(), pkg, version);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n outputPath = path.join(outputDir, `${pkg}-${version}.mpk`);\n } else {\n outputPath = path.resolve(outputPath);\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n }\n\n // Create temporary directory for bundle contents\n const tempDir = path.join(\n path.dirname(outputPath),\n `.temp-bundle-${Date.now()}`\n );\n fs.mkdirSync(tempDir, { recursive: true });\n\n try {\n // Write manifest.json\n fs.writeFileSync(\n path.join(tempDir, 'manifest.json'),\n JSON.stringify(manifest, null, 2)\n );\n\n // Copy WASM file as app.wasm\n fs.writeFileSync(path.join(tempDir, 'app.wasm'), wasmContent);\n\n // Create gzip-compressed tar archive\n await tar.create(\n {\n gzip: true,\n file: outputPath,\n cwd: tempDir,\n },\n ['manifest.json', 'app.wasm']\n );\n\n const outputSize = fs.statSync(outputPath).size;\n console.log(`ā
Created MPK bundle: ${outputPath}`);\n console.log(` Package: ${pkg}`);\n console.log(` Version: ${version}`);\n console.log(` Size: ${outputSize} bytes`);\n console.log(` WASM Hash: ${hash}`);\n } finally {\n // Cleanup temp directory\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n console.error('ā Failed to create bundle:', message);\n process.exit(1);\n }\n });\n}\n\nfunction createPushCommand(): Command {\n return new Command('push')\n .description(\n 'Push a bundle (.mpk) to the registry (local or remote). Defaults to local registry.'\n )\n .argument('<bundle-file>', 'Path to the .mpk bundle file')\n .option('--local', 'Push to local registry instance (default)')\n .option('--remote', 'Push to remote registry instance')\n .option(\n '--url <registry-url>',\n 'Registry URL for remote push (overrides config file)'\n )\n .option(\n '--api-key <key>',\n 'API key for authentication (overrides config file and env var)'\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry bundle push bundle.mpk --local\n $ calimero-registry bundle push bundle.mpk --remote\n $ calimero-registry bundle push bundle.mpk --remote --url https://apps.calimero.network\n $ calimero-registry bundle push bundle.mpk --remote --api-key your-api-key\n\nConfiguration:\n Set defaults using the config command:\n $ calimero-registry config set registry-url https://apps.calimero.network\n $ calimero-registry config set api-key your-api-key\n \n Or use environment variables:\n $ export CALIMERO_REGISTRY_URL=https://apps.calimero.network\n $ export CALIMERO_API_KEY=your-api-key\n\nNote:\n - Use --local for development/testing with local registry\n - Use --remote for production deployments\n - Config file values are used unless overridden by flags or environment variables\n - Priority: flag > environment variable > config file > default\n`\n )\n .action(async (bundleFile, options) => {\n try {\n // Warn if remote-only options are used without --remote\n if (!options.remote && (options.url || options.apiKey)) {\n console.warn(\n 'ā ļø Warning: --url and --api-key are only used with --remote flag'\n );\n console.warn(\n ' These options will be ignored. Use --remote to push to remote registry.'\n );\n }\n\n // Determine mode: default to local if neither flag is set\n // Handle explicit false from --no-local flag\n const useLocal =\n options.local === false\n ? false\n : options.local === true\n ? true\n : !options.remote;\n const useRemote = options.remote === true;\n\n // Ensure mutually exclusive flags\n if (options.local && options.remote) {\n console.error('ā Cannot use both --local and --remote flags');\n process.exit(1);\n }\n\n // Ensure at least one mode is selected\n if (!useLocal && !useRemote) {\n console.error(\n 'ā No push mode specified. Use --local or --remote flag'\n );\n process.exit(1);\n }\n\n const fullPath = path.resolve(bundleFile);\n if (!fs.existsSync(fullPath)) {\n console.error(`ā File not found: ${bundleFile}`);\n process.exit(1);\n }\n\n console.log(`š¦ Processing bundle: ${path.basename(fullPath)}`);\n\n // 1. Read bundle and extract manifest\n const manifest = await extractManifest(fullPath);\n\n if (!manifest) {\n console.error('ā manifest.json not found in bundle');\n process.exit(1);\n }\n\n // 2. Validate manifest\n if (!manifest.package || !manifest.appVersion) {\n console.error('ā Invalid manifest: missing package or appVersion');\n process.exit(1);\n }\n\n console.log(` Package: ${manifest.package}`);\n console.log(` Version: ${manifest.appVersion}`);\n if (manifest.metadata) {\n console.log(` Name: ${manifest.metadata.name}`);\n }\n\n // 3. Store (Local Mode)\n if (useLocal) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const artifactServer = new LocalArtifactServer(config, store);\n\n // Copy bundle artifact to local storage\n const bundleFilename = `${manifest.package}-${manifest.appVersion}.mpk`;\n const targetPath = await artifactServer.copyArtifactToLocal(\n fullPath,\n manifest.package,\n manifest.appVersion,\n bundleFilename\n );\n\n console.log(` Artifact stored: ${targetPath}`);\n\n // Update manifest with local artifact path/url?\n // Actually, for V2 bundles, the registry serves the whole .mpk.\n // The manifest inside the registry is metadata.\n // We might want to store the bundle download URL in the manifest we serve via API?\n // Or just keep it implicit (API constructs download link).\n\n // For local-storage, we can add a field to track where the .mpk is.\n // But LocalDataStore mainly stores the JSON.\n // The artifacts are stored by convention in artifacts/package/version/.\n\n store.setBundleManifest(\n manifest.package,\n manifest.appVersion,\n manifest\n );\n console.log('ā
Bundle manifest registered locally');\n console.log(\n ` Run 'calimero-registry bundle get ${manifest.package} ${manifest.appVersion}' to verify`\n );\n } else if (useRemote) {\n // Remote Mode: Push to remote registry\n // Get values from config file, with flag/environment variable overrides\n const remoteConfig = new RemoteConfig();\n const registryUrl =\n options.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n const apiKey =\n options.apiKey ||\n process.env.CALIMERO_API_KEY ||\n remoteConfig.getApiKey();\n\n await pushToRemote(fullPath, manifest, registryUrl, apiKey);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('ā Failed to push bundle:', message);\n process.exit(1);\n }\n });\n}\n\nfunction createGetCommand(): Command {\n return new Command('get')\n .description('Get bundle manifest')\n .argument('<package>', 'Package name (e.g. com.calimero.kv)')\n .argument('<version>', 'Version (e.g. 1.0.0)')\n .option('--local', 'Use local registry', true)\n .action(async (pkg, version, options) => {\n try {\n if (options.local) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const manifest = store.getBundleManifest(pkg, version);\n\n if (manifest) {\n console.log(JSON.stringify(manifest, null, 2));\n } else {\n console.error(`ā Manifest not found: ${pkg}@${version}`);\n process.exit(1);\n }\n } else {\n console.error('ā Remote get not implemented yet');\n process.exit(1);\n }\n } catch (error) {\n console.error('ā Error:', error);\n process.exit(1);\n }\n });\n}\n\n// Helper to push bundle to remote registry\nasync function pushToRemote(\n bundlePath: string,\n manifest: BundleManifest,\n registryUrl: string,\n apiKey?: string\n): Promise<void> {\n try {\n console.log(`š¤ Pushing to remote registry: ${registryUrl}`);\n\n // 1. Read bundle file as binary\n const bundleBuffer = fs.readFileSync(bundlePath);\n const bundleSize = bundleBuffer.length;\n console.log(` Bundle size: ${bundleSize} bytes`);\n\n // 2. Convert bundle to hex string\n const bundleHex = bundleBuffer.toString('hex');\n console.log(` Converted to hex (${bundleHex.length} characters)`);\n\n // 3. Build request payload matching API format\n const payload: BundlePushPayload = {\n version: manifest.version || '1.0',\n package: manifest.package,\n appVersion: manifest.appVersion,\n _binary: bundleHex,\n _overwrite: true,\n };\n\n // Preserve all manifest fields\n if (manifest.metadata) {\n payload.metadata = manifest.metadata;\n }\n if (manifest.interfaces) {\n payload.interfaces = manifest.interfaces;\n }\n if (manifest.wasm) {\n payload.wasm = manifest.wasm;\n }\n if (manifest.abi) {\n payload.abi = manifest.abi;\n }\n if (manifest.migrations && manifest.migrations.length > 0) {\n payload.migrations = manifest.migrations;\n }\n if (manifest.links) {\n payload.links = manifest.links;\n }\n if (manifest.signature) {\n payload.signature = manifest.signature;\n }\n\n // 4. Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add API key if provided (from option or environment variable)\n const finalApiKey = apiKey || process.env.CALIMERO_API_KEY;\n if (finalApiKey) {\n headers['Authorization'] = `Bearer ${finalApiKey}`;\n }\n\n // 5. POST to remote registry\n const apiUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/push`;\n console.log(` POST ${apiUrl}`);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseText = await response.text();\n let responseBody: ApiResponseBody;\n try {\n responseBody = JSON.parse(responseText) as ApiResponseBody;\n } catch {\n responseBody = { message: responseText };\n }\n\n // 6. Handle response\n if (response.status === 201) {\n console.log('ā
Bundle manifest uploaded successfully');\n console.log(` Package: ${responseBody.package || manifest.package}`);\n console.log(\n ` Version: ${responseBody.version || manifest.appVersion}`\n );\n\n // 7. Verify bundle was stored correctly\n await verifyRemotePush(\n registryUrl,\n manifest.package,\n manifest.appVersion\n );\n } else {\n // Handle error responses\n handlePushError(response.status, responseBody);\n }\n } catch (fetchError: unknown) {\n clearTimeout(timeoutId);\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n console.error('ā Request timed out after 60 seconds');\n console.error(' The bundle may be too large or the server is slow');\n process.exit(1);\n }\n throw fetchError;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('ā Failed to push to remote registry:', message);\n throw error;\n }\n}\n\n// Helper to verify bundle was stored correctly\nasync function verifyRemotePush(\n registryUrl: string,\n packageName: string,\n version: string\n): Promise<void> {\n try {\n console.log('š Verifying upload to remote registry...');\n\n const verifyUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/${packageName}/${version}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n try {\n const response = await fetch(verifyUrl, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n await response.json(); // Consume response body\n console.log('ā
Bundle verified and accessible on remote registry');\n console.log(`š Registry: ${registryUrl}`);\n console.log(`š Endpoint: ${verifyUrl}`);\n } else {\n console.warn(\n `ā ļø Upload verification failed - bundle not found (HTTP ${response.status})`\n );\n console.warn(' The bundle may still be processing, check manually');\n }\n } catch (verifyError: unknown) {\n clearTimeout(timeoutId);\n if (verifyError instanceof Error && verifyError.name === 'AbortError') {\n console.warn('ā ļø Verification request timed out');\n } else {\n const message =\n verifyError instanceof Error\n ? verifyError.message\n : String(verifyError);\n console.warn('ā ļø Verification request failed:', message);\n }\n console.warn(' The bundle may still be accessible, check manually');\n }\n } catch (error) {\n // Verification failure is not critical\n console.warn('ā ļø Could not verify bundle:', error);\n }\n}\n\n// Helper to handle push errors with helpful messages\nfunction handlePushError(\n statusCode: number,\n responseBody: ApiResponseBody\n): void {\n const errorMessage =\n responseBody.message || responseBody.error || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n console.error('ā Bad Request: Invalid manifest');\n console.error(` ${errorMessage}`);\n console.error(' Check that your bundle manifest is valid');\n break;\n case 401:\n console.error('ā Unauthorized: Authentication required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Provide an API key with --api-key or CALIMERO_API_KEY env var'\n );\n break;\n case 403:\n console.error('ā Forbidden: Namespace ownership required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Ensure you have permission to publish to this package namespace'\n );\n break;\n case 409:\n console.error('ā Conflict: Version already exists');\n console.error(` ${errorMessage}`);\n console.error(\n ' Increment the version number and try again, or contact registry admin'\n );\n break;\n case 500:\n console.error('ā Internal Server Error');\n console.error(` ${errorMessage}`);\n console.error(' The registry server encountered an error');\n break;\n default:\n console.error(`ā Upload failed with HTTP ${statusCode}`);\n console.error(` ${errorMessage}`);\n }\n\n process.exit(1);\n}\n\n// Helper to extract manifest.json from .mpk (tar.gz)\nasync function extractManifest(\n bundlePath: string\n): Promise<BundleManifest | null> {\n let manifestContent: string | null = null;\n\n // @ts-expect-error tar typing issue\n await tar.t({\n file: bundlePath,\n\n onentry: (entry: tar.ReadEntry) => {\n if (entry.path === 'manifest.json') {\n // Found it\n }\n },\n });\n\n // Actual extraction\n const extractDir = path.join(path.dirname(bundlePath), `.temp-${Date.now()}`);\n if (!fs.existsSync(extractDir)) {\n fs.mkdirSync(extractDir);\n }\n\n try {\n // @ts-expect-error tar typing issue\n await tar.x({\n file: bundlePath,\n cwd: extractDir,\n filter: (path: string) => path === 'manifest.json',\n });\n\n const manifestPath = path.join(extractDir, 'manifest.json');\n if (fs.existsSync(manifestPath)) {\n const content = fs.readFileSync(manifestPath, 'utf8');\n manifestContent = content;\n }\n } catch {\n // ignore\n } finally {\n // Cleanup\n if (fs.existsSync(extractDir)) {\n fs.rmSync(extractDir, { recursive: true, force: true });\n }\n }\n\n if (manifestContent) {\n try {\n return JSON.parse(manifestContent) as BundleManifest;\n } catch {\n console.error('Failed to parse manifest JSON');\n return null;\n }\n }\n\n return null;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\nexport const configCommand = new Command('config')\n .description('Manage CLI configuration for remote registry')\n .addCommand(createConfigSetCommand())\n .addCommand(createConfigGetCommand())\n .addCommand(createConfigListCommand())\n .addCommand(createConfigResetCommand());\n\nfunction createConfigSetCommand(): Command {\n return new Command('set')\n .description('Set a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .argument('<value>', 'Configuration value')\n .action((key, value) => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n config.setRegistryUrl(value);\n console.log(\n chalk.green(`ā
Registry URL set to: ${chalk.bold(value)}`)\n );\n break;\n\n case 'api-key':\n case 'apiKey':\n config.setApiKey(value);\n console.log(chalk.green('ā
API key set successfully'));\n console.log(\n chalk.yellow(\n 'š” Note: API key is stored in plain text. Consider using CALIMERO_API_KEY environment variable for better security.'\n )\n );\n break;\n\n default:\n console.error(chalk.red(`ā Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to set configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigGetCommand(): Command {\n return new Command('get')\n .description('Get a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .action(key => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n console.log(config.getRegistryUrl());\n break;\n\n case 'api-key':\n case 'apiKey': {\n const apiKey = config.getApiKey();\n if (apiKey) {\n // Mask API key for security\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(masked);\n console.log(\n chalk.yellow(\n 'š” Note: API key is masked. Use \"config list\" to see source.'\n )\n );\n } else {\n console.log('(not set)');\n }\n break;\n }\n\n default:\n console.error(chalk.red(`ā Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to get configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigListCommand(): Command {\n return new Command('list')\n .description('List all configuration values')\n .alias('ls')\n .action(() => {\n try {\n const config = new RemoteConfig();\n\n console.log(chalk.blue('\\nš Remote Registry Configuration\\n'));\n\n // Check if config file exists\n const configPath = config.getConfigPath();\n const configFileExists = fs.existsSync(configPath);\n\n // Registry URL\n const url = config.getRegistryUrl();\n let urlSource: string;\n if (process.env.CALIMERO_REGISTRY_URL) {\n urlSource = chalk.yellow('(from CALIMERO_REGISTRY_URL env var)');\n } else if (configFileExists) {\n urlSource = chalk.gray('(from config file)');\n } else {\n urlSource = chalk.gray('(default)');\n }\n console.log(` ${chalk.bold('Registry URL:')} ${url} ${urlSource}`);\n\n // API Key\n const apiKey = config.getApiKey();\n if (apiKey) {\n let apiKeySource: string;\n if (process.env.CALIMERO_API_KEY) {\n apiKeySource = chalk.yellow('(from CALIMERO_API_KEY env var)');\n } else if (configFileExists) {\n apiKeySource = chalk.gray('(from config file)');\n } else {\n apiKeySource = chalk.gray('(default)');\n }\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(` ${chalk.bold('API Key:')} ${masked} ${apiKeySource}`);\n } else {\n console.log(` ${chalk.bold('API Key:')} ${chalk.gray('(not set)')}`);\n }\n\n console.log(chalk.blue(`\\nš Config file: ${configPath}`));\n if (!configFileExists) {\n console.log(chalk.gray(' (file does not exist, using defaults)'));\n }\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to list configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigResetCommand(): Command {\n return new Command('reset')\n .description('Reset configuration to defaults')\n .option('--force', 'Skip confirmation prompt')\n .action(options => {\n try {\n if (!options.force) {\n console.error(\n chalk.red('ā Configuration reset requires --force flag')\n );\n console.log(\n chalk.yellow(\n 'ā ļø This will reset all configuration to defaults. Use --force to confirm.'\n )\n );\n process.exit(1);\n }\n\n const config = new RemoteConfig();\n config.reset();\n\n console.log(chalk.green('ā
Configuration reset to defaults'));\n console.log(chalk.blue('\\nDefault values:'));\n console.log(' Registry URL: https://apps.calimero.network');\n console.log(' API Key: (not set)');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to reset configuration:'), message);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { appsCommand } from './commands/apps.js';\nimport { developersCommand } from './commands/developers.js';\nimport { attestationsCommand } from './commands/attestations.js';\nimport { healthCommand } from './commands/health.js';\nimport { ipfsCommand } from './commands/ipfs.js';\nimport { localCommand } from './commands/local.js';\nimport { bundleCommand } from './commands/bundle.js';\nimport { configCommand } from './commands/config.js';\n\nconst program = new Command();\n\nprogram\n .name('calimero-registry')\n .description(\n 'Calimero Network App Registry CLI - Command-line interface for the App Registry'\n )\n .version('1.0.0');\n\n// Global help text with examples\nprogram.addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry apps list\n $ calimero-registry apps create --file manifest.json\n $ calimero-registry local start\n $ calimero-registry health --local\n\nFor more information, visit: https://github.com/calimero-network/app-registry\n`\n);\n\n// Global options\nprogram.option('-u, --url <url>', 'Registry API URL', 'http://localhost:8082');\nprogram.option(\n '-t, --timeout <timeout>',\n 'Request timeout in milliseconds',\n '10000'\n);\nprogram.option('--local', 'Use local registry instead of remote API');\n\n// Add commands\nprogram.addCommand(appsCommand);\nprogram.addCommand(developersCommand);\nprogram.addCommand(attestationsCommand);\nprogram.addCommand(healthCommand);\nprogram.addCommand(ipfsCommand);\nprogram.addCommand(localCommand);\nprogram.addCommand(bundleCommand);\nprogram.addCommand(configCommand);\n\n// Global error handler\nprogram.exitOverride();\n\ntry {\n program.parse();\n} catch (err) {\n if (err instanceof Error) {\n console.error(chalk.red('Error:'), err.message);\n } else {\n console.error(chalk.red('Unknown error occurred'));\n }\n process.exit(1);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../client-library/src/client.ts","../src/lib/local-config.ts","../src/lib/local-storage.ts","../src/lib/local-artifacts.ts","../src/lib/registry-client.ts","../src/commands/apps.ts","../src/commands/developers.ts","../src/commands/attestations.ts","../src/commands/health.ts","../src/lib/ipfs.ts","../src/utils/spinner.ts","../src/commands/ipfs.ts","../src/lib/local-server.ts","../src/commands/local.ts","../src/lib/remote-config.ts","../src/commands/bundle.ts","../src/commands/config.ts","../src/index.ts"],"names":["path","fs","spinner","ora","chalk","Command","table","os","crypto"],"mappings":"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","file":"index.js","sourcesContent":["import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport type {\n AppSummary,\n VersionInfo,\n AppManifest,\n DeveloperProfile,\n Attestation,\n ApiError,\n ClientConfig,\n} from './types';\n\n/**\n * SSApp Registry Client\n *\n * A TypeScript client for interacting with the SSApp (Smart Contract Application) Registry API.\n * Provides type-safe methods for managing applications, developers, and attestations.\n *\n * @example\n * ```typescript\n * import { SSAppRegistryClient } from '@calimero-network/registry-client';\n *\n * const client = new SSAppRegistryClient({\n * baseURL: 'https://api.calimero.network',\n * timeout: 10000,\n * });\n *\n * // Get all applications\n * const apps = await client.getApps();\n *\n * // Get specific application versions\n * const versions = await client.getAppVersions('developer-pubkey', 'app-name');\n * ```\n */\nexport class SSAppRegistryClient {\n private api: AxiosInstance;\n\n /**\n * Creates a new SSApp Registry client instance.\n *\n * @param config - Configuration options for the client\n * @param config.baseURL - Base URL for the API (default: 'http://localhost:8082')\n * @param config.timeout - Request timeout in milliseconds (default: 10000)\n * @param config.headers - Additional headers to include in requests\n *\n * @example\n * ```typescript\n * // Basic configuration\n * const client = new SSAppRegistryClient();\n *\n * // Custom configuration\n * const client = new SSAppRegistryClient({\n * baseURL: 'https://api.calimero.network',\n * timeout: 30000,\n * headers: {\n * 'Authorization': 'Bearer token',\n * },\n * });\n * ```\n */\n constructor(config: ClientConfig = {}) {\n this.api = axios.create({\n baseURL: config.baseURL || 'http://localhost:8082',\n timeout: config.timeout || 10000,\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n });\n\n // Error interceptor\n this.api.interceptors.response.use(\n (response: AxiosResponse) => response,\n error => {\n const apiError: ApiError = {\n message: error.response?.data?.message || error.message,\n code: error.response?.data?.code,\n details: error.response?.data?.details,\n };\n return Promise.reject(apiError);\n }\n );\n }\n\n /**\n * Retrieves a list of all applications with optional filtering.\n *\n * @param params - Optional filtering parameters\n * @param params.dev - Filter by developer public key\n * @param params.name - Filter by application name (partial match)\n * @returns Promise resolving to an array of application summaries\n *\n * @example\n * ```typescript\n * // Get all applications\n * const allApps = await client.getApps();\n *\n * // Filter by developer\n * const devApps = await client.getApps({ dev: 'ed25519:abc123...' });\n *\n * // Filter by name\n * const walletApps = await client.getApps({ name: 'wallet' });\n *\n * // Filter by both\n * const filteredApps = await client.getApps({\n * dev: 'ed25519:abc123...',\n * name: 'wallet'\n * });\n * ```\n *\n * @throws {ApiError} When the API request fails\n */\n async getApps(params?: {\n dev?: string;\n name?: string;\n }): Promise<AppSummary[]> {\n const response = await this.api.get('/apps', { params });\n return response.data;\n }\n\n /**\n * Retrieves all versions of a specific application.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param appName - Name of the application\n * @returns Promise resolving to an array of version information\n *\n * @example\n * ```typescript\n * const versions = await client.getAppVersions(\n * 'ed25519:abc123...',\n * 'my-wallet-app'\n * );\n *\n * versions.forEach(version => {\n * console.log(`Version ${version.semver}: ${version.cid}`);\n * if (version.yanked) {\n * console.log(' ā ļø This version has been yanked');\n * }\n * });\n * ```\n *\n * @throws {ApiError} When the application is not found or request fails\n */\n async getAppVersions(appId: string): Promise<VersionInfo[]> {\n const response = await this.api.get(`/apps/${appId}`);\n return response.data;\n }\n\n /**\n * Retrieves the complete manifest for a specific application version.\n *\n * @param appId - Unique application identifier\n * @param semver - Semantic version (e.g., '1.0.0', '2.1.3')\n * @returns Promise resolving to the application manifest\n *\n * @example\n * ```typescript\n * const manifest = await client.getAppManifest('my-wallet-app', '1.2.0');\n *\n * console.log(`App: ${manifest.app.name}`);\n * console.log(`Version: ${manifest.version.semver}`);\n * console.log(`Supported chains: ${manifest.supported_chains.join(', ')}`);\n *\n * // Check permissions\n * manifest.permissions.forEach(perm => {\n * console.log(`Permission: ${perm.cap} (${perm.bytes} bytes)`);\n * });\n *\n * // List artifacts\n * manifest.artifacts.forEach(artifact => {\n * console.log(`Artifact: ${artifact.type} -> ${artifact.cid}`);\n * });\n * ```\n *\n * @throws {ApiError} When the manifest is not found or request fails\n */\n async getAppManifest(appId: string, semver: string): Promise<AppManifest> {\n const response = await this.api.get(`/apps/${appId}/${semver}`);\n return response.data;\n }\n\n /**\n * Retrieves developer profile information.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @returns Promise resolving to the developer profile\n *\n * @example\n * ```typescript\n * const profile = await client.getDeveloper('ed25519:abc123...');\n *\n * console.log(`Developer: ${profile.display_name}`);\n * if (profile.website) {\n * console.log(`Website: ${profile.website}`);\n * }\n *\n * // Check verification proofs\n * profile.proofs.forEach(proof => {\n * const status = proof.verified ? 'ā
' : 'ā';\n * console.log(`${status} ${proof.type}: ${proof.value}`);\n * });\n * ```\n *\n * @throws {ApiError} When the developer is not found or request fails\n */\n async getDeveloper(pubkey: string): Promise<DeveloperProfile> {\n const response = await this.api.get(`/developers/${pubkey}`);\n return response.data;\n }\n\n /**\n * Retrieves attestation information for a specific application version.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param appName - Name of the application\n * @param semver - Semantic version (e.g., '1.0.0', '2.1.3')\n * @returns Promise resolving to the attestation information\n *\n * @example\n * ```typescript\n * const attestation = await client.getAttestation(\n * 'ed25519:abc123...',\n * 'my-wallet-app',\n * '1.2.0'\n * );\n *\n * console.log(`Status: ${attestation.status}`);\n * console.log(`Timestamp: ${attestation.timestamp}`);\n * if (attestation.comment) {\n * console.log(`Comment: ${attestation.comment}`);\n * }\n *\n * // Check status\n * switch (attestation.status) {\n * case 'ok':\n * console.log('ā
Application is verified and safe');\n * break;\n * case 'yanked':\n * console.log('ā ļø Application has been yanked');\n * break;\n * case 'tested':\n * console.log('š§Ŗ Application is in testing phase');\n * break;\n * }\n * ```\n *\n * @throws {ApiError} When the attestation is not found or request fails\n */\n async getAttestation(\n pubkey: string,\n appName: string,\n semver: string\n ): Promise<Attestation> {\n const response = await this.api.get(\n `/attestations/${pubkey}/${appName}/${semver}`\n );\n return response.data;\n }\n\n /**\n * Submits a new application manifest to the registry.\n *\n * @param manifest - Complete application manifest with signature\n * @returns Promise resolving to submission result\n *\n * @example\n * ```typescript\n * const manifest: AppManifest = {\n * manifest_version: '1.0.0',\n * app: {\n * name: 'my-wallet-app',\n * developer_pubkey: 'ed25519:abc123...',\n * id: 'unique-app-id',\n * alias: 'My Wallet',\n * },\n * version: {\n * semver: '1.0.0',\n * },\n * supported_chains: ['mainnet', 'testnet'],\n * permissions: [\n * { cap: 'wallet', bytes: 1024 },\n * { cap: 'network', bytes: 512 },\n * ],\n * artifacts: [\n * {\n * type: 'wasm',\n * target: 'browser',\n * cid: 'QmHash...',\n * size: 1024000,\n * },\n * ],\n * metadata: {\n * description: 'A secure wallet application',\n * author: 'John Doe',\n * },\n * distribution: 'ipfs',\n * signature: {\n * alg: 'ed25519',\n * sig: 'signature...',\n * signed_at: '2024-01-01T00:00:00Z',\n * },\n * };\n *\n * const result = await client.submitAppManifest(manifest);\n *\n * if (result.success) {\n * console.log('ā
Manifest submitted successfully');\n * console.log(result.message);\n * } else {\n * console.log('ā Submission failed');\n * console.log(result.message);\n * }\n * ```\n *\n * @throws {ApiError} When the submission fails (validation errors, etc.)\n */\n async submitAppManifest(\n manifest: AppManifest\n ): Promise<{ success: boolean; message: string }> {\n const response = await this.api.post('/apps', manifest);\n return response.data;\n }\n\n /**\n * Submits or updates developer profile information.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param profile - Developer profile information\n * @returns Promise resolving to submission result\n *\n * @example\n * ```typescript\n * const profile: DeveloperProfile = {\n * display_name: 'John Doe',\n * website: 'https://johndoe.dev',\n * proofs: [\n * {\n * type: 'github',\n * value: 'johndoe',\n * verified: true,\n * },\n * {\n * type: 'twitter',\n * value: '@johndoe',\n * verified: false,\n * },\n * ],\n * };\n *\n * const result = await client.submitDeveloperProfile(\n * 'ed25519:abc123...',\n * profile\n * );\n *\n * if (result.success) {\n * console.log('ā
Profile submitted successfully');\n * } else {\n * console.log('ā Submission failed:', result.message);\n * }\n * ```\n *\n * @throws {ApiError} When the submission fails (validation errors, etc.)\n */\n async submitDeveloperProfile(\n pubkey: string,\n profile: DeveloperProfile\n ): Promise<{ success: boolean; message: string }> {\n const response = await this.api.post('/developers', {\n pubkey,\n ...profile,\n });\n return response.data;\n }\n\n /**\n * Submits an attestation for a specific application version.\n *\n * @param pubkey - Developer's public key (Ed25519 format)\n * @param appName - Name of the application\n * @param semver - Semantic version (e.g., '1.0.0', '2.1.3')\n * @param attestation - Attestation information\n * @returns Promise resolving to submission result\n *\n * @example\n * ```typescript\n * const attestation: Attestation = {\n * status: 'ok',\n * comment: 'Passed security audit and functionality testing',\n * timestamp: new Date().toISOString(),\n * };\n *\n * const result = await client.submitAttestation(\n * 'ed25519:abc123...',\n * 'my-wallet-app',\n * '1.2.0',\n * attestation\n * );\n *\n * if (result.success) {\n * console.log('ā
Attestation submitted successfully');\n * } else {\n * console.log('ā Submission failed:', result.message);\n * }\n * ```\n *\n * @throws {ApiError} When the submission fails (validation errors, etc.)\n */\n async submitAttestation(\n pubkey: string,\n appName: string,\n semver: string,\n attestation: Attestation\n ): Promise<{ success: boolean; message: string }> {\n const response = await this.api.post(\n `/attestations/${pubkey}/${appName}/${semver}`,\n attestation\n );\n return response.data;\n }\n\n /**\n * Checks if the API is healthy and responding.\n *\n * @returns Promise resolving to health status\n *\n * @example\n * ```typescript\n * try {\n * const health = await client.healthCheck();\n * console.log(`API Status: ${health.status}`);\n *\n * if (health.status === 'ok') {\n * console.log('ā
API is healthy');\n * } else {\n * console.log('ā ļø API has issues');\n * }\n * } catch (error) {\n * console.log('ā API is not responding');\n * }\n * ```\n *\n * @throws {ApiError} When the API is not responding\n */\n async healthCheck(): Promise<{ status: string }> {\n const response = await this.api.get('/healthz');\n return response.data;\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface LocalConfigData {\n server: {\n port: number;\n host: string;\n publicHost: string;\n };\n data: {\n dir: string;\n artifactsDir: string;\n };\n artifacts: {\n storageDir: string;\n serveLocal: boolean;\n copyArtifacts: boolean;\n maxFileSize: string;\n allowedTypes: string[];\n };\n}\n\nexport class LocalConfig {\n private configPath: string;\n private dataDir: string;\n private config: LocalConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'config.json'\n );\n this.dataDir = path.join(os.homedir(), '.calimero-registry');\n this.config = this.loadConfig();\n }\n\n private loadConfig(): LocalConfigData {\n // Create default config\n const defaultConfig: LocalConfigData = {\n server: {\n port: 8082,\n host: '0.0.0.0',\n publicHost: 'host.docker.internal',\n },\n data: {\n dir: path.join(os.homedir(), '.calimero-registry', 'data'),\n artifactsDir: path.join(\n os.homedir(),\n '.calimero-registry',\n 'artifacts'\n ),\n },\n artifacts: {\n storageDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n serveLocal: true,\n copyArtifacts: true,\n maxFileSize: '100MB',\n allowedTypes: ['wasm', 'js', 'html'],\n },\n };\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n server: {\n ...defaultConfig.server,\n ...(existingConfig.server || {}),\n },\n data: {\n ...defaultConfig.data,\n ...(existingConfig.data || {}),\n },\n artifacts: {\n ...defaultConfig.artifacts,\n ...(existingConfig.artifacts || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaultConfig;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config\n fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n }\n\n // Server configuration\n getPort(): number {\n return this.config.server.port;\n }\n\n setPort(port: number): void {\n this.config.server.port = port;\n this.saveConfig();\n }\n\n getHost(): string {\n return this.config.server.host;\n }\n\n setHost(host: string): void {\n this.config.server.host = host;\n this.saveConfig();\n }\n\n getPublicHost(): string {\n return this.config.server.publicHost;\n }\n\n setPublicHost(host: string): void {\n this.config.server.publicHost = host;\n this.saveConfig();\n }\n\n // Data directory configuration\n getDataDir(): string {\n return this.config.data.dir;\n }\n\n setDataDir(dir: string): void {\n this.config.data.dir = dir;\n this.config.artifacts.storageDir = path.join(dir, 'artifacts');\n this.saveConfig();\n }\n\n getArtifactsDir(): string {\n return this.config.data.artifactsDir;\n }\n\n setArtifactsDir(dir: string): void {\n this.config.data.artifactsDir = dir;\n this.config.artifacts.storageDir = dir;\n this.saveConfig();\n }\n\n // Artifact configuration\n getArtifactsConfig() {\n return this.config.artifacts;\n }\n\n setArtifactsConfig(config: Partial<LocalConfigData['artifacts']>): void {\n this.config.artifacts = { ...this.config.artifacts, ...config };\n this.saveConfig();\n }\n\n // Utility methods\n ensureDirectories(): void {\n const dirs = [\n this.getDataDir(),\n this.getArtifactsDir(),\n path.join(this.getDataDir(), 'backups'),\n path.join(this.getDataDir(), 'logs'),\n ];\n\n dirs.forEach(dir => {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n });\n }\n\n getConfigPath(): string {\n return this.configPath;\n }\n\n // Get full configuration\n getConfig(): LocalConfigData {\n return { ...this.config };\n }\n\n // Reset to defaults\n reset(): void {\n this.config = {\n server: {\n port: 8082,\n host: 'localhost',\n },\n data: {\n dir: path.join(os.homedir(), '.calimero-registry', 'data'),\n artifactsDir: path.join(\n os.homedir(),\n '.calimero-registry',\n 'artifacts'\n ),\n },\n artifacts: {\n storageDir: path.join(os.homedir(), '.calimero-registry', 'artifacts'),\n serveLocal: true,\n copyArtifacts: true,\n maxFileSize: '100MB',\n allowedTypes: ['wasm', 'js', 'html'],\n },\n };\n this.saveConfig();\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { LocalConfig } from './local-config.js';\n\nexport interface AppSummary {\n id: string;\n name: string;\n latest_version: string;\n latest_digest: string;\n developer_pubkey?: string;\n alias?: string;\n}\n\nexport interface VersionInfo {\n semver: string;\n digest: string;\n cid: string; // Added for compatibility\n yanked: boolean;\n}\n\n// --- V2 / Bundle Manifest Support ---\n\nexport interface BundleArtifact {\n path: string;\n hash: string | null;\n size: number;\n}\n\nexport interface BundleMetadata {\n name: string;\n description?: string;\n icon?: string;\n tags?: string[];\n license?: string;\n}\n\nexport interface BundleInterfaces {\n exports?: string[];\n uses?: string[];\n}\n\nexport interface BundleLinks {\n frontend?: string;\n github?: string;\n docs?: string;\n}\n\nexport interface BundleSignature {\n alg: string;\n sig: string;\n pubkey: string;\n signed_at: string;\n}\n\nexport interface BundleManifest {\n version: string; // \"1.0\" (internal manifest version)\n package: string;\n appVersion: string;\n\n metadata?: BundleMetadata;\n interfaces?: BundleInterfaces;\n\n wasm?: BundleArtifact;\n abi?: BundleArtifact;\n migrations: BundleArtifact[];\n\n links?: BundleLinks;\n signature?: BundleSignature;\n}\n\nexport interface LocalRegistryData {\n apps: Map<string, AppSummary>;\n bundleManifests: Map<string, BundleManifest>; // Key: \"package/version\"\n artifacts: Map<string, string>; // digest -> file path\n}\n\nexport class LocalDataStore {\n private config: LocalConfig;\n private data: LocalRegistryData;\n private appsFile: string;\n private bundleManifestsFile: string;\n private artifactsFile: string;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.appsFile = path.join(config.getDataDir(), 'apps.json');\n this.bundleManifestsFile = path.join(\n config.getDataDir(),\n 'bundle_manifests.json'\n );\n this.artifactsFile = path.join(config.getDataDir(), 'artifacts.json');\n this.data = {\n apps: new Map(),\n bundleManifests: new Map(),\n artifacts: new Map(),\n };\n this.loadData();\n }\n\n private loadData(): void {\n try {\n // Load apps\n if (fs.existsSync(this.appsFile)) {\n const appsData = JSON.parse(fs.readFileSync(this.appsFile, 'utf8'));\n this.data.apps = new Map(Object.entries(appsData));\n }\n\n // Load bundle manifests\n if (fs.existsSync(this.bundleManifestsFile)) {\n const bundleManifestsData = JSON.parse(\n fs.readFileSync(this.bundleManifestsFile, 'utf8')\n );\n this.data.bundleManifests = new Map(\n Object.entries(bundleManifestsData)\n );\n }\n\n // Load artifacts\n if (fs.existsSync(this.artifactsFile)) {\n const artifactsData = JSON.parse(\n fs.readFileSync(this.artifactsFile, 'utf8')\n );\n this.data.artifacts = new Map(Object.entries(artifactsData));\n }\n } catch {\n console.warn('Failed to load existing data, starting fresh');\n }\n }\n\n private saveData(): void {\n try {\n // Ensure data directory exists\n this.config.ensureDirectories();\n\n // Save apps\n const appsObj = Object.fromEntries(this.data.apps);\n fs.writeFileSync(this.appsFile, JSON.stringify(appsObj, null, 2));\n\n // Save bundle manifests\n const bundleManifestsObj = Object.fromEntries(this.data.bundleManifests);\n fs.writeFileSync(\n this.bundleManifestsFile,\n JSON.stringify(bundleManifestsObj, null, 2)\n );\n\n // Save artifacts\n const artifactsObj = Object.fromEntries(this.data.artifacts);\n fs.writeFileSync(\n this.artifactsFile,\n JSON.stringify(artifactsObj, null, 2)\n );\n } catch (error) {\n throw new Error(\n `Failed to save data: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n // Apps management\n getApps(filters?: { name?: string; dev?: string }): AppSummary[] {\n let apps = Array.from(this.data.apps.values());\n\n if (filters?.name) {\n apps = apps.filter(app => app.name.includes(filters.name!));\n }\n\n if (filters?.dev) {\n apps = apps.filter(app => app.developer_pubkey === filters.dev);\n }\n\n return apps;\n }\n\n getApp(appKey: string): AppSummary | undefined {\n return this.data.apps.get(appKey);\n }\n\n setApp(appKey: string, app: AppSummary): void {\n this.data.apps.set(appKey, app);\n this.saveData();\n }\n\n // Versions management (bundles only)\n getAppVersions(packageId: string): VersionInfo[] {\n const versions: VersionInfo[] = [];\n\n // Get bundle versions\n for (const [key, manifest] of this.data.bundleManifests.entries()) {\n if (key.startsWith(`${packageId}/`)) {\n const semver = key.split('/').pop()!;\n const digest = manifest.wasm?.hash || '';\n versions.push({\n semver,\n digest,\n cid: digest, // Compatibility\n yanked: false,\n });\n }\n }\n\n return versions.sort((a, b) =>\n a.semver.localeCompare(b.semver, undefined, { numeric: true })\n );\n }\n\n // Manifest management (V2 / Bundles)\n getBundleManifest(pkg: string, version: string): BundleManifest | undefined {\n const key = `${pkg}/${version}`;\n return this.data.bundleManifests.get(key);\n }\n\n setBundleManifest(\n pkg: string,\n version: string,\n manifest: BundleManifest\n ): void {\n const key = `${pkg}/${version}`;\n this.data.bundleManifests.set(key, manifest);\n this.saveData();\n }\n\n // Artifact management\n getArtifactPath(hash: string): string | undefined {\n return this.data.artifacts.get(hash);\n }\n\n setArtifactPath(hash: string, filePath: string): void {\n this.data.artifacts.set(hash, filePath);\n this.saveData();\n }\n\n // Statistics\n getStats() {\n return {\n publishedApps: this.data.apps.size,\n totalVersions: this.data.bundleManifests.size,\n totalArtifacts: this.data.artifacts.size,\n };\n }\n\n // Backup and restore\n async backup(outputPath?: string): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const backupPath =\n outputPath ||\n path.join(\n this.config.getDataDir(),\n 'backups',\n `backup-${timestamp}.json`\n );\n\n // Ensure backup directory exists\n const backupDir = path.dirname(backupPath);\n if (!fs.existsSync(backupDir)) {\n fs.mkdirSync(backupDir, { recursive: true });\n }\n\n const backupData = {\n timestamp: new Date().toISOString(),\n apps: Object.fromEntries(this.data.apps),\n bundleManifests: Object.fromEntries(this.data.bundleManifests),\n artifacts: Object.fromEntries(this.data.artifacts),\n };\n\n fs.writeFileSync(backupPath, JSON.stringify(backupData, null, 2));\n return backupPath;\n }\n\n async restore(backupPath: string): Promise<void> {\n if (!fs.existsSync(backupPath)) {\n throw new Error(`Backup file not found: ${backupPath}`);\n }\n\n const backupData = JSON.parse(fs.readFileSync(backupPath, 'utf8'));\n\n // Restore data\n this.data.apps = new Map(Object.entries(backupData.apps || {}));\n this.data.bundleManifests = new Map(\n Object.entries(backupData.bundleManifests || {})\n );\n this.data.artifacts = new Map(Object.entries(backupData.artifacts || {}));\n\n this.saveData();\n }\n\n // Reset data\n reset(): void {\n this.data.apps.clear();\n this.data.bundleManifests.clear();\n this.data.artifacts.clear();\n this.saveData();\n }\n\n /**\n * Get all bundle manifests\n */\n getAllBundles(): BundleManifest[] {\n return Array.from(this.data.bundleManifests.values());\n }\n\n // Seed with sample data\n async seed(): Promise<void> {\n // V2 Sample Bundle\n const bundleManifest: BundleManifest = {\n version: '1.0',\n package: 'com.calimero.sample-bundle',\n appVersion: '1.0.0',\n metadata: {\n name: 'Sample Bundle App',\n description: 'A sample application using V2 Bundle Manifest',\n tags: ['sample', 'v2'],\n license: 'MIT',\n },\n interfaces: {\n exports: ['com.calimero.sample.v1'],\n uses: [],\n },\n links: {\n frontend: 'https://example.com/app',\n github: 'https://github.com/example/app',\n },\n wasm: {\n path: 'app.wasm',\n size: 1024,\n hash: null,\n },\n abi: {\n path: 'abi.json',\n size: 512,\n hash: null,\n },\n migrations: [],\n };\n\n this.setBundleManifest(\n bundleManifest.package,\n bundleManifest.appVersion,\n bundleManifest\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { Buffer } from 'buffer';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore, V1Manifest } from './local-storage.js';\n\nexport class LocalArtifactServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactsDir: string;\n\n constructor(config: LocalConfig, dataStore: LocalDataStore) {\n this.config = config;\n this.dataStore = dataStore;\n this.artifactsDir = config.getArtifactsDir();\n this.ensureArtifactsDir();\n }\n\n private ensureArtifactsDir(): void {\n if (!fs.existsSync(this.artifactsDir)) {\n fs.mkdirSync(this.artifactsDir, { recursive: true });\n }\n }\n\n // Copy artifact to local storage\n async copyArtifactToLocal(\n sourcePath: string,\n appId: string,\n version: string,\n filename: string\n ): Promise<string> {\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Source file not found: ${sourcePath}`);\n }\n\n // Create app version directory\n const appVersionDir = path.join(this.artifactsDir, appId, version);\n if (!fs.existsSync(appVersionDir)) {\n fs.mkdirSync(appVersionDir, { recursive: true });\n }\n\n // Copy file to local storage\n const targetPath = path.join(appVersionDir, filename);\n fs.copyFileSync(sourcePath, targetPath);\n\n // Calculate file hash for tracking\n const fileHash = await this.calculateFileHash(targetPath);\n this.dataStore.setArtifactPath(fileHash, targetPath);\n\n return targetPath;\n }\n\n // Serve artifact by app ID, version, and filename\n async serveArtifact(\n appId: string,\n version: string,\n filename: string\n ): Promise<Buffer> {\n const artifactPath = path.join(this.artifactsDir, appId, version, filename);\n\n if (!fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found: ${artifactPath}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Serve artifact by hash\n async serveByHash(hash: string): Promise<Buffer> {\n const artifactPath = this.dataStore.getArtifactPath(hash);\n\n if (!artifactPath || !fs.existsSync(artifactPath)) {\n throw new Error(`Artifact not found for hash: ${hash}`);\n }\n\n return fs.readFileSync(artifactPath);\n }\n\n // Validate artifact file\n async validateArtifact(\n filePath: string\n ): Promise<{ size: number; sha256: string }> {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const stats = fs.statSync(filePath);\n const fileBuffer = fs.readFileSync(filePath);\n const sha256 = crypto.createHash('sha256').update(fileBuffer).digest('hex');\n\n return {\n size: stats.size,\n sha256,\n };\n }\n\n // Calculate file hash\n private async calculateFileHash(filePath: string): Promise<string> {\n const fileBuffer = fs.readFileSync(filePath);\n return crypto.createHash('sha256').update(fileBuffer).digest('hex');\n }\n\n // Get artifact URL for local serving\n getArtifactUrl(appId: string, version: string, filename: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${appId}/${version}/${filename}`;\n }\n\n // Get artifact URL by hash\n getArtifactUrlByHash(hash: string): string {\n const baseUrl = `http://${this.config.getPublicHost()}:${this.config.getPort()}`;\n return `${baseUrl}/artifacts/${hash}`;\n }\n\n // Update manifest artifact to use local URLs (and preserve HTTP access)\n updateManifestArtifact(manifest: V1Manifest): V1Manifest {\n const updatedManifest: V1Manifest = { ...manifest };\n\n if (!manifest.artifact?.uri) {\n return updatedManifest;\n }\n\n const uri = manifest.artifact.uri;\n\n if (uri.startsWith('/')) {\n updatedManifest.artifact = {\n ...manifest.artifact,\n uri: `${this.getArtifactUrl(manifest.id, manifest.version, path.basename(manifest.artifact.uri))}`,\n };\n } else if (uri.startsWith('file://')) {\n const filePath = uri.replace('file://', '');\n const filename = path.basename(filePath);\n updatedManifest.artifact = {\n ...manifest.artifact,\n uri: this.getArtifactUrl(manifest.id, manifest.version, filename),\n };\n }\n\n return updatedManifest;\n }\n\n // Clean up old artifacts\n async cleanupOldArtifacts(\n maxAge: number = 30 * 24 * 60 * 60 * 1000\n ): Promise<void> {\n const now = Date.now();\n\n // Get all artifact files\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n const age = now - stats.mtime.getTime();\n\n if (age > maxAge) {\n fs.unlinkSync(file);\n console.log(`Cleaned up old artifact: ${file}`);\n }\n }\n }\n\n // Get artifact statistics\n getArtifactStats(): {\n totalFiles: number;\n totalSize: number;\n oldestFile: Date | null;\n } {\n let totalFiles = 0;\n let totalSize = 0;\n let oldestFile: Date | null = null;\n\n const getAllFiles = (dir: string): string[] => {\n let files: string[] = [];\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const fullPath = path.join(dir, item);\n const stat = fs.statSync(fullPath);\n\n if (stat.isDirectory()) {\n files = files.concat(getAllFiles(fullPath));\n } else {\n files.push(fullPath);\n }\n }\n\n return files;\n };\n\n if (fs.existsSync(this.artifactsDir)) {\n const allFiles = getAllFiles(this.artifactsDir);\n\n for (const file of allFiles) {\n const stats = fs.statSync(file);\n totalFiles++;\n totalSize += stats.size;\n\n if (!oldestFile || stats.mtime < oldestFile) {\n oldestFile = stats.mtime;\n }\n }\n }\n\n return {\n totalFiles,\n totalSize,\n oldestFile,\n };\n }\n}\n","import { SSAppRegistryClient } from '@calimero-network/registry-client';\nimport { LocalConfig } from './local-config.js';\nimport {\n LocalDataStore,\n AppSummary,\n VersionInfo,\n V1Manifest,\n} from './local-storage.js';\nimport { LocalArtifactServer } from './local-artifacts.js';\nimport fs from 'fs';\nimport path from 'path';\n\nexport interface RegistryClient {\n getApps(filters?: { name?: string }): Promise<AppSummary[]>;\n getAppVersions(appId: string): Promise<VersionInfo[]>;\n getAppManifest(appId: string, semver: string): Promise<V1Manifest>;\n submitAppManifest(\n manifest: V1Manifest\n ): Promise<{ success: boolean; message: string }>;\n healthCheck(): Promise<{ status: string }>;\n}\n\nexport class RemoteRegistryClient implements RegistryClient {\n private client: SSAppRegistryClient;\n\n constructor(baseURL: string, timeout: number) {\n this.client = new SSAppRegistryClient({\n baseURL,\n timeout,\n });\n }\n\n async getApps(filters?: { name?: string }): Promise<AppSummary[]> {\n return await this.client.getApps(filters);\n }\n\n async getAppVersions(appId: string): Promise<VersionInfo[]> {\n return await this.client.getAppVersions(appId);\n }\n\n async getAppManifest(appId: string, semver: string): Promise<V1Manifest> {\n return await this.client.getAppManifest(appId, semver);\n }\n\n async submitAppManifest(\n manifest: V1Manifest\n ): Promise<{ success: boolean; message: string }> {\n return await this.client.submitAppManifest(manifest);\n }\n\n async healthCheck(): Promise<{ status: string }> {\n return await this.client.healthCheck();\n }\n}\n\nexport class LocalRegistryClient implements RegistryClient {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactServer: LocalArtifactServer;\n\n constructor() {\n this.config = new LocalConfig();\n this.dataStore = new LocalDataStore(this.config);\n this.artifactServer = new LocalArtifactServer(this.config, this.dataStore);\n }\n\n async getApps(filters?: { name?: string }): Promise<AppSummary[]> {\n return this.dataStore.getApps(filters);\n }\n\n async getAppVersions(appId: string): Promise<VersionInfo[]> {\n return this.dataStore.getAppVersions(appId);\n }\n\n async getAppManifest(appId: string, semver: string): Promise<V1Manifest> {\n const manifest = this.dataStore.getManifest(appId, semver);\n if (!manifest) {\n throw new Error('Manifest not found');\n }\n return this.artifactServer.updateManifestArtifact(manifest);\n }\n\n async submitAppManifest(\n manifest: V1Manifest\n ): Promise<{ success: boolean; message: string }> {\n if (!this.validateManifest(manifest)) {\n throw new Error('Invalid manifest structure');\n }\n\n const processedManifest = await this.processManifestArtifacts(manifest);\n const manifestKey = `${processedManifest.id}/${processedManifest.version}`;\n this.dataStore.setManifest(manifestKey, processedManifest);\n\n const appSummary: AppSummary = {\n id: processedManifest.id,\n name: processedManifest.name,\n latest_version: processedManifest.version,\n latest_digest: processedManifest.artifact.digest,\n };\n this.dataStore.setApp(processedManifest.id, appSummary);\n\n return {\n success: true,\n message: 'App version registered successfully',\n };\n }\n\n async healthCheck(): Promise<{ status: string }> {\n return { status: 'ok' };\n }\n\n private validateManifest(manifest: V1Manifest): boolean {\n return !!(\n manifest.manifest_version &&\n manifest.id &&\n manifest.name &&\n manifest.version &&\n manifest.artifact &&\n manifest.artifact.type &&\n manifest.artifact.target &&\n manifest.artifact.digest &&\n manifest.artifact.uri\n );\n }\n\n private async processManifestArtifacts(\n manifest: V1Manifest\n ): Promise<V1Manifest> {\n const processedManifest: V1Manifest = { ...manifest };\n\n if (manifest.artifact?.uri?.startsWith('file://')) {\n const filePath = manifest.artifact.uri.replace('file://', '');\n\n if (fs.existsSync(filePath)) {\n const filename = path.basename(filePath);\n\n try {\n await this.artifactServer.copyArtifactToLocal(\n filePath,\n manifest.id,\n manifest.version,\n filename\n );\n\n processedManifest.artifact = {\n ...manifest.artifact,\n uri: this.artifactServer.getArtifactUrl(\n manifest.id,\n manifest.version,\n filename\n ),\n };\n } catch (error) {\n console.warn(`Failed to copy artifact ${filePath}:`, error);\n }\n }\n }\n\n return processedManifest;\n }\n}\n\nexport function createRegistryClient(\n useLocal: boolean,\n baseURL?: string,\n timeout?: number\n): RegistryClient {\n if (useLocal) {\n return new LocalRegistryClient();\n } else {\n return new RemoteRegistryClient(\n baseURL || 'http://localhost:8082',\n timeout || 10000\n );\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { table } from 'table';\nimport { createRegistryClient } from '../lib/registry-client.js';\nimport fs from 'fs';\nimport path from 'path';\n\nexport const appsCommand = new Command('apps')\n .description('Manage SSApp applications')\n .addCommand(\n new Command('list')\n .description('List all applications')\n .option('-n, --name <name>', 'Filter by application name')\n .action(async (options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora('Fetching applications...').start();\n\n try {\n const apps = await client.getApps({\n name: options.name,\n });\n\n spinner.succeed(`Found ${apps.length} application(s)`);\n\n if (apps.length === 0) {\n console.log(chalk.yellow('No applications found'));\n return;\n }\n\n const tableData = [\n ['ID', 'Name', 'Latest Version', 'Digest'],\n ...apps.map(app => [\n app.id,\n app.name,\n app.latest_version,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (app.latest_digest || (app as any).latest_cid || 'N/A')\n .toString()\n .substring(0, 12) + '...',\n ]),\n ];\n\n console.log(table(tableData));\n } catch (error) {\n spinner.fail('Failed to fetch applications');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('versions')\n .description('List versions of a specific application')\n .argument('<appId>', 'Application ID')\n .action(async (appId, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora(`Fetching versions for ${appId}...`).start();\n\n try {\n const versions = await client.getAppVersions(appId);\n\n spinner.succeed(`Found ${versions.length} version(s)`);\n\n if (versions.length === 0) {\n console.log(chalk.yellow('No versions found'));\n return;\n }\n\n const tableData = [\n ['Version', 'CID', 'Yanked'],\n ...versions.map(version => [\n version.semver,\n version.cid.substring(0, 12) + '...',\n version.yanked ? chalk.red('Yes') : chalk.green('No'),\n ]),\n ];\n\n console.log(table(tableData));\n } catch (error) {\n spinner.fail('Failed to fetch versions');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('manifest')\n .description('Get manifest for a specific application version')\n .argument('<appId>', 'Application ID')\n .argument('<version>', 'Application version')\n .action(async (appId, version, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora(\n `Fetching manifest for ${appId}@${version}...`\n ).start();\n\n try {\n const manifest = await client.getAppManifest(appId, version);\n\n spinner.succeed('Manifest fetched successfully');\n\n console.log(chalk.blue('\\nApplication Manifest:'));\n console.log(JSON.stringify(manifest, null, 2));\n } catch (error) {\n spinner.fail('Failed to fetch manifest');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('submit')\n .description('Submit a new application manifest')\n .argument('<manifest-file>', 'Path to the manifest JSON file')\n .action(async (manifestFile, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora('Reading manifest file...').start();\n\n try {\n // Read and parse the manifest file\n const manifestPath = path.resolve(manifestFile);\n if (!fs.existsSync(manifestPath)) {\n spinner.fail('Manifest file not found');\n console.error(chalk.red(`File not found: ${manifestFile}`));\n process.exit(1);\n }\n\n const manifestContent = fs.readFileSync(manifestPath, 'utf8');\n const manifest = JSON.parse(manifestContent);\n\n spinner.text = 'Submitting application manifest...';\n\n const result = await client.submitAppManifest(manifest);\n\n spinner.succeed('Application submitted successfully');\n console.log(chalk.green(`\\nā
${result.message}`));\n\n if (manifest.app?.name) {\n console.log(chalk.blue(`\\nš± App: ${manifest.app.name}`));\n console.log(\n chalk.blue(`š¤ Developer: ${manifest.app.developer_pubkey}`)\n );\n console.log(chalk.blue(`š¦ Version: ${manifest.version?.semver}`));\n }\n } catch (error) {\n spinner.fail('Failed to submit application');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { table } from 'table';\nimport { SSAppRegistryClient } from '@calimero-network/registry-client';\n\nexport const developersCommand = new Command('developers')\n .description('Manage developer profiles')\n .addCommand(\n new Command('get')\n .description('Get developer profile information')\n .argument('<pubkey>', 'Developer public key')\n .action(async (pubkey, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const client = new SSAppRegistryClient({\n baseURL: globalOpts?.url || 'http://localhost:8082',\n timeout: parseInt(globalOpts?.timeout || '10000'),\n });\n\n const spinner = ora('Fetching developer profile...').start();\n\n try {\n const profile = await client.getDeveloper(pubkey);\n\n spinner.succeed('Developer profile fetched successfully');\n\n console.log(chalk.blue('\\nDeveloper Profile:'));\n console.log(chalk.green('Display Name:'), profile.display_name);\n if (profile.website) {\n console.log(chalk.green('Website:'), profile.website);\n }\n\n if (profile.proofs.length > 0) {\n console.log(chalk.green('\\nProofs:'));\n const tableData = [\n ['Type', 'Value', 'Verified'],\n ...profile.proofs.map(proof => [\n proof.type,\n proof.value.substring(0, 20) + '...',\n proof.verified ? chalk.green('Yes') : chalk.red('No'),\n ]),\n ];\n console.log(table(tableData));\n } else {\n console.log(chalk.yellow('\\nNo proofs found'));\n }\n } catch (error) {\n spinner.fail('Failed to fetch developer profile');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('create')\n .description('Create a new developer profile')\n .argument('<pubkey>', 'Developer public key')\n .argument('<display-name>', 'Display name for the developer')\n .option('-w, --website <url>', 'Developer website URL')\n .option('-p, --proofs <proofs>', 'JSON string of proofs array')\n .action(async (pubkey, displayName, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const client = new SSAppRegistryClient({\n baseURL: globalOpts?.url || 'http://localhost:8082',\n timeout: parseInt(globalOpts?.timeout || '10000'),\n });\n\n const spinner = ora('Creating developer profile...').start();\n\n try {\n let proofs = [];\n if (options.proofs) {\n try {\n proofs = JSON.parse(options.proofs);\n } catch {\n spinner.fail('Invalid proofs JSON format');\n console.error(chalk.red('Proofs must be a valid JSON array'));\n process.exit(1);\n }\n }\n\n const profile = {\n pubkey,\n display_name: displayName,\n website: options.website,\n proofs,\n };\n\n const result = await client.submitDeveloperProfile(pubkey, profile);\n\n spinner.succeed('Developer profile created successfully');\n console.log(chalk.green(`\\nā
${result.message}`));\n console.log(chalk.blue(`\\nš¤ Developer: ${displayName}`));\n console.log(chalk.blue(`š Public Key: ${pubkey}`));\n if (options.website) {\n console.log(chalk.blue(`š Website: ${options.website}`));\n }\n } catch (error) {\n spinner.fail('Failed to create developer profile');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { SSAppRegistryClient } from '@calimero-network/registry-client';\n\nexport const attestationsCommand = new Command('attestations')\n .description('Manage application attestations')\n .addCommand(\n new Command('get')\n .description('Get attestation for a specific application version')\n .argument('<pubkey>', 'Developer public key')\n .argument('<name>', 'Application name')\n .argument('<version>', 'Application version')\n .action(async (pubkey, name, version, options, command) => {\n const globalOpts = command.parent?.parent?.opts();\n const client = new SSAppRegistryClient({\n baseURL: globalOpts?.url || 'http://localhost:8082',\n timeout: parseInt(globalOpts?.timeout || '10000'),\n });\n\n const spinner = ora(\n `Fetching attestation for ${name}@${version}...`\n ).start();\n\n try {\n const attestation = await client.getAttestation(\n pubkey,\n name,\n version\n );\n\n spinner.succeed('Attestation fetched successfully');\n\n console.log(chalk.blue('\\nAttestation:'));\n console.log(chalk.green('Status:'), attestation.status);\n console.log(chalk.green('Timestamp:'), attestation.timestamp);\n if (attestation.comment) {\n console.log(chalk.green('Comment:'), attestation.comment);\n }\n } catch (error) {\n spinner.fail('Failed to fetch attestation');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n );\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { createRegistryClient } from '../lib/registry-client.js';\n\nexport const healthCommand = new Command('health')\n .description('Check the health of the SSApp Registry API')\n .action(async (options, command) => {\n const globalOpts = command.parent?.opts();\n const useLocal = globalOpts?.local || false;\n const client = createRegistryClient(\n useLocal,\n globalOpts?.url,\n parseInt(globalOpts?.timeout || '10000')\n );\n\n const spinner = ora('Checking API health...').start();\n\n try {\n const health = await client.healthCheck();\n spinner.succeed('API is healthy');\n console.log(chalk.green(`Status: ${health.status}`));\n } catch (error) {\n spinner.fail('API health check failed');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n });\n","import { writeFileSync, existsSync } from 'fs';\n\nexport async function uploadToIPFS(filePath: string): Promise<string> {\n try {\n // For now, we'll simulate IPFS upload since public gateways require authentication\n // In production, you'd use a service like Pinata, Infura, or your own IPFS node\n\n // Check if file exists (this satisfies the linter by using filePath)\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // Use a hardcoded valid CID for demo\n const simulatedCid = 'QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG';\n\n console.log('ā ļø Using simulated IPFS upload for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n return simulatedCid;\n } catch (error) {\n throw new Error(\n `Failed to upload to IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\nexport async function downloadFromIPFS(\n cid: string,\n outputPath?: string\n): Promise<string> {\n try {\n // For demo purposes, we'll simulate IPFS download\n // In production, you'd actually download from IPFS\n\n console.log('ā ļø Using simulated IPFS download for demo purposes');\n console.log(' In production, use a service like Pinata or Infura');\n\n // Generate a simulated file content based on CID\n const simulatedContent = `Simulated IPFS file content for CID: ${cid}\\nThis is a demo file that would normally contain the actual application data.`;\n\n // Determine output path\n const finalOutputPath = outputPath || `${cid}.wasm`;\n\n // Write the simulated content to file\n writeFileSync(finalOutputPath, simulatedContent);\n\n return finalOutputPath;\n } catch (error) {\n throw new Error(\n `Failed to download from IPFS: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n","import ora from 'ora';\n\nexport const spinner = (text: string) => ora(text);\n","import { Command } from 'commander';\nimport { uploadToIPFS, downloadFromIPFS } from '../lib/ipfs';\nimport { spinner } from '../utils/spinner';\n\nexport const ipfsCommand = new Command('ipfs')\n .description('IPFS operations')\n .addCommand(\n new Command('upload')\n .description('Upload a file to IPFS')\n .argument('<file>', 'Path to the file to upload')\n .action(async file => {\n const s = spinner('Uploading to IPFS...').start();\n\n try {\n const cid = await uploadToIPFS(file);\n s.succeed(`File uploaded successfully!`);\n console.log(`CID: ${cid}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Upload failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command('download')\n .description('Download a file from IPFS')\n .argument('<cid>', 'IPFS CID to download')\n .argument('[output]', 'Output file path (optional)')\n .action(async (cid, output) => {\n const s = spinner('Downloading from IPFS...').start();\n\n try {\n const outputPath = await downloadFromIPFS(cid, output);\n s.succeed(`File downloaded successfully!`);\n console.log(`Saved to: ${outputPath}`);\n console.log(`Gateway URL: https://ipfs.io/ipfs/${cid}`);\n } catch (error) {\n s.fail('Download failed');\n console.error(\n 'Error:',\n error instanceof Error ? error.message : 'Unknown error'\n );\n process.exit(1);\n }\n })\n );\n","import fastify, { FastifyInstance } from 'fastify';\nimport cors from '@fastify/cors';\nimport { LocalConfig } from './local-config.js';\nimport { LocalDataStore, BundleManifest } from './local-storage.js';\nimport { LocalArtifactServer } from './local-artifacts.js';\nimport fs from 'fs';\n\nexport interface ServerStatus {\n running: boolean;\n url: string;\n dataDir: string;\n appsCount: number;\n artifactsCount: number;\n}\n\nexport class LocalRegistryServer {\n private config: LocalConfig;\n private dataStore: LocalDataStore;\n private artifactServer: LocalArtifactServer;\n private server: FastifyInstance | null = null;\n private isRunning = false;\n\n constructor(config: LocalConfig) {\n this.config = config;\n this.dataStore = new LocalDataStore(config);\n this.artifactServer = new LocalArtifactServer(config, this.dataStore);\n }\n\n async start(port?: number): Promise<void> {\n if (this.isRunning) {\n throw new Error('Local registry is already running');\n }\n\n const serverPort = port || this.config.getPort();\n const host = this.config.getHost();\n\n // Ensure directories exist\n this.config.ensureDirectories();\n\n // Create Fastify server\n this.server = fastify({\n logger: {\n level: 'info',\n },\n });\n\n // Register CORS\n await this.server.register(cors, {\n origin: true,\n credentials: true,\n });\n\n // Register routes\n await this.registerRoutes();\n\n // Start server\n await this.server.listen({ port: serverPort, host });\n this.isRunning = true;\n\n console.log(\n `Local registry server started on http://${host}:${serverPort}`\n );\n }\n\n async stop(): Promise<void> {\n if (!this.server || !this.isRunning) {\n throw new Error('Local registry is not running');\n }\n\n await this.server.close();\n this.isRunning = false;\n this.server = null;\n }\n\n async getStatus(): Promise<ServerStatus> {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n running: this.isRunning,\n url: `http://${this.config.getHost()}:${this.config.getPort()}`,\n dataDir: this.config.getDataDir(),\n appsCount: stats.publishedApps,\n artifactsCount: artifactStats.totalFiles,\n };\n }\n\n async reset(): Promise<void> {\n this.dataStore.reset();\n\n // Clean up artifacts directory\n const artifactsDir = this.config.getArtifactsDir();\n if (fs.existsSync(artifactsDir)) {\n fs.rmSync(artifactsDir, { recursive: true, force: true });\n }\n }\n\n async backup(outputPath?: string): Promise<string> {\n return await this.dataStore.backup(outputPath);\n }\n\n async restore(backupPath: string): Promise<void> {\n await this.dataStore.restore(backupPath);\n }\n\n async seed(): Promise<void> {\n await this.dataStore.seed();\n }\n\n private async registerRoutes(): Promise<void> {\n if (!this.server) {\n throw new Error('Server not initialized');\n }\n\n // Health endpoint\n this.server.get('/healthz', async () => {\n return { status: 'ok' };\n });\n\n // Statistics endpoint\n this.server.get('/stats', async () => {\n const stats = this.dataStore.getStats();\n const artifactStats = this.artifactServer.getArtifactStats();\n\n return {\n publishedApps: stats.publishedApps,\n totalVersions: stats.totalVersions,\n totalArtifacts: artifactStats.totalFiles,\n totalSize: artifactStats.totalSize,\n };\n });\n\n // Artifact endpoints\n this.server.get(\n '/artifacts/:appId/:version/:filename',\n async (request, reply) => {\n const { appId, version, filename } = request.params as {\n appId: string;\n version: string;\n filename: string;\n };\n\n try {\n const artifactData = await this.artifactServer.serveArtifact(\n appId,\n version,\n filename\n );\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n reply.header(\n 'Content-Disposition',\n `attachment; filename=\"${filename}\"`\n );\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n }\n );\n\n this.server.get('/artifacts/:hash', async (request, reply) => {\n const { hash } = request.params as { hash: string };\n\n try {\n const artifactData = await this.artifactServer.serveByHash(hash);\n\n // Set appropriate headers\n reply.header('Content-Type', 'application/octet-stream');\n\n return artifactData as Uint8Array;\n } catch {\n return {\n statusCode: 404,\n error: 'Not Found',\n message: 'Artifact not found',\n };\n }\n });\n\n // Local registry management endpoints\n this.server.get('/local/status', async () => {\n return await this.getStatus();\n });\n\n this.server.post('/local/reset', async () => {\n await this.reset();\n return { message: 'Local registry data reset successfully' };\n });\n\n this.server.get('/local/backup', async request => {\n const query = request.query as { output?: string };\n const backupPath = await this.backup(query.output);\n return { backupPath };\n });\n\n this.server.post('/local/restore', async request => {\n const { backupPath } = request.body as { backupPath: string };\n await this.restore(backupPath);\n return { message: 'Data restored successfully' };\n });\n\n this.server.post('/local/seed', async () => {\n await this.seed();\n return { message: 'Sample data seeded successfully' };\n });\n\n // V2 Bundle API endpoints\n this.server.get('/api/v2/bundles', async (request, reply) => {\n const query = request.query as {\n package?: string;\n version?: string;\n developer?: string;\n };\n\n const { package: pkg, version, developer } = query;\n\n // If specific package and version requested, return single bundle\n if (pkg && version) {\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n if (!manifest) {\n return reply.code(404).send({\n error: 'bundle_not_found',\n message: `Bundle ${pkg}@${version} not found`,\n });\n }\n return [manifest];\n }\n\n // Get all bundles\n const allBundles = this.dataStore.getAllBundles();\n const bundles = [];\n\n for (const bundle of allBundles) {\n // Filter by package if specified\n if (pkg && bundle.package !== pkg) {\n continue;\n }\n\n // Filter by developer pubkey if specified\n if (developer) {\n const bundlePubkey = bundle.signature?.pubkey;\n if (!bundlePubkey || bundlePubkey !== developer) {\n continue;\n }\n }\n\n bundles.push(bundle);\n }\n\n // Sort by package name, then by version (descending)\n bundles.sort((a, b) => {\n const pkgCompare = a.package.localeCompare(b.package);\n if (pkgCompare !== 0) return pkgCompare;\n // For same package, sort by version descending\n return b.appVersion.localeCompare(a.appVersion, undefined, {\n numeric: true,\n });\n });\n\n // If filtering by package, return all versions\n // Otherwise, return only latest version per package\n if (pkg) {\n return bundles;\n }\n\n // Group by package and return only latest version\n const latestByPackage = new Map<string, BundleManifest>();\n for (const bundle of bundles) {\n const existing = latestByPackage.get(bundle.package);\n if (!existing || bundle.appVersion > existing.appVersion) {\n latestByPackage.set(bundle.package, bundle);\n }\n }\n\n return Array.from(latestByPackage.values());\n });\n\n this.server.get(\n '/api/v2/bundles/:package/:version',\n async (request, reply) => {\n const { package: pkg, version } = request.params as {\n package: string;\n version: string;\n };\n\n const manifest = this.dataStore.getBundleManifest(pkg, version);\n\n if (!manifest) {\n return reply.code(404).send({\n error: 'manifest_not_found',\n message: `Manifest not found for ${pkg}@${version}`,\n });\n }\n\n return manifest;\n }\n );\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { LocalRegistryServer } from '../lib/local-server.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport fs from 'fs';\n\nconst localCommand = new Command('local').description(\n 'Manage local registry for development'\n);\n\n// Start local registry\nlocalCommand.addCommand(\n new Command('start')\n .description('Start local registry server')\n .option('-p, --port <port>', 'Port to run the server on', '8082')\n .option('-h, --host <host>', 'Host to bind the server to', '0.0.0.0')\n .option(\n '--public-host <host>',\n 'Public host exposed in manifest artifact URLs',\n 'host.docker.internal'\n )\n .action(async options => {\n const spinner = ora('Starting local registry...').start();\n\n try {\n const config = new LocalConfig();\n config.setHost(options.host);\n config.setPublicHost(options.publicHost);\n config.setPort(parseInt(options.port, 10));\n const server = new LocalRegistryServer(config);\n\n await server.start(parseInt(options.port));\n\n spinner.succeed(\n `Local registry started on http://${config.getHost()}:${config.getPort()}`\n );\n console.log(chalk.blue('\\nš± Local Registry Status:'));\n console.log(\n chalk.green(\n `ā
Server: http://${config.getHost()}:${config.getPort()}`\n )\n );\n console.log(\n chalk.green(\n `š Public URL: http://${config.getPublicHost()}:${config.getPort()}`\n )\n );\n console.log(chalk.green(`š Data: ${config.getDataDir()}`));\n console.log(\n chalk.green(\n `š Health: http://${config.getHost()}:${config.getPort()}/healthz`\n )\n );\n console.log(\n chalk.green(\n `š Stats: http://${config.getHost()}:${config.getPort()}/stats`\n )\n );\n console.log(\n chalk.blue(\n '\\nš” Use --local flag with other commands to use local registry'\n )\n );\n } catch (error) {\n spinner.fail('Failed to start local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Stop local registry\nlocalCommand.addCommand(\n new Command('stop')\n .description('Stop local registry server')\n .action(async () => {\n const spinner = ora('Stopping local registry...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.stop();\n\n spinner.succeed('Local registry stopped');\n } catch (error) {\n spinner.fail('Failed to stop local registry');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Status check\nlocalCommand.addCommand(\n new Command('status')\n .description('Check local registry status')\n .action(async () => {\n const spinner = ora('Checking local registry status...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const status = await server.getStatus();\n\n if (status.running) {\n spinner.succeed('Local registry is running');\n console.log(chalk.green(`ā
Server: ${status.url}`));\n console.log(chalk.green(`š Data: ${status.dataDir}`));\n console.log(chalk.green(`š Apps: ${status.appsCount} applications`));\n console.log(\n chalk.green(`š¦ Artifacts: ${status.artifactsCount} artifacts`)\n );\n } else {\n spinner.warn('Local registry is not running');\n console.log(\n chalk.yellow(\n 'š” Run \"calimero-registry local start\" to start the local registry'\n )\n );\n }\n } catch (error) {\n spinner.fail('Failed to check local registry status');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Reset local data\nlocalCommand.addCommand(\n new Command('reset')\n .description('Reset local registry data')\n .option('-f, --force', 'Force reset without confirmation')\n .action(async options => {\n if (!options.force) {\n console.log(\n chalk.yellow('ā ļø This will delete all local registry data!')\n );\n console.log(chalk.yellow(' Use --force flag to confirm'));\n return;\n }\n\n const spinner = ora('Resetting local registry data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.reset();\n\n spinner.succeed('Local registry data reset');\n console.log(chalk.green('ā
All local data has been cleared'));\n } catch (error) {\n spinner.fail('Failed to reset local registry data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Backup local data\nlocalCommand.addCommand(\n new Command('backup')\n .description('Backup local registry data')\n .option('-o, --output <file>', 'Output file path')\n .action(async options => {\n const spinner = ora('Creating backup...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n const backupPath = await server.backup(options.output);\n\n spinner.succeed('Backup created successfully');\n console.log(chalk.green(`š¦ Backup saved to: ${backupPath}`));\n } catch (error) {\n spinner.fail('Failed to create backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Restore from backup\nlocalCommand.addCommand(\n new Command('restore')\n .description('Restore local registry data from backup')\n .argument('<backup-file>', 'Path to backup file')\n .action(async backupFile => {\n const spinner = ora('Restoring from backup...').start();\n\n try {\n if (!fs.existsSync(backupFile)) {\n spinner.fail('Backup file not found');\n console.error(chalk.red(`File not found: ${backupFile}`));\n process.exit(1);\n }\n\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.restore(backupFile);\n\n spinner.succeed('Data restored successfully');\n console.log(chalk.green(`ā
Restored from: ${backupFile}`));\n } catch (error) {\n spinner.fail('Failed to restore from backup');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\n// Seed with sample data\nlocalCommand.addCommand(\n new Command('seed')\n .description('Seed local registry with sample data')\n .action(async () => {\n const spinner = ora('Seeding local registry with sample data...').start();\n\n try {\n const config = new LocalConfig();\n const server = new LocalRegistryServer(config);\n\n await server.seed();\n\n spinner.succeed('Sample data seeded successfully');\n console.log(\n chalk.green('ā
Local registry populated with sample applications')\n );\n console.log(\n chalk.blue(\n 'š” Run \"calimero-registry apps list --local\" to see the sample apps'\n )\n );\n } catch (error) {\n spinner.fail('Failed to seed sample data');\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n process.exit(1);\n }\n })\n);\n\nexport { localCommand };\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface RemoteConfigData {\n registry: {\n url: string;\n apiKey?: string;\n };\n}\n\nexport class RemoteConfig {\n private configPath: string;\n private config: RemoteConfigData;\n\n constructor() {\n this.configPath = path.join(\n os.homedir(),\n '.calimero-registry',\n 'remote-config.json'\n );\n this.config = this.loadConfig();\n }\n\n private loadConfig(): RemoteConfigData {\n // Create default config\n const defaultConfig: RemoteConfigData = {\n registry: {\n url: 'https://apps.calimero.network',\n },\n };\n\n // Load existing config if it exists\n if (fs.existsSync(this.configPath)) {\n try {\n const existingConfig = JSON.parse(\n fs.readFileSync(this.configPath, 'utf8')\n );\n return {\n registry: {\n ...defaultConfig.registry,\n ...(existingConfig.registry || {}),\n },\n };\n } catch {\n console.warn('Failed to load existing config, using defaults');\n }\n }\n\n return defaultConfig;\n }\n\n private saveConfig(): void {\n // Ensure config directory exists\n const configDir = path.dirname(this.configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n // Save config - always save API key if it's set in config\n // (env var takes precedence when reading, but doesn't prevent saving)\n const configToSave: RemoteConfigData = {\n registry: {\n url: this.config.registry.url,\n // Save API key if it exists in config (regardless of env var)\n ...(this.config.registry.apiKey\n ? { apiKey: this.config.registry.apiKey }\n : {}),\n },\n };\n fs.writeFileSync(this.configPath, JSON.stringify(configToSave, null, 2));\n }\n\n /**\n * Get registry URL with priority:\n * 1. Environment variable CALIMERO_REGISTRY_URL\n * 2. Config file value\n * 3. Default value\n */\n getRegistryUrl(): string {\n return (\n process.env.CALIMERO_REGISTRY_URL ||\n this.config.registry.url ||\n 'https://apps.calimero.network'\n );\n }\n\n /**\n * Set registry URL\n */\n setRegistryUrl(url: string): void {\n this.config.registry.url = url;\n this.saveConfig();\n }\n\n /**\n * Get API key with priority:\n * 1. Environment variable CALIMERO_API_KEY\n * 2. Config file value\n * 3. undefined\n */\n getApiKey(): string | undefined {\n return process.env.CALIMERO_API_KEY || this.config.registry.apiKey;\n }\n\n /**\n * Set API key (stored in config file)\n */\n setApiKey(apiKey: string): void {\n this.config.registry.apiKey = apiKey;\n this.saveConfig();\n }\n\n /**\n * Remove API key from config\n */\n removeApiKey(): void {\n delete this.config.registry.apiKey;\n this.saveConfig();\n }\n\n /**\n * Get full configuration\n */\n getConfig(): RemoteConfigData {\n return {\n registry: {\n url: this.getRegistryUrl(),\n // Don't expose API key in getConfig (security)\n apiKey: this.getApiKey() ? '***' : undefined,\n },\n };\n }\n\n /**\n * Get config file path\n */\n getConfigPath(): string {\n return this.configPath;\n }\n\n /**\n * Reset to defaults\n */\n reset(): void {\n this.config = {\n registry: {\n url: 'https://apps.calimero.network',\n },\n };\n this.saveConfig();\n }\n}\n","/**\n * Bundle Management Commands\n *\n * Implements:\n * - bundle push <file.mpk>\n * - bundle get <package> <version>\n */\n\nimport { Command } from 'commander';\nimport fs from 'fs';\nimport path from 'path';\nimport * as tar from 'tar';\nimport crypto from 'crypto';\nimport { LocalDataStore, BundleManifest } from '../lib/local-storage.js';\nimport { LocalConfig } from '../lib/local-config.js';\nimport { LocalArtifactServer } from '../lib/local-artifacts.js';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\ninterface BundlePushPayload {\n version: string;\n package: string;\n appVersion: string;\n _binary: string;\n _overwrite: boolean;\n metadata?: BundleManifest['metadata'];\n interfaces?: BundleManifest['interfaces'];\n wasm?: BundleManifest['wasm'];\n abi?: BundleManifest['abi'];\n migrations?: BundleManifest['migrations'];\n links?: BundleManifest['links'];\n signature?: BundleManifest['signature'];\n}\n\ninterface ApiResponseBody {\n message?: string;\n error?: string;\n package?: string;\n version?: string;\n [key: string]: unknown;\n}\n\nexport const bundleCommand = new Command('bundle')\n .description('Manage application bundles (V2)')\n .addCommand(createCreateCommand())\n .addCommand(createPushCommand())\n .addCommand(createGetCommand());\n\ninterface BundleManifestConfig {\n package?: string;\n version?: string;\n output?: string;\n name?: string;\n description?: string;\n author?: string;\n frontend?: string;\n github?: string;\n docs?: string;\n exports?: string[];\n uses?: string[];\n abi?: string | BundleManifest['abi']; // Can be file path string or BundleArtifact object\n}\n\nfunction createCreateCommand(): Command {\n return new Command('create')\n .description('Create an MPK bundle from a WASM file')\n .argument('<wasm-file>', 'Path to the WASM file')\n .argument('[package]', 'Package name (e.g. com.calimero.myapp)')\n .argument('[version]', 'Version (e.g. 1.0.0)')\n .option(\n '-m, --manifest <path>',\n 'Path to manifest JSON file (can contain package, version, and other options)'\n )\n .option('-o, --output <path>', 'Output path for the MPK file')\n .option('--name <name>', 'Application name')\n .option('--description <description>', 'Application description')\n .option('--author <author>', 'Application author')\n .option('--frontend <url>', 'Frontend URL')\n .option('--github <url>', 'GitHub URL')\n .option('--docs <url>', 'Documentation URL')\n .option(\n '--export <interface>',\n 'Export interface (can be specified multiple times)',\n (value, prev) => {\n return [...(prev || []), value];\n }\n )\n .option(\n '--use <interface>',\n 'Use interface (can be specified multiple times)',\n (value, prev) => {\n return [...(prev || []), value];\n }\n )\n .option('--abi <path>', 'Path to ABI JSON file to include in bundle')\n .addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0\n $ calimero-registry bundle create app.wasm --manifest bundle-manifest.json\n $ calimero-registry bundle create app.wasm --manifest bundle-manifest.json -o output.mpk\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0 --name \"My App\" --frontend https://app.example.com\n $ calimero-registry bundle create app.wasm com.calimero.myapp 1.0.0 --abi abi.json\n $ calimero-registry bundle create app.wasm --manifest manifest.json --abi res/abi.json\n\nManifest File Format (JSON):\n {\n \"package\": \"com.calimero.myapp\",\n \"version\": \"1.0.0\",\n \"output\": \"./dist/myapp.mpk\",\n \"name\": \"My Application\",\n \"description\": \"Application description\",\n \"author\": \"Calimero Team\",\n \"frontend\": \"https://app.example.com\",\n \"github\": \"https://github.com/user/repo\",\n \"docs\": \"https://docs.example.com\",\n \"exports\": [\"interface1\", \"interface2\"],\n \"uses\": [\"interface3\"],\n \"abi\": \"res/abi.json\"\n }\n\nNote:\n - Package and version can be provided via arguments, manifest file, or both\n - CLI arguments take precedence over manifest file values\n - If using manifest file, package and version can be omitted from command line\n - The -o/--output option overrides manifest.output if both are provided\n - ABI can be provided via --abi flag or manifest.abi field (file path string)\n - ABI file will be included in the bundle and referenced in the manifest\n`\n )\n .action(async (wasmFile, pkg, version, options) => {\n try {\n // Read manifest file if provided\n let manifestConfig: BundleManifestConfig = {};\n if (options.manifest) {\n const manifestPath = path.resolve(options.manifest);\n if (!fs.existsSync(manifestPath)) {\n console.error(`ā Manifest file not found: ${options.manifest}`);\n process.exit(1);\n }\n try {\n const manifestContent = fs.readFileSync(manifestPath, 'utf8');\n const parsed = JSON.parse(manifestContent);\n\n // Validate that parsed JSON is an object\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n console.error(`ā Invalid manifest file: ${options.manifest}`);\n console.error(' Manifest must be a JSON object');\n process.exit(1);\n }\n\n manifestConfig = parsed as BundleManifestConfig;\n } catch (error) {\n console.error(\n `ā Failed to parse manifest file: ${options.manifest}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n }\n\n // Merge manifest with CLI options (CLI takes precedence)\n const finalPackage = pkg || manifestConfig.package;\n const finalVersion = version || manifestConfig.version;\n const finalOutput = options.output || manifestConfig.output;\n const finalName = options.name || manifestConfig.name;\n const finalDescription =\n options.description || manifestConfig.description;\n const finalAuthor =\n options.author || manifestConfig.author || 'Calimero Team';\n const finalFrontend = options.frontend || manifestConfig.frontend;\n const finalGithub = options.github || manifestConfig.github;\n const finalDocs = options.docs || manifestConfig.docs;\n\n // Validate and extract array options (CLI takes precedence - if CLI provides values, use only those)\n const manifestExports = manifestConfig.exports;\n const manifestUses = manifestConfig.uses;\n\n // Validate manifest array fields are actually arrays\n if (manifestExports !== undefined && !Array.isArray(manifestExports)) {\n console.error('ā Invalid manifest: \"exports\" must be an array');\n process.exit(1);\n }\n if (manifestUses !== undefined && !Array.isArray(manifestUses)) {\n console.error('ā Invalid manifest: \"uses\" must be an array');\n process.exit(1);\n }\n\n // CLI options take precedence - if CLI provides exports/uses, use only those\n const finalExports =\n options.export && options.export.length > 0\n ? options.export\n : manifestExports || [];\n const finalUses =\n options.use && options.use.length > 0\n ? options.use\n : manifestUses || [];\n\n // Validate required parameters\n if (!wasmFile) {\n console.error('ā WASM file is required');\n process.exit(1);\n }\n\n if (!finalPackage) {\n console.error(\n 'ā Package name is required (provide via argument, --manifest file, or manifest.package)'\n );\n process.exit(1);\n }\n\n if (!finalVersion) {\n console.error(\n 'ā Version is required (provide via argument, --manifest file, or manifest.version)'\n );\n process.exit(1);\n }\n\n // Validate package name format (basic validation)\n // Allow hyphens consistently in all segments: com.calimero.my-app, com.my-org.app, etc.\n if (!/^[a-z0-9-]+(\\.[a-z0-9-]+)+$/.test(finalPackage)) {\n console.error(\n 'ā Invalid package name format. Expected format: com.calimero.myapp or com.my-org.my-app'\n );\n process.exit(1);\n }\n\n // Validate version format (semver-like)\n // Allow dots and hyphens in prerelease and build metadata: 1.0.0-alpha.1, 1.0.0-rc.2+build.1\n if (\n !/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.-]+)?(\\+[a-z0-9.-]+)?$/i.test(finalVersion)\n ) {\n console.error(\n 'ā Invalid version format. Expected format: 1.0.0, 1.0.0-alpha, or 1.0.0-alpha.1'\n );\n process.exit(1);\n }\n\n const wasmPath = path.resolve(wasmFile);\n if (!fs.existsSync(wasmPath)) {\n console.error(`ā WASM file not found: ${wasmFile}`);\n process.exit(1);\n }\n\n console.log(`š¦ Creating MPK bundle from: ${path.basename(wasmPath)}`);\n\n // Read WASM file\n const wasmContent = fs.readFileSync(wasmPath);\n const wasmSize = wasmContent.length;\n\n // Calculate SHA256 hash\n const wasmHash = crypto\n .createHash('sha256')\n .update(wasmContent)\n .digest('hex');\n\n // Handle ABI file (CLI option takes precedence over manifest)\n let abiArtifact: BundleManifest['abi'] = undefined;\n let abiContent: Buffer | null = null;\n const abiPathFromOption = options.abi;\n const abiPathFromManifest =\n typeof manifestConfig.abi === 'string' ? manifestConfig.abi : null;\n\n // Determine ABI file path (CLI option takes precedence)\n const abiFilePath = abiPathFromOption || abiPathFromManifest;\n\n if (abiFilePath) {\n // Resolve ABI file path:\n // - CLI option (--abi) is always relative to cwd (consistent with WASM file handling)\n // - Manifest abi field is relative to manifest file directory\n const abiResolvedPath = abiPathFromOption\n ? path.resolve(abiFilePath) // CLI option: always resolve relative to cwd\n : options.manifest && abiPathFromManifest\n ? path.resolve(\n path.dirname(path.resolve(options.manifest)),\n abiFilePath\n ) // Manifest field: resolve relative to manifest directory\n : path.resolve(abiFilePath); // Fallback: resolve relative to cwd\n\n if (!fs.existsSync(abiResolvedPath)) {\n console.error(`ā ABI file not found: ${abiFilePath}`);\n console.error(` Resolved path: ${abiResolvedPath}`);\n process.exit(1);\n }\n\n // Read ABI file\n try {\n abiContent = fs.readFileSync(abiResolvedPath);\n // Validate it's valid JSON\n JSON.parse(abiContent.toString('utf8'));\n\n // Calculate ABI hash\n const abiHash = crypto\n .createHash('sha256')\n .update(abiContent)\n .digest('hex');\n\n // Create ABI artifact\n abiArtifact = {\n path: 'abi.json',\n hash: abiHash,\n size: abiContent.length,\n };\n console.log(\n ` Including ABI file: ${path.basename(abiResolvedPath)}`\n );\n } catch (error) {\n console.error(\n `ā Failed to read or parse ABI file: ${abiFilePath}`\n );\n console.error(\n error instanceof Error ? error.message : 'Invalid JSON'\n );\n process.exit(1);\n }\n } else if (\n manifestConfig.abi &&\n typeof manifestConfig.abi === 'object'\n ) {\n // If manifest provides ABI as an object (BundleArtifact), we need the actual file\n // to include in the bundle. The object only contains metadata (path, hash, size)\n // but not the source file location. Since we're in this branch, options.abi is falsy\n // (otherwise we'd be in the first if branch), so we can't include the file.\n console.error(\n 'ā Manifest provides ABI as object, but --abi flag is required to include the ABI file in bundle'\n );\n console.error(\n ' Provide the ABI file path with --abi flag, or change manifest.abi to a file path string'\n );\n process.exit(1);\n }\n\n // Build metadata\n const metadata: {\n name: string;\n description: string;\n author: string;\n } = {\n name: finalName || finalPackage,\n description: finalDescription || '',\n author: finalAuthor,\n };\n\n // Build links if provided\n const links: {\n frontend?: string;\n github?: string;\n docs?: string;\n } = {};\n if (finalFrontend) links.frontend = finalFrontend;\n if (finalGithub) links.github = finalGithub;\n if (finalDocs) links.docs = finalDocs;\n\n // Build interfaces\n const interfaces = {\n exports: finalExports,\n uses: finalUses,\n };\n\n // Create bundle manifest\n const manifest: BundleManifest = {\n version: '1.0',\n package: finalPackage,\n appVersion: finalVersion,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n interfaces:\n interfaces.exports.length > 0 || interfaces.uses.length > 0\n ? interfaces\n : undefined,\n wasm: {\n path: 'app.wasm',\n hash: wasmHash,\n size: wasmSize,\n },\n abi: abiArtifact || undefined,\n migrations: [],\n links: Object.keys(links).length > 0 ? links : undefined,\n signature: undefined,\n };\n\n // Determine output path\n let outputPath = finalOutput;\n if (!outputPath) {\n const outputDir = path.join(\n process.cwd(),\n finalPackage,\n finalVersion\n );\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n outputPath = path.join(\n outputDir,\n `${finalPackage}-${finalVersion}.mpk`\n );\n } else {\n outputPath = path.resolve(outputPath);\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n }\n\n // Create temporary directory for bundle contents\n const tempDir = path.join(\n path.dirname(outputPath),\n `.temp-bundle-${Date.now()}`\n );\n fs.mkdirSync(tempDir, { recursive: true });\n\n try {\n // Write manifest.json\n fs.writeFileSync(\n path.join(tempDir, 'manifest.json'),\n JSON.stringify(manifest, null, 2)\n );\n\n // Copy WASM file as app.wasm\n fs.writeFileSync(path.join(tempDir, 'app.wasm'), wasmContent);\n\n // Copy ABI file if provided\n const archiveFiles = ['manifest.json', 'app.wasm'];\n if (abiContent) {\n fs.writeFileSync(path.join(tempDir, 'abi.json'), abiContent);\n archiveFiles.push('abi.json');\n }\n\n // Create gzip-compressed tar archive\n await tar.create(\n {\n gzip: true,\n file: outputPath,\n cwd: tempDir,\n },\n archiveFiles\n );\n\n const outputSize = fs.statSync(outputPath).size;\n console.log(`ā
Created MPK bundle: ${outputPath}`);\n console.log(` Package: ${finalPackage}`);\n console.log(` Version: ${finalVersion}`);\n console.log(` Size: ${outputSize} bytes`);\n console.log(` WASM Hash: ${wasmHash}`);\n if (abiArtifact) {\n console.log(` ABI Hash: ${abiArtifact.hash}`);\n }\n } finally {\n // Cleanup temp directory\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : 'Unknown error';\n console.error('ā Failed to create bundle:', message);\n process.exit(1);\n }\n });\n}\n\nfunction createPushCommand(): Command {\n return new Command('push')\n .description(\n 'Push a bundle (.mpk) to the registry (local or remote). Defaults to local registry.'\n )\n .argument('<bundle-file>', 'Path to the .mpk bundle file')\n .option('--local', 'Push to local registry instance (default)')\n .option('--remote', 'Push to remote registry instance')\n .option(\n '--url <registry-url>',\n 'Registry URL for remote push (overrides config file)'\n )\n .option(\n '--api-key <key>',\n 'API key for authentication (overrides config file and env var)'\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry bundle push bundle.mpk --local\n $ calimero-registry bundle push bundle.mpk --remote\n $ calimero-registry bundle push bundle.mpk --remote --url https://apps.calimero.network\n $ calimero-registry bundle push bundle.mpk --remote --api-key your-api-key\n\nConfiguration:\n Set defaults using the config command:\n $ calimero-registry config set registry-url https://apps.calimero.network\n $ calimero-registry config set api-key your-api-key\n \n Or use environment variables:\n $ export CALIMERO_REGISTRY_URL=https://apps.calimero.network\n $ export CALIMERO_API_KEY=your-api-key\n\nNote:\n - Use --local for development/testing with local registry\n - Use --remote for production deployments\n - Config file values are used unless overridden by flags or environment variables\n - Priority: flag > environment variable > config file > default\n`\n )\n .action(async (bundleFile, options) => {\n try {\n // Warn if remote-only options are used without --remote\n if (!options.remote && (options.url || options.apiKey)) {\n console.warn(\n 'ā ļø Warning: --url and --api-key are only used with --remote flag'\n );\n console.warn(\n ' These options will be ignored. Use --remote to push to remote registry.'\n );\n }\n\n // Determine mode: default to local if neither flag is set\n // Handle explicit false from --no-local flag\n const useLocal =\n options.local === false\n ? false\n : options.local === true\n ? true\n : !options.remote;\n const useRemote = options.remote === true;\n\n // Ensure mutually exclusive flags\n if (options.local && options.remote) {\n console.error('ā Cannot use both --local and --remote flags');\n process.exit(1);\n }\n\n // Ensure at least one mode is selected\n if (!useLocal && !useRemote) {\n console.error(\n 'ā No push mode specified. Use --local or --remote flag'\n );\n process.exit(1);\n }\n\n const fullPath = path.resolve(bundleFile);\n if (!fs.existsSync(fullPath)) {\n console.error(`ā File not found: ${bundleFile}`);\n process.exit(1);\n }\n\n console.log(`š¦ Processing bundle: ${path.basename(fullPath)}`);\n\n // 1. Read bundle and extract manifest\n const manifest = await extractManifest(fullPath);\n\n if (!manifest) {\n console.error('ā manifest.json not found in bundle');\n process.exit(1);\n }\n\n // 2. Validate manifest\n if (!manifest.package || !manifest.appVersion) {\n console.error('ā Invalid manifest: missing package or appVersion');\n process.exit(1);\n }\n\n console.log(` Package: ${manifest.package}`);\n console.log(` Version: ${manifest.appVersion}`);\n if (manifest.metadata) {\n console.log(` Name: ${manifest.metadata.name}`);\n }\n\n // 3. Store (Local Mode)\n if (useLocal) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const artifactServer = new LocalArtifactServer(config, store);\n\n // Copy bundle artifact to local storage\n const bundleFilename = `${manifest.package}-${manifest.appVersion}.mpk`;\n const targetPath = await artifactServer.copyArtifactToLocal(\n fullPath,\n manifest.package,\n manifest.appVersion,\n bundleFilename\n );\n\n console.log(` Artifact stored: ${targetPath}`);\n\n // Update manifest with local artifact path/url?\n // Actually, for V2 bundles, the registry serves the whole .mpk.\n // The manifest inside the registry is metadata.\n // We might want to store the bundle download URL in the manifest we serve via API?\n // Or just keep it implicit (API constructs download link).\n\n // For local-storage, we can add a field to track where the .mpk is.\n // But LocalDataStore mainly stores the JSON.\n // The artifacts are stored by convention in artifacts/package/version/.\n\n store.setBundleManifest(\n manifest.package,\n manifest.appVersion,\n manifest\n );\n console.log('ā
Bundle manifest registered locally');\n console.log(\n ` Run 'calimero-registry bundle get ${manifest.package} ${manifest.appVersion}' to verify`\n );\n } else if (useRemote) {\n // Remote Mode: Push to remote registry\n // Get values from config file, with flag/environment variable overrides\n const remoteConfig = new RemoteConfig();\n const registryUrl =\n options.url ||\n process.env.CALIMERO_REGISTRY_URL ||\n remoteConfig.getRegistryUrl();\n const apiKey =\n options.apiKey ||\n process.env.CALIMERO_API_KEY ||\n remoteConfig.getApiKey();\n\n await pushToRemote(fullPath, manifest, registryUrl, apiKey);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('ā Failed to push bundle:', message);\n process.exit(1);\n }\n });\n}\n\nfunction createGetCommand(): Command {\n return new Command('get')\n .description('Get bundle manifest')\n .argument('<package>', 'Package name (e.g. com.calimero.kv)')\n .argument('<version>', 'Version (e.g. 1.0.0)')\n .option('--local', 'Use local registry', true)\n .action(async (pkg, version, options) => {\n try {\n if (options.local) {\n const config = new LocalConfig();\n const store = new LocalDataStore(config);\n const manifest = store.getBundleManifest(pkg, version);\n\n if (manifest) {\n console.log(JSON.stringify(manifest, null, 2));\n } else {\n console.error(`ā Manifest not found: ${pkg}@${version}`);\n process.exit(1);\n }\n } else {\n console.error('ā Remote get not implemented yet');\n process.exit(1);\n }\n } catch (error) {\n console.error('ā Error:', error);\n process.exit(1);\n }\n });\n}\n\n// Helper to push bundle to remote registry\nasync function pushToRemote(\n bundlePath: string,\n manifest: BundleManifest,\n registryUrl: string,\n apiKey?: string\n): Promise<void> {\n try {\n console.log(`š¤ Pushing to remote registry: ${registryUrl}`);\n\n // 1. Read bundle file as binary\n const bundleBuffer = fs.readFileSync(bundlePath);\n const bundleSize = bundleBuffer.length;\n console.log(` Bundle size: ${bundleSize} bytes`);\n\n // 2. Convert bundle to hex string\n const bundleHex = bundleBuffer.toString('hex');\n console.log(` Converted to hex (${bundleHex.length} characters)`);\n\n // 3. Build request payload matching API format\n const payload: BundlePushPayload = {\n version: manifest.version || '1.0',\n package: manifest.package,\n appVersion: manifest.appVersion,\n _binary: bundleHex,\n _overwrite: true,\n };\n\n // Preserve all manifest fields\n if (manifest.metadata) {\n payload.metadata = manifest.metadata;\n }\n if (manifest.interfaces) {\n payload.interfaces = manifest.interfaces;\n }\n if (manifest.wasm) {\n payload.wasm = manifest.wasm;\n }\n if (manifest.abi) {\n payload.abi = manifest.abi;\n }\n if (manifest.migrations && manifest.migrations.length > 0) {\n payload.migrations = manifest.migrations;\n }\n if (manifest.links) {\n payload.links = manifest.links;\n }\n if (manifest.signature) {\n payload.signature = manifest.signature;\n }\n\n // 4. Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add API key if provided (from option or environment variable)\n const finalApiKey = apiKey || process.env.CALIMERO_API_KEY;\n if (finalApiKey) {\n headers['Authorization'] = `Bearer ${finalApiKey}`;\n }\n\n // 5. POST to remote registry\n const apiUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/push`;\n console.log(` POST ${apiUrl}`);\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout\n\n try {\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const responseText = await response.text();\n let responseBody: ApiResponseBody;\n try {\n responseBody = JSON.parse(responseText) as ApiResponseBody;\n } catch {\n responseBody = { message: responseText };\n }\n\n // 6. Handle response\n if (response.status === 201) {\n console.log('ā
Bundle manifest uploaded successfully');\n console.log(` Package: ${responseBody.package || manifest.package}`);\n console.log(\n ` Version: ${responseBody.version || manifest.appVersion}`\n );\n\n // 7. Verify bundle was stored correctly\n await verifyRemotePush(\n registryUrl,\n manifest.package,\n manifest.appVersion\n );\n } else {\n // Handle error responses\n handlePushError(response.status, responseBody);\n }\n } catch (fetchError: unknown) {\n clearTimeout(timeoutId);\n if (fetchError instanceof Error && fetchError.name === 'AbortError') {\n console.error('ā Request timed out after 60 seconds');\n console.error(' The bundle may be too large or the server is slow');\n process.exit(1);\n }\n throw fetchError;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error('ā Failed to push to remote registry:', message);\n throw error;\n }\n}\n\n// Helper to verify bundle was stored correctly\nasync function verifyRemotePush(\n registryUrl: string,\n packageName: string,\n version: string\n): Promise<void> {\n try {\n console.log('š Verifying upload to remote registry...');\n\n const verifyUrl = `${registryUrl.replace(/\\/$/, '')}/api/v2/bundles/${packageName}/${version}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n try {\n const response = await fetch(verifyUrl, {\n method: 'GET',\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 200) {\n await response.json(); // Consume response body\n console.log('ā
Bundle verified and accessible on remote registry');\n console.log(`š Registry: ${registryUrl}`);\n console.log(`š Endpoint: ${verifyUrl}`);\n } else {\n console.warn(\n `ā ļø Upload verification failed - bundle not found (HTTP ${response.status})`\n );\n console.warn(' The bundle may still be processing, check manually');\n }\n } catch (verifyError: unknown) {\n clearTimeout(timeoutId);\n if (verifyError instanceof Error && verifyError.name === 'AbortError') {\n console.warn('ā ļø Verification request timed out');\n } else {\n const message =\n verifyError instanceof Error\n ? verifyError.message\n : String(verifyError);\n console.warn('ā ļø Verification request failed:', message);\n }\n console.warn(' The bundle may still be accessible, check manually');\n }\n } catch (error) {\n // Verification failure is not critical\n console.warn('ā ļø Could not verify bundle:', error);\n }\n}\n\n// Helper to handle push errors with helpful messages\nfunction handlePushError(\n statusCode: number,\n responseBody: ApiResponseBody\n): void {\n const errorMessage =\n responseBody.message || responseBody.error || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n console.error('ā Bad Request: Invalid manifest');\n console.error(` ${errorMessage}`);\n console.error(' Check that your bundle manifest is valid');\n break;\n case 401:\n console.error('ā Unauthorized: Authentication required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Provide an API key with --api-key or CALIMERO_API_KEY env var'\n );\n break;\n case 403:\n console.error('ā Forbidden: Namespace ownership required');\n console.error(` ${errorMessage}`);\n console.error(\n ' Ensure you have permission to publish to this package namespace'\n );\n break;\n case 409:\n console.error('ā Conflict: Version already exists');\n console.error(` ${errorMessage}`);\n console.error(\n ' Increment the version number and try again, or contact registry admin'\n );\n break;\n case 500:\n console.error('ā Internal Server Error');\n console.error(` ${errorMessage}`);\n console.error(' The registry server encountered an error');\n break;\n default:\n console.error(`ā Upload failed with HTTP ${statusCode}`);\n console.error(` ${errorMessage}`);\n }\n\n process.exit(1);\n}\n\n// Helper to extract manifest.json from .mpk (tar.gz)\nasync function extractManifest(\n bundlePath: string\n): Promise<BundleManifest | null> {\n let manifestContent: string | null = null;\n\n // @ts-expect-error tar typing issue\n await tar.t({\n file: bundlePath,\n\n onentry: (entry: tar.ReadEntry) => {\n if (entry.path === 'manifest.json') {\n // Found it\n }\n },\n });\n\n // Actual extraction\n const extractDir = path.join(path.dirname(bundlePath), `.temp-${Date.now()}`);\n if (!fs.existsSync(extractDir)) {\n fs.mkdirSync(extractDir);\n }\n\n try {\n // @ts-expect-error tar typing issue\n await tar.x({\n file: bundlePath,\n cwd: extractDir,\n filter: (path: string) => path === 'manifest.json',\n });\n\n const manifestPath = path.join(extractDir, 'manifest.json');\n if (fs.existsSync(manifestPath)) {\n const content = fs.readFileSync(manifestPath, 'utf8');\n manifestContent = content;\n }\n } catch {\n // ignore\n } finally {\n // Cleanup\n if (fs.existsSync(extractDir)) {\n fs.rmSync(extractDir, { recursive: true, force: true });\n }\n }\n\n if (manifestContent) {\n try {\n return JSON.parse(manifestContent) as BundleManifest;\n } catch {\n console.error('Failed to parse manifest JSON');\n return null;\n }\n }\n\n return null;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport { RemoteConfig } from '../lib/remote-config.js';\n\nexport const configCommand = new Command('config')\n .description('Manage CLI configuration for remote registry')\n .addCommand(createConfigSetCommand())\n .addCommand(createConfigGetCommand())\n .addCommand(createConfigListCommand())\n .addCommand(createConfigResetCommand());\n\nfunction createConfigSetCommand(): Command {\n return new Command('set')\n .description('Set a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .argument('<value>', 'Configuration value')\n .action((key, value) => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n config.setRegistryUrl(value);\n console.log(\n chalk.green(`ā
Registry URL set to: ${chalk.bold(value)}`)\n );\n break;\n\n case 'api-key':\n case 'apiKey':\n config.setApiKey(value);\n console.log(chalk.green('ā
API key set successfully'));\n console.log(\n chalk.yellow(\n 'š” Note: API key is stored in plain text. Consider using CALIMERO_API_KEY environment variable for better security.'\n )\n );\n break;\n\n default:\n console.error(chalk.red(`ā Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to set configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigGetCommand(): Command {\n return new Command('get')\n .description('Get a configuration value')\n .argument('<key>', 'Configuration key (registry-url, api-key)')\n .action(key => {\n try {\n const config = new RemoteConfig();\n\n switch (key) {\n case 'registry-url':\n case 'registryUrl':\n case 'url':\n console.log(config.getRegistryUrl());\n break;\n\n case 'api-key':\n case 'apiKey': {\n const apiKey = config.getApiKey();\n if (apiKey) {\n // Mask API key for security\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(masked);\n console.log(\n chalk.yellow(\n 'š” Note: API key is masked. Use \"config list\" to see source.'\n )\n );\n } else {\n console.log('(not set)');\n }\n break;\n }\n\n default:\n console.error(chalk.red(`ā Unknown configuration key: ${key}`));\n console.log(chalk.blue('\\nAvailable keys:'));\n console.log(' registry-url - Default registry URL');\n console.log(' api-key - API key for authentication');\n process.exit(1);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to get configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigListCommand(): Command {\n return new Command('list')\n .description('List all configuration values')\n .alias('ls')\n .action(() => {\n try {\n const config = new RemoteConfig();\n\n console.log(chalk.blue('\\nš Remote Registry Configuration\\n'));\n\n // Check if config file exists\n const configPath = config.getConfigPath();\n const configFileExists = fs.existsSync(configPath);\n\n // Registry URL\n const url = config.getRegistryUrl();\n let urlSource: string;\n if (process.env.CALIMERO_REGISTRY_URL) {\n urlSource = chalk.yellow('(from CALIMERO_REGISTRY_URL env var)');\n } else if (configFileExists) {\n urlSource = chalk.gray('(from config file)');\n } else {\n urlSource = chalk.gray('(default)');\n }\n console.log(` ${chalk.bold('Registry URL:')} ${url} ${urlSource}`);\n\n // API Key\n const apiKey = config.getApiKey();\n if (apiKey) {\n let apiKeySource: string;\n if (process.env.CALIMERO_API_KEY) {\n apiKeySource = chalk.yellow('(from CALIMERO_API_KEY env var)');\n } else if (configFileExists) {\n apiKeySource = chalk.gray('(from config file)');\n } else {\n apiKeySource = chalk.gray('(default)');\n }\n const masked =\n apiKey.length > 8\n ? `${apiKey.substring(0, 4)}...${apiKey.substring(apiKey.length - 4)}`\n : '***';\n console.log(` ${chalk.bold('API Key:')} ${masked} ${apiKeySource}`);\n } else {\n console.log(` ${chalk.bold('API Key:')} ${chalk.gray('(not set)')}`);\n }\n\n console.log(chalk.blue(`\\nš Config file: ${configPath}`));\n if (!configFileExists) {\n console.log(chalk.gray(' (file does not exist, using defaults)'));\n }\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to list configuration:'), message);\n process.exit(1);\n }\n });\n}\n\nfunction createConfigResetCommand(): Command {\n return new Command('reset')\n .description('Reset configuration to defaults')\n .option('--force', 'Skip confirmation prompt')\n .action(options => {\n try {\n if (!options.force) {\n console.error(\n chalk.red('ā Configuration reset requires --force flag')\n );\n console.log(\n chalk.yellow(\n 'ā ļø This will reset all configuration to defaults. Use --force to confirm.'\n )\n );\n process.exit(1);\n }\n\n const config = new RemoteConfig();\n config.reset();\n\n console.log(chalk.green('ā
Configuration reset to defaults'));\n console.log(chalk.blue('\\nDefault values:'));\n console.log(' Registry URL: https://apps.calimero.network');\n console.log(' API Key: (not set)');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(chalk.red('ā Failed to reset configuration:'), message);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { appsCommand } from './commands/apps.js';\nimport { developersCommand } from './commands/developers.js';\nimport { attestationsCommand } from './commands/attestations.js';\nimport { healthCommand } from './commands/health.js';\nimport { ipfsCommand } from './commands/ipfs.js';\nimport { localCommand } from './commands/local.js';\nimport { bundleCommand } from './commands/bundle.js';\nimport { configCommand } from './commands/config.js';\n\nconst program = new Command();\n\nprogram\n .name('calimero-registry')\n .description(\n 'Calimero Network App Registry CLI - Command-line interface for the App Registry'\n )\n .version('1.0.0');\n\n// Global help text with examples\nprogram.addHelpText(\n 'after',\n `\nExamples:\n $ calimero-registry apps list\n $ calimero-registry apps create --file manifest.json\n $ calimero-registry local start\n $ calimero-registry health --local\n\nFor more information, visit: https://github.com/calimero-network/app-registry\n`\n);\n\n// Global options\nprogram.option('-u, --url <url>', 'Registry API URL', 'http://localhost:8082');\nprogram.option(\n '-t, --timeout <timeout>',\n 'Request timeout in milliseconds',\n '10000'\n);\nprogram.option('--local', 'Use local registry instead of remote API');\n\n// Add commands\nprogram.addCommand(appsCommand);\nprogram.addCommand(developersCommand);\nprogram.addCommand(attestationsCommand);\nprogram.addCommand(healthCommand);\nprogram.addCommand(ipfsCommand);\nprogram.addCommand(localCommand);\nprogram.addCommand(bundleCommand);\nprogram.addCommand(configCommand);\n\n// Global error handler\nprogram.exitOverride();\n\ntry {\n program.parse();\n} catch (err) {\n if (err instanceof Error) {\n console.error(chalk.red('Error:'), err.message);\n } else {\n console.error(chalk.red('Unknown error occurred'));\n }\n process.exit(1);\n}\n"]}
|