@noosphere/registry 0.2.0-alpha.1 → 0.2.2-alpha.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.cjs CHANGED
@@ -42,6 +42,7 @@ var RegistryManager = class {
42
42
  constructor(config = {}) {
43
43
  this.containers = /* @__PURE__ */ new Map();
44
44
  this.verifiers = /* @__PURE__ */ new Map();
45
+ this.deployments = /* @__PURE__ */ new Map();
45
46
  this.lastSync = 0;
46
47
  this.config = {
47
48
  localPath: config.localPath || import_path.default.join(process.cwd(), ".noosphere", "registry.json"),
@@ -68,7 +69,9 @@ var RegistryManager = class {
68
69
  }
69
70
  }
70
71
  if (this.config.autoSync && this.containers.size === 0 && retryCount < maxRetries) {
71
- console.warn(`\u26A0\uFE0F Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`);
72
+ console.warn(
73
+ `\u26A0\uFE0F Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`
74
+ );
72
75
  await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
73
76
  try {
74
77
  await this.forceSync();
@@ -79,7 +82,7 @@ var RegistryManager = class {
79
82
  return this.load(retryCount + 1);
80
83
  }
81
84
  }
82
- console.log(`\u2713 Loaded ${this.containers.size} containers and ${this.verifiers.size} verifiers`);
85
+ console.log(`\u2713 Loaded ${this.containers.size} containers, ${this.verifiers.size} verifiers, ${this.deployments.size} deployments`);
83
86
  }
84
87
  /**
85
88
  * Load local registry file
@@ -94,6 +97,9 @@ var RegistryManager = class {
94
97
  Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {
95
98
  this.verifiers.set(id, metadata);
96
99
  });
100
+ Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {
101
+ this.deployments.set(chainId, metadata);
102
+ });
97
103
  console.log(`\u2713 Loaded local registry from ${this.config.localPath}`);
98
104
  } catch (error) {
99
105
  if (error.code === "ENOENT") {
@@ -130,6 +136,7 @@ var RegistryManager = class {
130
136
  console.log("Reloading registry...");
131
137
  this.containers.clear();
132
138
  this.verifiers.clear();
139
+ this.deployments.clear();
133
140
  this.lastSync = 0;
134
141
  await this.load();
135
142
  }
@@ -154,6 +161,9 @@ var RegistryManager = class {
154
161
  this.verifiers.set(id, metadata);
155
162
  }
156
163
  });
164
+ Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {
165
+ this.deployments.set(chainId, metadata);
166
+ });
157
167
  this.lastSync = Date.now();
158
168
  console.log(`\u2713 Synced registry (version: ${registry.version})`);
159
169
  await this.saveLocal();
@@ -201,6 +211,18 @@ var RegistryManager = class {
201
211
  listVerifiers() {
202
212
  return Array.from(this.verifiers.values()).filter((v) => v.statusCode === "ACTIVE");
203
213
  }
214
+ /**
215
+ * Get deployment by chain ID
216
+ */
217
+ getDeployment(chainId) {
218
+ return this.deployments.get(chainId);
219
+ }
220
+ /**
221
+ * Get all active deployments
222
+ */
223
+ listDeployments() {
224
+ return Array.from(this.deployments.values()).filter((d) => d.statusCode === "ACTIVE");
225
+ }
204
226
  /**
205
227
  * Add custom container to local registry
206
228
  */
@@ -242,6 +264,7 @@ var RegistryManager = class {
242
264
  const registry = {
243
265
  containers: Object.fromEntries(this.containers),
244
266
  verifiers: Object.fromEntries(this.verifiers),
267
+ deployments: Object.fromEntries(this.deployments),
245
268
  version: "1.0.0",
246
269
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
247
270
  };
@@ -264,6 +287,8 @@ var RegistryManager = class {
264
287
  activeContainers: this.listContainers().length,
265
288
  totalVerifiers: this.verifiers.size,
266
289
  activeVerifiers: this.listVerifiers().length,
290
+ totalDeployments: this.deployments.size,
291
+ activeDeployments: this.listDeployments().length,
267
292
  lastSync: this.lastSync ? new Date(this.lastSync).toISOString() : "Never"
268
293
  };
269
294
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/RegistryManager.ts"],"sourcesContent":["export { RegistryManager } from './RegistryManager';\nexport * from './types';\n","import fs from 'fs/promises';\nimport path from 'path';\nimport fetch from 'node-fetch';\nimport type { ContainerMetadata, VerifierMetadata, RegistryConfig, RegistryIndex } from './types';\n\nexport class RegistryManager {\n private containers = new Map<string, ContainerMetadata>();\n private verifiers = new Map<string, VerifierMetadata>();\n private config: Required<RegistryConfig>;\n private lastSync: number = 0;\n\n constructor(config: RegistryConfig = {}) {\n this.config = {\n localPath: config.localPath || path.join(process.cwd(), '.noosphere', 'registry.json'),\n remotePath:\n config.remotePath ||\n 'https://raw.githubusercontent.com/hpp-io/noosphere-registry/main/registry.json',\n autoSync: config.autoSync ?? true,\n cacheTTL: config.cacheTTL || 3600000, // 1 hour default\n };\n }\n\n /**\n * Load registry from local and optionally sync from remote\n * Retries if 0 containers are loaded\n */\n async load(retryCount: number = 0): Promise<void> {\n const maxRetries = 3;\n const retryDelayMs = 5000;\n\n // Load local registry\n await this.loadLocal();\n\n // Sync from remote if enabled\n if (this.config.autoSync) {\n try {\n await this.sync();\n } catch (error) {\n console.warn('Failed to sync remote registry:', error);\n console.log('Continuing with local registry only');\n }\n }\n\n // Check if we have 0 containers and should retry (only when autoSync is enabled)\n if (this.config.autoSync && this.containers.size === 0 && retryCount < maxRetries) {\n console.warn(`⚠️ Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`);\n\n // Wait before retry\n await new Promise(resolve => setTimeout(resolve, retryDelayMs));\n\n // Try force sync from remote\n try {\n await this.forceSync();\n } catch (error) {\n console.warn('Force sync failed:', error);\n }\n\n // If still 0, recurse with incremented retry count\n if (this.containers.size === 0) {\n return this.load(retryCount + 1);\n }\n }\n\n console.log(`✓ Loaded ${this.containers.size} containers and ${this.verifiers.size} verifiers`);\n }\n\n /**\n * Load local registry file\n */\n private async loadLocal(): Promise<void> {\n try {\n const data = await fs.readFile(this.config.localPath, 'utf-8');\n const registry: RegistryIndex = JSON.parse(data);\n\n // Load containers\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n this.containers.set(id, metadata);\n });\n\n // Load verifiers\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n this.verifiers.set(id, metadata);\n });\n\n console.log(`✓ Loaded local registry from ${this.config.localPath}`);\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n console.log('No local registry found, will create default');\n await this.createDefaultRegistry();\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Sync registry from remote GitHub repository\n */\n async sync(): Promise<void> {\n const now = Date.now();\n\n // Check cache TTL\n if (now - this.lastSync < this.config.cacheTTL) {\n console.log('Registry cache is fresh, skipping sync');\n return;\n }\n\n await this.fetchRemote();\n }\n\n /**\n * Force sync from remote, bypassing cache TTL\n */\n async forceSync(): Promise<void> {\n console.log('Force syncing registry (bypassing cache)...');\n this.lastSync = 0; // Reset cache\n await this.fetchRemote();\n }\n\n /**\n * Reload registry completely (clear and reload from local + remote)\n */\n async reload(): Promise<void> {\n console.log('Reloading registry...');\n this.containers.clear();\n this.verifiers.clear();\n this.lastSync = 0;\n await this.load();\n }\n\n /**\n * Fetch and merge remote registry\n */\n private async fetchRemote(): Promise<void> {\n console.log(`Syncing registry from ${this.config.remotePath}...`);\n\n try {\n const response = await fetch(this.config.remotePath);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const registry = (await response.json()) as RegistryIndex;\n\n // Merge remote registry (remote entries are added, local overrides are kept)\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n if (!this.containers.has(id)) {\n // Only add if not already in local registry (local takes precedence)\n this.containers.set(id, metadata);\n }\n });\n\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n if (!this.verifiers.has(id)) {\n this.verifiers.set(id, metadata);\n }\n });\n\n this.lastSync = Date.now();\n console.log(`✓ Synced registry (version: ${registry.version})`);\n\n // Persist synced registry to local file for faster subsequent loads\n await this.saveLocal();\n } catch (error) {\n console.error('Failed to sync remote registry:', error);\n throw error;\n }\n }\n\n /**\n * Get container by ID\n */\n getContainer(id: string): ContainerMetadata | undefined {\n return this.containers.get(id);\n }\n\n /**\n * Get all containers\n */\n listContainers(): ContainerMetadata[] {\n return Array.from(this.containers.values()).filter((c) => c.statusCode === 'ACTIVE');\n }\n\n /**\n * Search containers by name or tag\n */\n searchContainers(query: string): ContainerMetadata[] {\n const lowerQuery = query.toLowerCase();\n return this.listContainers().filter(\n (c) =>\n c.name.toLowerCase().includes(lowerQuery) ||\n c.description?.toLowerCase().includes(lowerQuery) ||\n c.tags?.some((tag) => tag.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Get verifier by contract address\n */\n getVerifier(verifierAddress: string): VerifierMetadata | undefined {\n return this.verifiers.get(verifierAddress);\n }\n\n /**\n * Get verifier by ID\n */\n getVerifierById(id: string): VerifierMetadata | undefined {\n return Array.from(this.verifiers.values()).find((v) => v.id === id);\n }\n\n /**\n * Get all verifiers\n */\n listVerifiers(): VerifierMetadata[] {\n return Array.from(this.verifiers.values()).filter((v) => v.statusCode === 'ACTIVE');\n }\n\n /**\n * Add custom container to local registry\n */\n async addContainer(container: ContainerMetadata): Promise<void> {\n this.containers.set(container.id, container);\n await this.saveLocal();\n console.log(`✓ Added container: ${container.name} (${container.id})`);\n }\n\n /**\n * Add custom verifier to local registry\n */\n async addVerifier(verifier: VerifierMetadata): Promise<void> {\n this.verifiers.set(verifier.verifierAddress, verifier);\n await this.saveLocal();\n console.log(`✓ Added verifier: ${verifier.name} (${verifier.verifierAddress})`);\n }\n\n /**\n * Remove container from local registry\n */\n async removeContainer(id: string): Promise<void> {\n if (this.containers.delete(id)) {\n await this.saveLocal();\n console.log(`✓ Removed container: ${id}`);\n }\n }\n\n /**\n * Remove verifier from local registry\n */\n async removeVerifier(verifierAddress: string): Promise<void> {\n if (this.verifiers.delete(verifierAddress)) {\n await this.saveLocal();\n console.log(`✓ Removed verifier: ${verifierAddress}`);\n }\n }\n\n /**\n * Save local registry to disk\n */\n private async saveLocal(): Promise<void> {\n const registry: RegistryIndex = {\n containers: Object.fromEntries(this.containers),\n verifiers: Object.fromEntries(this.verifiers),\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n\n await fs.mkdir(path.dirname(this.config.localPath), { recursive: true });\n await fs.writeFile(this.config.localPath, JSON.stringify(registry, null, 2));\n }\n\n /**\n * Create default registry with example entries\n */\n private async createDefaultRegistry(): Promise<void> {\n // Create empty registry - will be populated from remote sync\n // No default containers or verifiers\n await this.saveLocal();\n console.log('✓ Created empty local registry (will sync from remote)');\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n totalContainers: number;\n activeContainers: number;\n totalVerifiers: number;\n activeVerifiers: number;\n lastSync: string;\n } {\n return {\n totalContainers: this.containers.size,\n activeContainers: this.listContainers().length,\n totalVerifiers: this.verifiers.size,\n activeVerifiers: this.listVerifiers().length,\n lastSync: this.lastSync ? new Date(this.lastSync).toISOString() : 'Never',\n };\n }\n}\n"],"mappings":"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","names":["path","fs","fetch"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/RegistryManager.ts"],"sourcesContent":["export { RegistryManager } from './RegistryManager';\nexport * from './types';\n","import fs from 'fs/promises';\nimport path from 'path';\nimport fetch from 'node-fetch';\nimport type { ContainerMetadata, DeploymentMetadata, VerifierMetadata, RegistryConfig, RegistryIndex } from './types';\n\nexport class RegistryManager {\n private containers = new Map<string, ContainerMetadata>();\n private verifiers = new Map<string, VerifierMetadata>();\n private deployments = new Map<string, DeploymentMetadata>();\n private config: Required<RegistryConfig>;\n private lastSync: number = 0;\n\n constructor(config: RegistryConfig = {}) {\n this.config = {\n localPath: config.localPath || path.join(process.cwd(), '.noosphere', 'registry.json'),\n remotePath:\n config.remotePath ||\n 'https://raw.githubusercontent.com/hpp-io/noosphere-registry/main/registry.json',\n autoSync: config.autoSync ?? true,\n cacheTTL: config.cacheTTL || 3600000, // 1 hour default\n };\n }\n\n /**\n * Load registry from local and optionally sync from remote\n * Retries if 0 containers are loaded\n */\n async load(retryCount: number = 0): Promise<void> {\n const maxRetries = 3;\n const retryDelayMs = 5000;\n\n // Load local registry\n await this.loadLocal();\n\n // Sync from remote if enabled\n if (this.config.autoSync) {\n try {\n await this.sync();\n } catch (error) {\n console.warn('Failed to sync remote registry:', error);\n console.log('Continuing with local registry only');\n }\n }\n\n // Check if we have 0 containers and should retry (only when autoSync is enabled)\n if (this.config.autoSync && this.containers.size === 0 && retryCount < maxRetries) {\n console.warn(\n `⚠️ Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`\n );\n\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, retryDelayMs));\n\n // Try force sync from remote\n try {\n await this.forceSync();\n } catch (error) {\n console.warn('Force sync failed:', error);\n }\n\n // If still 0, recurse with incremented retry count\n if (this.containers.size === 0) {\n return this.load(retryCount + 1);\n }\n }\n\n console.log(`✓ Loaded ${this.containers.size} containers, ${this.verifiers.size} verifiers, ${this.deployments.size} deployments`);\n }\n\n /**\n * Load local registry file\n */\n private async loadLocal(): Promise<void> {\n try {\n const data = await fs.readFile(this.config.localPath, 'utf-8');\n const registry: RegistryIndex = JSON.parse(data);\n\n // Load containers\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n this.containers.set(id, metadata);\n });\n\n // Load verifiers\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n this.verifiers.set(id, metadata);\n });\n\n // Load deployments\n Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {\n this.deployments.set(chainId, metadata);\n });\n\n console.log(`✓ Loaded local registry from ${this.config.localPath}`);\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n console.log('No local registry found, will create default');\n await this.createDefaultRegistry();\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Sync registry from remote GitHub repository\n */\n async sync(): Promise<void> {\n const now = Date.now();\n\n // Check cache TTL\n if (now - this.lastSync < this.config.cacheTTL) {\n console.log('Registry cache is fresh, skipping sync');\n return;\n }\n\n await this.fetchRemote();\n }\n\n /**\n * Force sync from remote, bypassing cache TTL\n */\n async forceSync(): Promise<void> {\n console.log('Force syncing registry (bypassing cache)...');\n this.lastSync = 0; // Reset cache\n await this.fetchRemote();\n }\n\n /**\n * Reload registry completely (clear and reload from local + remote)\n */\n async reload(): Promise<void> {\n console.log('Reloading registry...');\n this.containers.clear();\n this.verifiers.clear();\n this.deployments.clear();\n this.lastSync = 0;\n await this.load();\n }\n\n /**\n * Fetch and merge remote registry\n */\n private async fetchRemote(): Promise<void> {\n console.log(`Syncing registry from ${this.config.remotePath}...`);\n\n try {\n const response = await fetch(this.config.remotePath);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const registry = (await response.json()) as RegistryIndex;\n\n // Merge remote registry (remote entries are added, local overrides are kept)\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n if (!this.containers.has(id)) {\n // Only add if not already in local registry (local takes precedence)\n this.containers.set(id, metadata);\n }\n });\n\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n if (!this.verifiers.has(id)) {\n this.verifiers.set(id, metadata);\n }\n });\n\n // Deployments: remote always wins (contract addresses are authoritative)\n Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {\n this.deployments.set(chainId, metadata);\n });\n\n this.lastSync = Date.now();\n console.log(`✓ Synced registry (version: ${registry.version})`);\n\n // Persist synced registry to local file for faster subsequent loads\n await this.saveLocal();\n } catch (error) {\n console.error('Failed to sync remote registry:', error);\n throw error;\n }\n }\n\n /**\n * Get container by ID\n */\n getContainer(id: string): ContainerMetadata | undefined {\n return this.containers.get(id);\n }\n\n /**\n * Get all containers\n */\n listContainers(): ContainerMetadata[] {\n return Array.from(this.containers.values()).filter((c) => c.statusCode === 'ACTIVE');\n }\n\n /**\n * Search containers by name or tag\n */\n searchContainers(query: string): ContainerMetadata[] {\n const lowerQuery = query.toLowerCase();\n return this.listContainers().filter(\n (c) =>\n c.name.toLowerCase().includes(lowerQuery) ||\n c.description?.toLowerCase().includes(lowerQuery) ||\n c.tags?.some((tag) => tag.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Get verifier by contract address\n */\n getVerifier(verifierAddress: string): VerifierMetadata | undefined {\n return this.verifiers.get(verifierAddress);\n }\n\n /**\n * Get verifier by ID\n */\n getVerifierById(id: string): VerifierMetadata | undefined {\n return Array.from(this.verifiers.values()).find((v) => v.id === id);\n }\n\n /**\n * Get all verifiers\n */\n listVerifiers(): VerifierMetadata[] {\n return Array.from(this.verifiers.values()).filter((v) => v.statusCode === 'ACTIVE');\n }\n\n /**\n * Get deployment by chain ID\n */\n getDeployment(chainId: string): DeploymentMetadata | undefined {\n return this.deployments.get(chainId);\n }\n\n /**\n * Get all active deployments\n */\n listDeployments(): DeploymentMetadata[] {\n return Array.from(this.deployments.values()).filter((d) => d.statusCode === 'ACTIVE');\n }\n\n /**\n * Add custom container to local registry\n */\n async addContainer(container: ContainerMetadata): Promise<void> {\n this.containers.set(container.id, container);\n await this.saveLocal();\n console.log(`✓ Added container: ${container.name} (${container.id})`);\n }\n\n /**\n * Add custom verifier to local registry\n */\n async addVerifier(verifier: VerifierMetadata): Promise<void> {\n this.verifiers.set(verifier.verifierAddress, verifier);\n await this.saveLocal();\n console.log(`✓ Added verifier: ${verifier.name} (${verifier.verifierAddress})`);\n }\n\n /**\n * Remove container from local registry\n */\n async removeContainer(id: string): Promise<void> {\n if (this.containers.delete(id)) {\n await this.saveLocal();\n console.log(`✓ Removed container: ${id}`);\n }\n }\n\n /**\n * Remove verifier from local registry\n */\n async removeVerifier(verifierAddress: string): Promise<void> {\n if (this.verifiers.delete(verifierAddress)) {\n await this.saveLocal();\n console.log(`✓ Removed verifier: ${verifierAddress}`);\n }\n }\n\n /**\n * Save local registry to disk\n */\n private async saveLocal(): Promise<void> {\n const registry: RegistryIndex = {\n containers: Object.fromEntries(this.containers),\n verifiers: Object.fromEntries(this.verifiers),\n deployments: Object.fromEntries(this.deployments),\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n\n await fs.mkdir(path.dirname(this.config.localPath), { recursive: true });\n await fs.writeFile(this.config.localPath, JSON.stringify(registry, null, 2));\n }\n\n /**\n * Create default registry with example entries\n */\n private async createDefaultRegistry(): Promise<void> {\n // Create empty registry - will be populated from remote sync\n // No default containers or verifiers\n await this.saveLocal();\n console.log('✓ Created empty local registry (will sync from remote)');\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n totalContainers: number;\n activeContainers: number;\n totalVerifiers: number;\n activeVerifiers: number;\n totalDeployments: number;\n activeDeployments: number;\n lastSync: string;\n } {\n return {\n totalContainers: this.containers.size,\n activeContainers: this.listContainers().length,\n totalVerifiers: this.verifiers.size,\n activeVerifiers: this.listVerifiers().length,\n totalDeployments: this.deployments.size,\n activeDeployments: this.listDeployments().length,\n lastSync: this.lastSync ? new Date(this.lastSync).toISOString() : 'Never',\n };\n }\n}\n"],"mappings":"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","names":["path","fs","fetch"]}
package/dist/index.d.mts CHANGED
@@ -57,6 +57,17 @@ interface VerifierMetadata {
57
57
  updatedAt?: string;
58
58
  description?: string;
59
59
  }
60
+ interface DeploymentMetadata {
61
+ chainId: number;
62
+ name: string;
63
+ rpcUrl: string;
64
+ wsRpcUrl?: string;
65
+ blockExplorerUrl?: string;
66
+ contracts: Record<string, string>;
67
+ statusCode: 'ACTIVE' | 'INACTIVE' | 'DEPRECATED';
68
+ description?: string;
69
+ updatedAt?: string;
70
+ }
60
71
  interface RegistryConfig {
61
72
  localPath?: string;
62
73
  remotePath?: string;
@@ -66,6 +77,7 @@ interface RegistryConfig {
66
77
  interface RegistryIndex {
67
78
  containers: Record<string, ContainerMetadata>;
68
79
  verifiers: Record<string, VerifierMetadata>;
80
+ deployments?: Record<string, DeploymentMetadata>;
69
81
  version: string;
70
82
  updatedAt: string;
71
83
  }
@@ -73,6 +85,7 @@ interface RegistryIndex {
73
85
  declare class RegistryManager {
74
86
  private containers;
75
87
  private verifiers;
88
+ private deployments;
76
89
  private config;
77
90
  private lastSync;
78
91
  constructor(config?: RegistryConfig);
@@ -125,6 +138,14 @@ declare class RegistryManager {
125
138
  * Get all verifiers
126
139
  */
127
140
  listVerifiers(): VerifierMetadata[];
141
+ /**
142
+ * Get deployment by chain ID
143
+ */
144
+ getDeployment(chainId: string): DeploymentMetadata | undefined;
145
+ /**
146
+ * Get all active deployments
147
+ */
148
+ listDeployments(): DeploymentMetadata[];
128
149
  /**
129
150
  * Add custom container to local registry
130
151
  */
@@ -157,8 +178,10 @@ declare class RegistryManager {
157
178
  activeContainers: number;
158
179
  totalVerifiers: number;
159
180
  activeVerifiers: number;
181
+ totalDeployments: number;
182
+ activeDeployments: number;
160
183
  lastSync: string;
161
184
  };
162
185
  }
163
186
 
164
- export { type ContainerMetadata, type ProofServiceConfig, type RegistryConfig, type RegistryIndex, RegistryManager, type VerifierMetadata };
187
+ export { type ContainerMetadata, type DeploymentMetadata, type ProofServiceConfig, type RegistryConfig, type RegistryIndex, RegistryManager, type VerifierMetadata };
package/dist/index.d.ts CHANGED
@@ -57,6 +57,17 @@ interface VerifierMetadata {
57
57
  updatedAt?: string;
58
58
  description?: string;
59
59
  }
60
+ interface DeploymentMetadata {
61
+ chainId: number;
62
+ name: string;
63
+ rpcUrl: string;
64
+ wsRpcUrl?: string;
65
+ blockExplorerUrl?: string;
66
+ contracts: Record<string, string>;
67
+ statusCode: 'ACTIVE' | 'INACTIVE' | 'DEPRECATED';
68
+ description?: string;
69
+ updatedAt?: string;
70
+ }
60
71
  interface RegistryConfig {
61
72
  localPath?: string;
62
73
  remotePath?: string;
@@ -66,6 +77,7 @@ interface RegistryConfig {
66
77
  interface RegistryIndex {
67
78
  containers: Record<string, ContainerMetadata>;
68
79
  verifiers: Record<string, VerifierMetadata>;
80
+ deployments?: Record<string, DeploymentMetadata>;
69
81
  version: string;
70
82
  updatedAt: string;
71
83
  }
@@ -73,6 +85,7 @@ interface RegistryIndex {
73
85
  declare class RegistryManager {
74
86
  private containers;
75
87
  private verifiers;
88
+ private deployments;
76
89
  private config;
77
90
  private lastSync;
78
91
  constructor(config?: RegistryConfig);
@@ -125,6 +138,14 @@ declare class RegistryManager {
125
138
  * Get all verifiers
126
139
  */
127
140
  listVerifiers(): VerifierMetadata[];
141
+ /**
142
+ * Get deployment by chain ID
143
+ */
144
+ getDeployment(chainId: string): DeploymentMetadata | undefined;
145
+ /**
146
+ * Get all active deployments
147
+ */
148
+ listDeployments(): DeploymentMetadata[];
128
149
  /**
129
150
  * Add custom container to local registry
130
151
  */
@@ -157,8 +178,10 @@ declare class RegistryManager {
157
178
  activeContainers: number;
158
179
  totalVerifiers: number;
159
180
  activeVerifiers: number;
181
+ totalDeployments: number;
182
+ activeDeployments: number;
160
183
  lastSync: string;
161
184
  };
162
185
  }
163
186
 
164
- export { type ContainerMetadata, type ProofServiceConfig, type RegistryConfig, type RegistryIndex, RegistryManager, type VerifierMetadata };
187
+ export { type ContainerMetadata, type DeploymentMetadata, type ProofServiceConfig, type RegistryConfig, type RegistryIndex, RegistryManager, type VerifierMetadata };
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ var RegistryManager = class {
6
6
  constructor(config = {}) {
7
7
  this.containers = /* @__PURE__ */ new Map();
8
8
  this.verifiers = /* @__PURE__ */ new Map();
9
+ this.deployments = /* @__PURE__ */ new Map();
9
10
  this.lastSync = 0;
10
11
  this.config = {
11
12
  localPath: config.localPath || path.join(process.cwd(), ".noosphere", "registry.json"),
@@ -32,7 +33,9 @@ var RegistryManager = class {
32
33
  }
33
34
  }
34
35
  if (this.config.autoSync && this.containers.size === 0 && retryCount < maxRetries) {
35
- console.warn(`\u26A0\uFE0F Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`);
36
+ console.warn(
37
+ `\u26A0\uFE0F Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`
38
+ );
36
39
  await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
37
40
  try {
38
41
  await this.forceSync();
@@ -43,7 +46,7 @@ var RegistryManager = class {
43
46
  return this.load(retryCount + 1);
44
47
  }
45
48
  }
46
- console.log(`\u2713 Loaded ${this.containers.size} containers and ${this.verifiers.size} verifiers`);
49
+ console.log(`\u2713 Loaded ${this.containers.size} containers, ${this.verifiers.size} verifiers, ${this.deployments.size} deployments`);
47
50
  }
48
51
  /**
49
52
  * Load local registry file
@@ -58,6 +61,9 @@ var RegistryManager = class {
58
61
  Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {
59
62
  this.verifiers.set(id, metadata);
60
63
  });
64
+ Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {
65
+ this.deployments.set(chainId, metadata);
66
+ });
61
67
  console.log(`\u2713 Loaded local registry from ${this.config.localPath}`);
62
68
  } catch (error) {
63
69
  if (error.code === "ENOENT") {
@@ -94,6 +100,7 @@ var RegistryManager = class {
94
100
  console.log("Reloading registry...");
95
101
  this.containers.clear();
96
102
  this.verifiers.clear();
103
+ this.deployments.clear();
97
104
  this.lastSync = 0;
98
105
  await this.load();
99
106
  }
@@ -118,6 +125,9 @@ var RegistryManager = class {
118
125
  this.verifiers.set(id, metadata);
119
126
  }
120
127
  });
128
+ Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {
129
+ this.deployments.set(chainId, metadata);
130
+ });
121
131
  this.lastSync = Date.now();
122
132
  console.log(`\u2713 Synced registry (version: ${registry.version})`);
123
133
  await this.saveLocal();
@@ -165,6 +175,18 @@ var RegistryManager = class {
165
175
  listVerifiers() {
166
176
  return Array.from(this.verifiers.values()).filter((v) => v.statusCode === "ACTIVE");
167
177
  }
178
+ /**
179
+ * Get deployment by chain ID
180
+ */
181
+ getDeployment(chainId) {
182
+ return this.deployments.get(chainId);
183
+ }
184
+ /**
185
+ * Get all active deployments
186
+ */
187
+ listDeployments() {
188
+ return Array.from(this.deployments.values()).filter((d) => d.statusCode === "ACTIVE");
189
+ }
168
190
  /**
169
191
  * Add custom container to local registry
170
192
  */
@@ -206,6 +228,7 @@ var RegistryManager = class {
206
228
  const registry = {
207
229
  containers: Object.fromEntries(this.containers),
208
230
  verifiers: Object.fromEntries(this.verifiers),
231
+ deployments: Object.fromEntries(this.deployments),
209
232
  version: "1.0.0",
210
233
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
211
234
  };
@@ -228,6 +251,8 @@ var RegistryManager = class {
228
251
  activeContainers: this.listContainers().length,
229
252
  totalVerifiers: this.verifiers.size,
230
253
  activeVerifiers: this.listVerifiers().length,
254
+ totalDeployments: this.deployments.size,
255
+ activeDeployments: this.listDeployments().length,
231
256
  lastSync: this.lastSync ? new Date(this.lastSync).toISOString() : "Never"
232
257
  };
233
258
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RegistryManager.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport path from 'path';\nimport fetch from 'node-fetch';\nimport type { ContainerMetadata, VerifierMetadata, RegistryConfig, RegistryIndex } from './types';\n\nexport class RegistryManager {\n private containers = new Map<string, ContainerMetadata>();\n private verifiers = new Map<string, VerifierMetadata>();\n private config: Required<RegistryConfig>;\n private lastSync: number = 0;\n\n constructor(config: RegistryConfig = {}) {\n this.config = {\n localPath: config.localPath || path.join(process.cwd(), '.noosphere', 'registry.json'),\n remotePath:\n config.remotePath ||\n 'https://raw.githubusercontent.com/hpp-io/noosphere-registry/main/registry.json',\n autoSync: config.autoSync ?? true,\n cacheTTL: config.cacheTTL || 3600000, // 1 hour default\n };\n }\n\n /**\n * Load registry from local and optionally sync from remote\n * Retries if 0 containers are loaded\n */\n async load(retryCount: number = 0): Promise<void> {\n const maxRetries = 3;\n const retryDelayMs = 5000;\n\n // Load local registry\n await this.loadLocal();\n\n // Sync from remote if enabled\n if (this.config.autoSync) {\n try {\n await this.sync();\n } catch (error) {\n console.warn('Failed to sync remote registry:', error);\n console.log('Continuing with local registry only');\n }\n }\n\n // Check if we have 0 containers and should retry (only when autoSync is enabled)\n if (this.config.autoSync && this.containers.size === 0 && retryCount < maxRetries) {\n console.warn(`⚠️ Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`);\n\n // Wait before retry\n await new Promise(resolve => setTimeout(resolve, retryDelayMs));\n\n // Try force sync from remote\n try {\n await this.forceSync();\n } catch (error) {\n console.warn('Force sync failed:', error);\n }\n\n // If still 0, recurse with incremented retry count\n if (this.containers.size === 0) {\n return this.load(retryCount + 1);\n }\n }\n\n console.log(`✓ Loaded ${this.containers.size} containers and ${this.verifiers.size} verifiers`);\n }\n\n /**\n * Load local registry file\n */\n private async loadLocal(): Promise<void> {\n try {\n const data = await fs.readFile(this.config.localPath, 'utf-8');\n const registry: RegistryIndex = JSON.parse(data);\n\n // Load containers\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n this.containers.set(id, metadata);\n });\n\n // Load verifiers\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n this.verifiers.set(id, metadata);\n });\n\n console.log(`✓ Loaded local registry from ${this.config.localPath}`);\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n console.log('No local registry found, will create default');\n await this.createDefaultRegistry();\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Sync registry from remote GitHub repository\n */\n async sync(): Promise<void> {\n const now = Date.now();\n\n // Check cache TTL\n if (now - this.lastSync < this.config.cacheTTL) {\n console.log('Registry cache is fresh, skipping sync');\n return;\n }\n\n await this.fetchRemote();\n }\n\n /**\n * Force sync from remote, bypassing cache TTL\n */\n async forceSync(): Promise<void> {\n console.log('Force syncing registry (bypassing cache)...');\n this.lastSync = 0; // Reset cache\n await this.fetchRemote();\n }\n\n /**\n * Reload registry completely (clear and reload from local + remote)\n */\n async reload(): Promise<void> {\n console.log('Reloading registry...');\n this.containers.clear();\n this.verifiers.clear();\n this.lastSync = 0;\n await this.load();\n }\n\n /**\n * Fetch and merge remote registry\n */\n private async fetchRemote(): Promise<void> {\n console.log(`Syncing registry from ${this.config.remotePath}...`);\n\n try {\n const response = await fetch(this.config.remotePath);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const registry = (await response.json()) as RegistryIndex;\n\n // Merge remote registry (remote entries are added, local overrides are kept)\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n if (!this.containers.has(id)) {\n // Only add if not already in local registry (local takes precedence)\n this.containers.set(id, metadata);\n }\n });\n\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n if (!this.verifiers.has(id)) {\n this.verifiers.set(id, metadata);\n }\n });\n\n this.lastSync = Date.now();\n console.log(`✓ Synced registry (version: ${registry.version})`);\n\n // Persist synced registry to local file for faster subsequent loads\n await this.saveLocal();\n } catch (error) {\n console.error('Failed to sync remote registry:', error);\n throw error;\n }\n }\n\n /**\n * Get container by ID\n */\n getContainer(id: string): ContainerMetadata | undefined {\n return this.containers.get(id);\n }\n\n /**\n * Get all containers\n */\n listContainers(): ContainerMetadata[] {\n return Array.from(this.containers.values()).filter((c) => c.statusCode === 'ACTIVE');\n }\n\n /**\n * Search containers by name or tag\n */\n searchContainers(query: string): ContainerMetadata[] {\n const lowerQuery = query.toLowerCase();\n return this.listContainers().filter(\n (c) =>\n c.name.toLowerCase().includes(lowerQuery) ||\n c.description?.toLowerCase().includes(lowerQuery) ||\n c.tags?.some((tag) => tag.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Get verifier by contract address\n */\n getVerifier(verifierAddress: string): VerifierMetadata | undefined {\n return this.verifiers.get(verifierAddress);\n }\n\n /**\n * Get verifier by ID\n */\n getVerifierById(id: string): VerifierMetadata | undefined {\n return Array.from(this.verifiers.values()).find((v) => v.id === id);\n }\n\n /**\n * Get all verifiers\n */\n listVerifiers(): VerifierMetadata[] {\n return Array.from(this.verifiers.values()).filter((v) => v.statusCode === 'ACTIVE');\n }\n\n /**\n * Add custom container to local registry\n */\n async addContainer(container: ContainerMetadata): Promise<void> {\n this.containers.set(container.id, container);\n await this.saveLocal();\n console.log(`✓ Added container: ${container.name} (${container.id})`);\n }\n\n /**\n * Add custom verifier to local registry\n */\n async addVerifier(verifier: VerifierMetadata): Promise<void> {\n this.verifiers.set(verifier.verifierAddress, verifier);\n await this.saveLocal();\n console.log(`✓ Added verifier: ${verifier.name} (${verifier.verifierAddress})`);\n }\n\n /**\n * Remove container from local registry\n */\n async removeContainer(id: string): Promise<void> {\n if (this.containers.delete(id)) {\n await this.saveLocal();\n console.log(`✓ Removed container: ${id}`);\n }\n }\n\n /**\n * Remove verifier from local registry\n */\n async removeVerifier(verifierAddress: string): Promise<void> {\n if (this.verifiers.delete(verifierAddress)) {\n await this.saveLocal();\n console.log(`✓ Removed verifier: ${verifierAddress}`);\n }\n }\n\n /**\n * Save local registry to disk\n */\n private async saveLocal(): Promise<void> {\n const registry: RegistryIndex = {\n containers: Object.fromEntries(this.containers),\n verifiers: Object.fromEntries(this.verifiers),\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n\n await fs.mkdir(path.dirname(this.config.localPath), { recursive: true });\n await fs.writeFile(this.config.localPath, JSON.stringify(registry, null, 2));\n }\n\n /**\n * Create default registry with example entries\n */\n private async createDefaultRegistry(): Promise<void> {\n // Create empty registry - will be populated from remote sync\n // No default containers or verifiers\n await this.saveLocal();\n console.log('✓ Created empty local registry (will sync from remote)');\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n totalContainers: number;\n activeContainers: number;\n totalVerifiers: number;\n activeVerifiers: number;\n lastSync: string;\n } {\n return {\n totalContainers: this.containers.size,\n activeContainers: this.listContainers().length,\n totalVerifiers: this.verifiers.size,\n activeVerifiers: this.listVerifiers().length,\n lastSync: this.lastSync ? new Date(this.lastSync).toISOString() : 'Never',\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/RegistryManager.ts"],"sourcesContent":["import fs from 'fs/promises';\nimport path from 'path';\nimport fetch from 'node-fetch';\nimport type { ContainerMetadata, DeploymentMetadata, VerifierMetadata, RegistryConfig, RegistryIndex } from './types';\n\nexport class RegistryManager {\n private containers = new Map<string, ContainerMetadata>();\n private verifiers = new Map<string, VerifierMetadata>();\n private deployments = new Map<string, DeploymentMetadata>();\n private config: Required<RegistryConfig>;\n private lastSync: number = 0;\n\n constructor(config: RegistryConfig = {}) {\n this.config = {\n localPath: config.localPath || path.join(process.cwd(), '.noosphere', 'registry.json'),\n remotePath:\n config.remotePath ||\n 'https://raw.githubusercontent.com/hpp-io/noosphere-registry/main/registry.json',\n autoSync: config.autoSync ?? true,\n cacheTTL: config.cacheTTL || 3600000, // 1 hour default\n };\n }\n\n /**\n * Load registry from local and optionally sync from remote\n * Retries if 0 containers are loaded\n */\n async load(retryCount: number = 0): Promise<void> {\n const maxRetries = 3;\n const retryDelayMs = 5000;\n\n // Load local registry\n await this.loadLocal();\n\n // Sync from remote if enabled\n if (this.config.autoSync) {\n try {\n await this.sync();\n } catch (error) {\n console.warn('Failed to sync remote registry:', error);\n console.log('Continuing with local registry only');\n }\n }\n\n // Check if we have 0 containers and should retry (only when autoSync is enabled)\n if (this.config.autoSync && this.containers.size === 0 && retryCount < maxRetries) {\n console.warn(\n `⚠️ Loaded 0 containers, attempting recovery (attempt ${retryCount + 1}/${maxRetries})...`\n );\n\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, retryDelayMs));\n\n // Try force sync from remote\n try {\n await this.forceSync();\n } catch (error) {\n console.warn('Force sync failed:', error);\n }\n\n // If still 0, recurse with incremented retry count\n if (this.containers.size === 0) {\n return this.load(retryCount + 1);\n }\n }\n\n console.log(`✓ Loaded ${this.containers.size} containers, ${this.verifiers.size} verifiers, ${this.deployments.size} deployments`);\n }\n\n /**\n * Load local registry file\n */\n private async loadLocal(): Promise<void> {\n try {\n const data = await fs.readFile(this.config.localPath, 'utf-8');\n const registry: RegistryIndex = JSON.parse(data);\n\n // Load containers\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n this.containers.set(id, metadata);\n });\n\n // Load verifiers\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n this.verifiers.set(id, metadata);\n });\n\n // Load deployments\n Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {\n this.deployments.set(chainId, metadata);\n });\n\n console.log(`✓ Loaded local registry from ${this.config.localPath}`);\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n console.log('No local registry found, will create default');\n await this.createDefaultRegistry();\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Sync registry from remote GitHub repository\n */\n async sync(): Promise<void> {\n const now = Date.now();\n\n // Check cache TTL\n if (now - this.lastSync < this.config.cacheTTL) {\n console.log('Registry cache is fresh, skipping sync');\n return;\n }\n\n await this.fetchRemote();\n }\n\n /**\n * Force sync from remote, bypassing cache TTL\n */\n async forceSync(): Promise<void> {\n console.log('Force syncing registry (bypassing cache)...');\n this.lastSync = 0; // Reset cache\n await this.fetchRemote();\n }\n\n /**\n * Reload registry completely (clear and reload from local + remote)\n */\n async reload(): Promise<void> {\n console.log('Reloading registry...');\n this.containers.clear();\n this.verifiers.clear();\n this.deployments.clear();\n this.lastSync = 0;\n await this.load();\n }\n\n /**\n * Fetch and merge remote registry\n */\n private async fetchRemote(): Promise<void> {\n console.log(`Syncing registry from ${this.config.remotePath}...`);\n\n try {\n const response = await fetch(this.config.remotePath);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const registry = (await response.json()) as RegistryIndex;\n\n // Merge remote registry (remote entries are added, local overrides are kept)\n Object.entries(registry.containers || {}).forEach(([id, metadata]) => {\n if (!this.containers.has(id)) {\n // Only add if not already in local registry (local takes precedence)\n this.containers.set(id, metadata);\n }\n });\n\n Object.entries(registry.verifiers || {}).forEach(([id, metadata]) => {\n if (!this.verifiers.has(id)) {\n this.verifiers.set(id, metadata);\n }\n });\n\n // Deployments: remote always wins (contract addresses are authoritative)\n Object.entries(registry.deployments || {}).forEach(([chainId, metadata]) => {\n this.deployments.set(chainId, metadata);\n });\n\n this.lastSync = Date.now();\n console.log(`✓ Synced registry (version: ${registry.version})`);\n\n // Persist synced registry to local file for faster subsequent loads\n await this.saveLocal();\n } catch (error) {\n console.error('Failed to sync remote registry:', error);\n throw error;\n }\n }\n\n /**\n * Get container by ID\n */\n getContainer(id: string): ContainerMetadata | undefined {\n return this.containers.get(id);\n }\n\n /**\n * Get all containers\n */\n listContainers(): ContainerMetadata[] {\n return Array.from(this.containers.values()).filter((c) => c.statusCode === 'ACTIVE');\n }\n\n /**\n * Search containers by name or tag\n */\n searchContainers(query: string): ContainerMetadata[] {\n const lowerQuery = query.toLowerCase();\n return this.listContainers().filter(\n (c) =>\n c.name.toLowerCase().includes(lowerQuery) ||\n c.description?.toLowerCase().includes(lowerQuery) ||\n c.tags?.some((tag) => tag.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Get verifier by contract address\n */\n getVerifier(verifierAddress: string): VerifierMetadata | undefined {\n return this.verifiers.get(verifierAddress);\n }\n\n /**\n * Get verifier by ID\n */\n getVerifierById(id: string): VerifierMetadata | undefined {\n return Array.from(this.verifiers.values()).find((v) => v.id === id);\n }\n\n /**\n * Get all verifiers\n */\n listVerifiers(): VerifierMetadata[] {\n return Array.from(this.verifiers.values()).filter((v) => v.statusCode === 'ACTIVE');\n }\n\n /**\n * Get deployment by chain ID\n */\n getDeployment(chainId: string): DeploymentMetadata | undefined {\n return this.deployments.get(chainId);\n }\n\n /**\n * Get all active deployments\n */\n listDeployments(): DeploymentMetadata[] {\n return Array.from(this.deployments.values()).filter((d) => d.statusCode === 'ACTIVE');\n }\n\n /**\n * Add custom container to local registry\n */\n async addContainer(container: ContainerMetadata): Promise<void> {\n this.containers.set(container.id, container);\n await this.saveLocal();\n console.log(`✓ Added container: ${container.name} (${container.id})`);\n }\n\n /**\n * Add custom verifier to local registry\n */\n async addVerifier(verifier: VerifierMetadata): Promise<void> {\n this.verifiers.set(verifier.verifierAddress, verifier);\n await this.saveLocal();\n console.log(`✓ Added verifier: ${verifier.name} (${verifier.verifierAddress})`);\n }\n\n /**\n * Remove container from local registry\n */\n async removeContainer(id: string): Promise<void> {\n if (this.containers.delete(id)) {\n await this.saveLocal();\n console.log(`✓ Removed container: ${id}`);\n }\n }\n\n /**\n * Remove verifier from local registry\n */\n async removeVerifier(verifierAddress: string): Promise<void> {\n if (this.verifiers.delete(verifierAddress)) {\n await this.saveLocal();\n console.log(`✓ Removed verifier: ${verifierAddress}`);\n }\n }\n\n /**\n * Save local registry to disk\n */\n private async saveLocal(): Promise<void> {\n const registry: RegistryIndex = {\n containers: Object.fromEntries(this.containers),\n verifiers: Object.fromEntries(this.verifiers),\n deployments: Object.fromEntries(this.deployments),\n version: '1.0.0',\n updatedAt: new Date().toISOString(),\n };\n\n await fs.mkdir(path.dirname(this.config.localPath), { recursive: true });\n await fs.writeFile(this.config.localPath, JSON.stringify(registry, null, 2));\n }\n\n /**\n * Create default registry with example entries\n */\n private async createDefaultRegistry(): Promise<void> {\n // Create empty registry - will be populated from remote sync\n // No default containers or verifiers\n await this.saveLocal();\n console.log('✓ Created empty local registry (will sync from remote)');\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n totalContainers: number;\n activeContainers: number;\n totalVerifiers: number;\n activeVerifiers: number;\n totalDeployments: number;\n activeDeployments: number;\n lastSync: string;\n } {\n return {\n totalContainers: this.containers.size,\n activeContainers: this.listContainers().length,\n totalVerifiers: this.verifiers.size,\n activeVerifiers: this.listVerifiers().length,\n totalDeployments: this.deployments.size,\n activeDeployments: this.listDeployments().length,\n lastSync: this.lastSync ? new Date(this.lastSync).toISOString() : 'Never',\n };\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noosphere/registry",
3
- "version": "0.2.0-alpha.1",
3
+ "version": "0.2.2-alpha.1",
4
4
  "description": "Container and Verifier registry for Noosphere SDK",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -21,9 +21,9 @@
21
21
  "dist"
22
22
  ],
23
23
  "scripts": {
24
- "build": "tsup",
25
- "test": "jest",
26
- "test:watch": "jest --watch",
24
+ "build": "npx tsup",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
27
  "clean": "rm -rf dist",
28
28
  "prepublishOnly": "npm run build"
29
29
  },
@@ -51,10 +51,9 @@
51
51
  "node-fetch": "^3.3.2"
52
52
  },
53
53
  "devDependencies": {
54
- "@types/jest": "^29.5.0",
55
54
  "@types/node": "^20.10.0",
56
- "jest": "^29.7.0",
57
- "ts-jest": "^29.1.0",
58
- "typescript": "^5.3.0"
55
+ "tsup": "^8.0.0",
56
+ "typescript": "^5.3.0",
57
+ "vitest": "^4.0.16"
59
58
  }
60
59
  }