@hivemind-os/collective-daemon 0.2.0 → 0.2.2
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/{chunk-CJHYQ7RR.js → chunk-VGVQWRGO.js} +18 -8
- package/dist/chunk-VGVQWRGO.js.map +1 -0
- package/dist/{chunk-VHECO532.js → chunk-Y62YXMRX.js} +2 -2
- package/dist/config.js +1 -1
- package/dist/index.js +2 -2
- package/dist/portal/server.js +2 -2
- package/package.json +5 -5
- package/dist/chunk-CJHYQ7RR.js.map +0 -1
- /package/dist/{chunk-VHECO532.js.map → chunk-Y62YXMRX.js.map} +0 -0
|
@@ -274,26 +274,36 @@ function mergeConfig(defaults, parsed) {
|
|
|
274
274
|
}
|
|
275
275
|
function applyEnvironmentOverrides(config, options = { hasExplicitIpcPath: false }) {
|
|
276
276
|
const envDataDir = getEnvDataDir();
|
|
277
|
+
const envIpcPath = process.env.COLLECTIVE_IPC_PATH;
|
|
278
|
+
const envPidFile = process.env.COLLECTIVE_PID_FILE;
|
|
277
279
|
const withDataDir = envDataDir ? {
|
|
278
280
|
...config,
|
|
279
281
|
identity: { dataDir: join(envDataDir, "identity") },
|
|
280
282
|
daemon: {
|
|
281
283
|
...config.daemon,
|
|
282
284
|
dataDir: envDataDir,
|
|
283
|
-
pidFile: join(envDataDir, "daemon.pid"),
|
|
284
|
-
ipcPath: options.hasExplicitIpcPath ? config.daemon.ipcPath : getDefaultIpcPath(envDataDir)
|
|
285
|
+
pidFile: envPidFile ?? join(envDataDir, "daemon.pid"),
|
|
286
|
+
ipcPath: envIpcPath ?? (options.hasExplicitIpcPath ? config.daemon.ipcPath : getDefaultIpcPath(envDataDir))
|
|
285
287
|
},
|
|
286
288
|
blobstore: applyBlobStoreDataDirOverride(config.blobstore, join(envDataDir, "blobs"))
|
|
287
289
|
} : config;
|
|
288
|
-
|
|
290
|
+
const withEnvOverrides = {
|
|
289
291
|
...withDataDir,
|
|
292
|
+
daemon: {
|
|
293
|
+
...withDataDir.daemon,
|
|
294
|
+
...envIpcPath && !envDataDir ? { ipcPath: envIpcPath } : {},
|
|
295
|
+
...envPidFile && !envDataDir ? { pidFile: envPidFile } : {}
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
return {
|
|
299
|
+
...withEnvOverrides,
|
|
290
300
|
network: {
|
|
291
|
-
...
|
|
292
|
-
...resolveNetworkEnvOverrides(
|
|
301
|
+
...withEnvOverrides.network,
|
|
302
|
+
...resolveNetworkEnvOverrides(withEnvOverrides.network)
|
|
293
303
|
},
|
|
294
304
|
daemon: {
|
|
295
|
-
...
|
|
296
|
-
logLevel: normalizeLogLevel(process.env.COLLECTIVE_LOG_LEVEL,
|
|
305
|
+
...withEnvOverrides.daemon,
|
|
306
|
+
logLevel: normalizeLogLevel(process.env.COLLECTIVE_LOG_LEVEL, withEnvOverrides.daemon.logLevel)
|
|
297
307
|
}
|
|
298
308
|
};
|
|
299
309
|
}
|
|
@@ -653,4 +663,4 @@ export {
|
|
|
653
663
|
loadConfig,
|
|
654
664
|
saveConfig
|
|
655
665
|
};
|
|
656
|
-
//# sourceMappingURL=chunk-
|
|
666
|
+
//# sourceMappingURL=chunk-VGVQWRGO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as fsPromises from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, extname, join, resolve } from 'node:path';\nimport { isDeepStrictEqual } from 'node:util';\n\nimport {\n PaymentRail,\n NETWORK_PRESETS,\n getNetworkPreset,\n type AuthConfig,\n type BlobStoreConfig,\n type EncryptionConfig,\n type NetworkConfig,\n type NetworkName,\n type PaymentConfig,\n type SpendingLimit,\n type SpendingPolicy,\n} from '@hivemind-os/collective-types';\nimport yaml from 'js-yaml';\n\nimport { getDefaultIpcPath } from './ipc/pipe-security.js';\n\nexport interface DaemonPerAppSpendingConfig {\n limits: SpendingLimit[];\n}\n\nexport interface DaemonSpendingPolicy extends SpendingPolicy {\n perApp?: Record<string, DaemonPerAppSpendingConfig>;\n}\n\nexport interface DaemonFullConfig {\n network: NetworkConfig;\n identity: {\n dataDir: string;\n };\n auth: AuthConfig;\n spending: DaemonSpendingPolicy;\n payment: PaymentConfig;\n daemon: {\n ipcPath: string;\n dataDir: string;\n pidFile: string;\n logLevel: 'debug' | 'info' | 'warn' | 'error';\n logFile?: string;\n };\n relay: {\n enabled: boolean;\n endpoints: Array<{\n url: string;\n relayDid?: string;\n }>;\n autoConnect: boolean;\n providerMode: boolean;\n reconnectIntervalMs?: number;\n heartbeatIntervalMs?: number;\n };\n blobstore: BlobStoreConfig;\n encryption: EncryptionConfig;\n provider?: {\n enabled: boolean;\n capabilities: Array<{\n name: string;\n description: string;\n version: string;\n priceMist: number;\n currency?: string;\n adapter: string;\n adapterConfig?: Record<string, unknown>;\n }>;\n maxConcurrency?: number;\n autoRegister?: boolean;\n };\n}\n\ntype LooseRecord = Record<string, unknown>;\ninterface ConfigDiff {\n path: string[];\n value?: unknown;\n delete?: true;\n}\n\nconst LOG_LEVELS = new Set<DaemonFullConfig['daemon']['logLevel']>(['debug', 'info', 'warn', 'error']);\nconst configSaveLocks = new Map<string, Promise<void>>();\nexport const configIo = {\n mkdir: fsPromises.mkdir,\n writeFile: fsPromises.writeFile,\n rename: fsPromises.rename,\n rm: fsPromises.rm,\n};\n\nexport function getDefaultConfig(): DaemonFullConfig {\n return buildDefaultConfig(resolve(homedir(), '.hivemind-os/collective'));\n}\n\nexport function getConfigPath(configPath?: string): string {\n return resolve(expandHome(configPath ?? join(getEnvDataDir() ?? resolve(homedir(), '.hivemind-os/collective'), 'config.yaml')));\n}\n\nexport { getDefaultIpcPath };\n\nexport function loadConfig(configPath?: string): DaemonFullConfig {\n const resolvedConfigPath = getConfigPath(configPath);\n\n const parsed = loadConfigFile(resolvedConfigPath);\n const config = buildResolvedConfig(parsed);\n validateConfig(config);\n\n if (!fs.existsSync(resolvedConfigPath)) {\n fs.mkdirSync(dirname(resolvedConfigPath), { recursive: true, mode: 0o700 });\n writePrivateConfigFile(resolvedConfigPath, formatConfigContents(serializeConfig(config), resolvedConfigPath));\n } else {\n enforcePrivateFilePermissions(resolvedConfigPath);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: DaemonFullConfig, configPath = getConfigPath()): Promise<string> {\n const resolvedConfigPath = getConfigPath(configPath);\n validateConfig(config);\n\n await withConfigSaveLock(resolvedConfigPath, async () => {\n const parsed = loadConfigFile(resolvedConfigPath);\n const currentConfig = buildResolvedConfig(parsed);\n const updates = collectConfigDiffs(serializeConfig(currentConfig), serializeConfig(config));\n const nextParsed = applyConfigDiffs(parsed, updates);\n await writePrivateConfigFileAtomic(\n resolvedConfigPath,\n formatConfigContents(nextParsed, resolvedConfigPath),\n );\n });\n\n return resolvedConfigPath;\n}\n\nfunction writePrivateConfigFile(configPath: string, contents: string): void {\n fs.writeFileSync(configPath, contents, { encoding: 'utf8', mode: 0o600 });\n enforcePrivateFilePermissions(configPath);\n}\n\nasync function writePrivateConfigFileAtomic(configPath: string, contents: string): Promise<void> {\n const tempPath = `${configPath}.${process.pid}.${randomUUID()}.tmp`;\n await configIo.mkdir(dirname(configPath), { recursive: true, mode: 0o700 });\n\n try {\n await configIo.writeFile(tempPath, contents, { encoding: 'utf8', mode: 0o600 });\n await configIo.rename(tempPath, configPath);\n enforcePrivateFilePermissions(configPath);\n } finally {\n await configIo.rm(tempPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction enforcePrivateFilePermissions(path: string): void {\n fs.chmodSync(path, 0o600);\n}\n\nfunction loadConfigFile(configPath: string): LooseRecord {\n if (!fs.existsSync(configPath)) {\n return {};\n }\n\n const loaded = yaml.load(fs.readFileSync(configPath, 'utf8'));\n return isRecord(loaded) ? loaded : {};\n}\n\nfunction buildResolvedConfig(parsed: LooseRecord): DaemonFullConfig {\n const baseDataDir = normalizePath(\n getEnvDataDir() ?? readString(getNestedValue(parsed, 'daemon', 'dataDir')) ?? resolve(homedir(), '.hivemind-os/collective'),\n );\n const hasExplicitIpcPath = readString(getNestedValue(parsed, 'daemon', 'ipcPath')) !== undefined;\n\n return applyEnvironmentOverrides(mergeConfig(buildDefaultConfig(baseDataDir), parsed), { hasExplicitIpcPath });\n}\n\nasync function withConfigSaveLock<T>(configPath: string, operation: () => Promise<T>): Promise<T> {\n const previous = configSaveLocks.get(configPath) ?? Promise.resolve();\n let release!: () => void;\n const gate = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chain = previous.catch(() => undefined).then(() => gate);\n configSaveLocks.set(configPath, chain);\n\n await previous.catch(() => undefined);\n\n try {\n return await operation();\n } finally {\n release();\n if (configSaveLocks.get(configPath) === chain) {\n configSaveLocks.delete(configPath);\n }\n }\n}\n\nfunction collectConfigDiffs(current: unknown, next: unknown, path: string[] = []): ConfigDiff[] {\n if (isRecord(current) && isRecord(next)) {\n const diffs: ConfigDiff[] = [];\n const keys = new Set([...Object.keys(current), ...Object.keys(next)]);\n\n for (const key of keys) {\n const hasCurrent = Object.hasOwn(current, key);\n const hasNext = Object.hasOwn(next, key);\n if (!hasNext) {\n diffs.push({ path: [...path, key], delete: true });\n continue;\n }\n\n if (!hasCurrent) {\n diffs.push({ path: [...path, key], value: structuredClone(next[key]) });\n continue;\n }\n\n diffs.push(...collectConfigDiffs(current[key], next[key], [...path, key]));\n }\n\n return diffs;\n }\n\n return isDeepStrictEqual(current, next) ? [] : [{ path, value: structuredClone(next) }];\n}\n\nfunction applyConfigDiffs(parsed: LooseRecord, diffs: ConfigDiff[]): LooseRecord {\n const next = structuredClone(parsed);\n\n for (const diff of diffs) {\n if (diff.path.length === 0) {\n return isRecord(diff.value) ? structuredClone(diff.value) : {};\n }\n\n if (diff.delete) {\n deleteNestedValue(next, diff.path);\n continue;\n }\n\n setNestedValue(next, diff.path, structuredClone(diff.value));\n }\n\n return next;\n}\n\nfunction setNestedValue(record: LooseRecord, path: string[], value: unknown): void {\n let current = record;\n for (const segment of path.slice(0, -1)) {\n const next = current[segment];\n if (!isRecord(next)) {\n current[segment] = {};\n }\n current = current[segment] as LooseRecord;\n }\n\n current[path[path.length - 1] as string] = value;\n}\n\nfunction deleteNestedValue(record: LooseRecord, path: string[]): void {\n const parents: Array<{ record: LooseRecord; key: string }> = [];\n let current: LooseRecord | undefined = record;\n\n for (const segment of path.slice(0, -1)) {\n if (!current || !isRecord(current[segment])) {\n return;\n }\n\n parents.push({ record: current, key: segment });\n current = current[segment] as LooseRecord;\n }\n\n if (!current) {\n return;\n }\n\n delete current[path[path.length - 1] as string];\n\n for (let index = parents.length - 1; index >= 0; index -= 1) {\n const parent = parents[index];\n const child = parent.record[parent.key];\n if (!isRecord(child) || Object.keys(child).length > 0) {\n break;\n }\n\n delete parent.record[parent.key];\n }\n}\n\nfunction formatConfigContents(config: LooseRecord, configPath: string): string {\n if (extname(configPath).toLowerCase() === '.json') {\n return `${JSON.stringify(config, null, 2)}\\n`;\n }\n\n return yaml.dump(config, { lineWidth: 120 });\n}\n\nfunction buildDefaultConfig(dataDir: string): DaemonFullConfig {\n const resolvedDataDir = normalizePath(dataDir);\n const defaultNetwork = NETWORK_PRESETS.testnet;\n\n return {\n network: {\n rpcUrl: defaultNetwork.rpcUrl,\n faucetUrl: defaultNetwork.faucetUrl,\n packageId: defaultNetwork.packageId,\n registryId: defaultNetwork.registryId,\n },\n identity: {\n dataDir: join(resolvedDataDir, 'identity'),\n },\n auth: {\n mode: 'ed25519',\n portal: {\n port: 19876,\n },\n },\n spending: {\n defaultRail: PaymentRail.SUI_ESCROW,\n limits: [{ amount: 1_000_000_000n, interval: 'day', currency: 'MIST' }],\n },\n payment: {\n preferredRail: 'auto',\n evm: {\n enabled: false,\n network: 'base',\n },\n },\n daemon: {\n ipcPath: getDefaultIpcPath(resolvedDataDir),\n dataDir: resolvedDataDir,\n pidFile: join(resolvedDataDir, 'daemon.pid'),\n logLevel: 'info',\n },\n relay: {\n enabled: false,\n endpoints: [],\n autoConnect: true,\n providerMode: false,\n reconnectIntervalMs: 5_000,\n heartbeatIntervalMs: 30_000,\n },\n blobstore: {\n mode: 'filesystem',\n filesystem: {\n dataDir: join(resolvedDataDir, 'blobs'),\n },\n },\n encryption: {\n enabled: true,\n requireEncryption: false,\n },\n };\n}\n\nfunction mergeConfig(defaults: DaemonFullConfig, parsed: LooseRecord): DaemonFullConfig {\n const network = isRecord(parsed.network) ? parsed.network : {};\n const identity = isRecord(parsed.identity) ? parsed.identity : {};\n const auth = isRecord(parsed.auth) ? parsed.auth : {};\n const payment = isRecord(parsed.payment) ? parsed.payment : {};\n const daemon = isRecord(parsed.daemon) ? parsed.daemon : {};\n const relay = isRecord(parsed.relay) ? parsed.relay : {};\n const blobstore = isRecord(parsed.blobstore) ? parsed.blobstore : {};\n const encryption = isRecord(parsed.encryption) ? parsed.encryption : {};\n const provider = isRecord(parsed.provider) ? parsed.provider : undefined;\n\n return {\n network: {\n ...resolveNetworkFromConfig(network, defaults.network),\n },\n identity: {\n dataDir: normalizePath(readString(identity.dataDir) ?? defaults.identity.dataDir),\n },\n auth: normalizeAuthConfig(auth, defaults.auth),\n spending: normalizeSpendingPolicy(parsed.spending, defaults.spending),\n payment: normalizePaymentConfig(payment, defaults.payment),\n daemon: {\n ipcPath: readString(daemon.ipcPath) ?? defaults.daemon.ipcPath,\n dataDir: normalizePath(readString(daemon.dataDir) ?? defaults.daemon.dataDir),\n pidFile: normalizePath(readString(daemon.pidFile) ?? defaults.daemon.pidFile),\n logLevel: normalizeLogLevel(daemon.logLevel, defaults.daemon.logLevel),\n logFile: readString(daemon.logFile) ? normalizePath(readString(daemon.logFile) as string) : undefined,\n },\n relay: normalizeRelayConfig(relay, defaults.relay),\n blobstore: normalizeBlobStoreConfig(blobstore, defaults.blobstore),\n encryption: normalizeEncryptionConfig(encryption, defaults.encryption),\n provider: normalizeProviderConfig(provider),\n };\n}\n\nfunction applyEnvironmentOverrides(\n config: DaemonFullConfig,\n options: { hasExplicitIpcPath: boolean } = { hasExplicitIpcPath: false },\n): DaemonFullConfig {\n const envDataDir = getEnvDataDir();\n const envIpcPath = process.env.COLLECTIVE_IPC_PATH;\n const envPidFile = process.env.COLLECTIVE_PID_FILE;\n const withDataDir = envDataDir\n ? {\n ...config,\n identity: { dataDir: join(envDataDir, 'identity') },\n daemon: {\n ...config.daemon,\n dataDir: envDataDir,\n pidFile: envPidFile ?? join(envDataDir, 'daemon.pid'),\n ipcPath: envIpcPath ?? (options.hasExplicitIpcPath ? config.daemon.ipcPath : getDefaultIpcPath(envDataDir)),\n },\n blobstore: applyBlobStoreDataDirOverride(config.blobstore, join(envDataDir, 'blobs')),\n }\n : config;\n\n const withEnvOverrides = {\n ...withDataDir,\n daemon: {\n ...withDataDir.daemon,\n ...(envIpcPath && !envDataDir ? { ipcPath: envIpcPath } : {}),\n ...(envPidFile && !envDataDir ? { pidFile: envPidFile } : {}),\n },\n };\n\n return {\n ...withEnvOverrides,\n network: {\n ...withEnvOverrides.network,\n ...resolveNetworkEnvOverrides(withEnvOverrides.network),\n },\n daemon: {\n ...withEnvOverrides.daemon,\n logLevel: normalizeLogLevel(process.env.COLLECTIVE_LOG_LEVEL, withEnvOverrides.daemon.logLevel),\n },\n };\n}\n\nfunction resolveNetworkEnvOverrides(base: NetworkConfig): Partial<NetworkConfig> {\n // COLLECTIVE_NETWORK=testnet|mainnet|devnet|local applies a full preset\n const networkName = process.env.COLLECTIVE_NETWORK as NetworkName | undefined;\n const preset = networkName ? getNetworkPreset(networkName) : undefined;\n const merged = preset ? { ...base, ...preset } : base;\n\n // Individual env vars override the preset\n return {\n rpcUrl: process.env.COLLECTIVE_RPC_URL ?? merged.rpcUrl,\n faucetUrl: merged.faucetUrl,\n packageId: process.env.COLLECTIVE_PACKAGE_ID ?? merged.packageId,\n registryId: process.env.COLLECTIVE_REGISTRY_ID ?? merged.registryId,\n };\n}\n\nfunction normalizeAuthConfig(value: LooseRecord, defaults: AuthConfig): AuthConfig {\n const google = isRecord(value.google) ? value.google : {};\n const apple = isRecord(value.apple) ? value.apple : {};\n const portal = isRecord(value.portal) ? value.portal : {};\n\n return {\n mode: value.mode === 'zklogin' ? 'zklogin' : defaults.mode,\n google: readString(google.clientId)\n ? {\n clientId: readString(google.clientId) as string,\n }\n : defaults.google,\n apple: readString(apple.clientId)\n ? {\n clientId: readString(apple.clientId) as string,\n }\n : defaults.apple,\n portal: {\n port: readPositiveInteger(portal.port, 'auth.portal.port') ?? defaults.portal?.port ?? 19876,\n },\n };\n}\n\nfunction normalizePaymentConfig(value: LooseRecord, defaults: PaymentConfig): PaymentConfig {\n const evm = isRecord(value.evm) ? value.evm : {};\n const preferredRail = readString(value.preferredRail);\n const network = readString(evm.network);\n\n return {\n preferredRail:\n preferredRail === 'sui' || preferredRail === 'x402' || preferredRail === 'auto'\n ? preferredRail\n : defaults.preferredRail,\n evm: {\n enabled: readBoolean(evm.enabled) ?? defaults.evm?.enabled ?? false,\n network:\n network === 'base' || network === 'base-sepolia' || network === 'localhost'\n ? network\n : (defaults.evm?.network ?? 'base'),\n rpcUrl: readString(evm.rpcUrl) ?? defaults.evm?.rpcUrl,\n },\n };\n}\n\nfunction normalizeRelayConfig(\n value: LooseRecord,\n defaults: DaemonFullConfig['relay'],\n): DaemonFullConfig['relay'] {\n const endpoints = Array.isArray(value.endpoints)\n ? value.endpoints\n .map((entry) => {\n if (!isRecord(entry)) {\n return null;\n }\n\n const url = readString(entry.url);\n if (!url) {\n return null;\n }\n\n const relayDid = readString(entry.relayDid);\n return relayDid ? { url, relayDid } : { url };\n })\n .filter((entry): entry is NonNullable<typeof entry> => entry !== null)\n : defaults.endpoints;\n\n return {\n enabled: readBoolean(value.enabled) ?? defaults.enabled,\n endpoints,\n autoConnect: readBoolean(value.autoConnect) ?? defaults.autoConnect,\n providerMode: readBoolean(value.providerMode) ?? defaults.providerMode,\n reconnectIntervalMs: readPositiveInteger(value.reconnectIntervalMs, 'relay.reconnectIntervalMs') ?? defaults.reconnectIntervalMs,\n heartbeatIntervalMs: readPositiveInteger(value.heartbeatIntervalMs, 'relay.heartbeatIntervalMs') ?? defaults.heartbeatIntervalMs,\n };\n}\n\nfunction normalizeEncryptionConfig(\n value: LooseRecord,\n defaults: DaemonFullConfig['encryption'],\n): DaemonFullConfig['encryption'] {\n return {\n enabled: readBoolean(value.enabled) ?? defaults.enabled,\n requireEncryption: readBoolean(value.requireEncryption) ?? defaults.requireEncryption,\n };\n}\n\nfunction normalizeBlobStoreConfig(value: unknown, defaults: BlobStoreConfig): BlobStoreConfig {\n const blobstore = isRecord(value) ? value : {};\n const filesystem = isRecord(blobstore.filesystem) ? blobstore.filesystem : {};\n const walrus = isRecord(blobstore.walrus) ? blobstore.walrus : {};\n const hybrid = isRecord(blobstore.hybrid) ? blobstore.hybrid : {};\n const mode = normalizeBlobStoreMode(readString(blobstore.mode) ?? readString(blobstore.type) ?? defaults.mode);\n const filesystemDataDir = readString(filesystem.dataDir) ?? readString(blobstore.baseDir) ?? defaults.filesystem?.dataDir;\n const publisherUrl = readString(walrus.publisherUrl) ?? readString(blobstore.publisherUrl) ?? defaults.walrus?.publisherUrl;\n const aggregatorUrl = readString(walrus.aggregatorUrl) ?? readString(blobstore.aggregatorUrl) ?? defaults.walrus?.aggregatorUrl;\n\n return {\n mode,\n filesystem: filesystemDataDir\n ? {\n dataDir: normalizePath(filesystemDataDir),\n }\n : defaults.filesystem,\n walrus:\n publisherUrl || aggregatorUrl || defaults.walrus\n ? {\n publisherUrl: publisherUrl ?? '',\n aggregatorUrl: aggregatorUrl ?? '',\n epochs: readPositiveInteger(walrus.epochs, 'blobstore.walrus.epochs') ?? defaults.walrus?.epochs,\n maxBlobSize:\n readPositiveInteger(walrus.maxBlobSize, 'blobstore.walrus.maxBlobSize') ?? defaults.walrus?.maxBlobSize,\n retryAttempts:\n readPositiveInteger(walrus.retryAttempts, 'blobstore.walrus.retryAttempts') ?? defaults.walrus?.retryAttempts,\n retryDelayMs:\n readPositiveInteger(walrus.retryDelayMs, 'blobstore.walrus.retryDelayMs') ?? defaults.walrus?.retryDelayMs,\n timeoutMs: readPositiveInteger(walrus.timeoutMs, 'blobstore.walrus.timeoutMs') ?? defaults.walrus?.timeoutMs,\n }\n : defaults.walrus,\n hybrid: {\n cacheLocally: readBoolean(hybrid.cacheLocally) ?? defaults.hybrid?.cacheLocally ?? true,\n preferWalrus: readBoolean(hybrid.preferWalrus) ?? defaults.hybrid?.preferWalrus ?? true,\n },\n };\n}\n\nfunction applyBlobStoreDataDirOverride(config: BlobStoreConfig, dataDir: string): BlobStoreConfig {\n if (config.mode !== 'filesystem' && config.mode !== 'hybrid') {\n return config;\n }\n\n return {\n ...config,\n filesystem: {\n dataDir,\n },\n };\n}\n\nfunction normalizeBlobStoreMode(value: string): BlobStoreConfig['mode'] {\n if (value === 'filesystem' || value === 'walrus' || value === 'hybrid') {\n return value;\n }\n\n throw new Error(`Unsupported blobstore mode: ${value}`);\n}\n\nfunction normalizeSpendingPolicy(value: unknown, defaults: DaemonSpendingPolicy): DaemonSpendingPolicy {\n if (!isRecord(value)) {\n return defaults;\n }\n\n return {\n defaultRail: normalizeRail(value.defaultRail) ?? defaults.defaultRail,\n requireConfirmationAbove:\n value.requireConfirmationAbove === undefined\n ? defaults.requireConfirmationAbove\n : parseBigInt(value.requireConfirmationAbove, 'spending.requireConfirmationAbove'),\n allowlist: Array.isArray(value.allowlist)\n ? value.allowlist.filter((entry): entry is string => typeof entry === 'string')\n : defaults.allowlist,\n denylist: Array.isArray(value.denylist)\n ? value.denylist.filter((entry): entry is string => typeof entry === 'string')\n : defaults.denylist,\n limits:\n Array.isArray(value.limits) && value.limits.length > 0\n ? value.limits.map((limit, index) => normalizeSpendingLimit(limit, index, 'spending.limits'))\n : defaults.limits,\n perApp: normalizePerAppSpendingConfig(value.perApp, defaults.perApp),\n };\n}\n\nfunction normalizePerAppSpendingConfig(\n value: unknown,\n defaults: DaemonSpendingPolicy['perApp'],\n): DaemonSpendingPolicy['perApp'] {\n if (!isRecord(value)) {\n return defaults;\n }\n\n const perApp = Object.entries(value).map(([appName, config]) => {\n if (!isRecord(config)) {\n throw new Error(`spending.perApp.${appName} must be an object.`);\n }\n\n if (!Array.isArray(config.limits) || config.limits.length === 0) {\n throw new Error(`spending.perApp.${appName}.limits must contain at least one limit.`);\n }\n\n return [\n appName,\n {\n limits: config.limits.map((limit, index) =>\n normalizeSpendingLimit(limit, index, `spending.perApp.${appName}.limits`),\n ),\n },\n ] as const;\n });\n\n return Object.fromEntries(perApp);\n}\n\nfunction normalizeSpendingLimit(\n value: unknown,\n index: number,\n path: string,\n): DaemonSpendingPolicy['limits'][number] {\n if (!isRecord(value)) {\n throw new Error(`${path}[${index}] must be an object.`);\n }\n\n const interval = readString(value.interval);\n if (!interval || !['transaction', 'hour', 'day', 'month', 'lifetime'].includes(interval)) {\n throw new Error(`${path}[${index}].interval is invalid.`);\n }\n\n const normalizedInterval = interval as DaemonSpendingPolicy['limits'][number]['interval'];\n\n return {\n amount: parseBigInt(value.amount, `${path}[${index}].amount`),\n interval: normalizedInterval,\n rail: normalizeRail(value.rail),\n currency: readString(value.currency)?.toUpperCase(),\n scope: readString(value.scope) ?? undefined,\n };\n}\n\nfunction normalizeProviderConfig(value: LooseRecord | undefined): DaemonFullConfig['provider'] {\n if (!value) {\n return undefined;\n }\n\n const capabilities = Array.isArray(value.capabilities)\n ? value.capabilities.map((entry, index) => normalizeProviderCapability(entry, index))\n : [];\n\n return {\n enabled: readBoolean(value.enabled) ?? false,\n capabilities,\n maxConcurrency: readPositiveInteger(value.maxConcurrency, 'provider.maxConcurrency'),\n autoRegister: readBoolean(value.autoRegister),\n };\n}\n\nfunction normalizeProviderCapability(\n value: unknown,\n index: number,\n): NonNullable<DaemonFullConfig['provider']>['capabilities'][number] {\n if (!isRecord(value)) {\n throw new Error(`provider.capabilities[${index}] must be an object.`);\n }\n\n const name = readString(value.name);\n const description = readString(value.description);\n const version = readString(value.version);\n const adapter = readString(value.adapter);\n const priceMist = readPositiveInteger(value.priceMist, `provider.capabilities[${index}].priceMist`);\n\n if (!name || !description || !version || !adapter || priceMist === undefined) {\n throw new Error(`provider.capabilities[${index}] is incomplete.`);\n }\n\n return {\n name,\n description,\n version,\n priceMist,\n currency: readString(value.currency),\n adapter,\n adapterConfig: isRecord(value.adapterConfig) ? value.adapterConfig : undefined,\n };\n}\n\nfunction validateConfig(config: DaemonFullConfig): void {\n if (!config.network.rpcUrl) {\n throw new Error('network.rpcUrl is required.');\n }\n\n if (!config.identity.dataDir) {\n throw new Error('identity.dataDir is required.');\n }\n\n if (!config.auth.mode) {\n throw new Error('auth.mode is required.');\n }\n\n if (config.auth.mode === 'zklogin' && !config.auth.google?.clientId) {\n throw new Error('auth.google.clientId is required when auth.mode is zklogin.');\n }\n\n if (!config.payment.evm) {\n throw new Error('payment.evm configuration is required.');\n }\n\n if (!config.daemon.ipcPath || !config.daemon.dataDir || !config.daemon.pidFile) {\n throw new Error('daemon configuration is incomplete.');\n }\n\n if (config.relay.enabled && config.relay.endpoints.length === 0) {\n throw new Error('relay.endpoints must contain at least one entry when relay is enabled.');\n }\n\n for (const endpoint of config.relay.endpoints) {\n if (!/^wss?:\\/\\//i.test(endpoint.url)) {\n throw new Error(`Invalid relay endpoint URL: ${endpoint.url}`);\n }\n }\n\n if (config.blobstore.mode === 'filesystem' || config.blobstore.mode === 'hybrid') {\n if (!config.blobstore.filesystem?.dataDir) {\n throw new Error('blobstore.filesystem.dataDir is required.');\n }\n }\n\n if (config.blobstore.mode === 'walrus' || config.blobstore.mode === 'hybrid') {\n if (!config.blobstore.walrus?.publisherUrl || !config.blobstore.walrus.aggregatorUrl) {\n throw new Error('blobstore.walrus.publisherUrl and blobstore.walrus.aggregatorUrl are required.');\n }\n }\n\n if (!LOG_LEVELS.has(config.daemon.logLevel)) {\n throw new Error(`Invalid log level: ${config.daemon.logLevel}`);\n }\n\n if (config.encryption.requireEncryption && !config.encryption.enabled) {\n throw new Error('encryption.requireEncryption cannot be true when encryption.enabled is false.');\n }\n}\n\nfunction serializeConfig(config: DaemonFullConfig): LooseRecord {\n return serializeValue(config) as LooseRecord;\n}\n\nfunction serializeValue(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => serializeValue(entry));\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entry]) => entry !== undefined)\n .map(([key, entry]) => [key, serializeValue(entry)]),\n );\n }\n\n return value;\n}\n\nfunction normalizeLogLevel(value: unknown, fallback: DaemonFullConfig['daemon']['logLevel']) {\n return typeof value === 'string' && LOG_LEVELS.has(value as DaemonFullConfig['daemon']['logLevel'])\n ? (value as DaemonFullConfig['daemon']['logLevel'])\n : fallback;\n}\n\nfunction normalizeRail(value: unknown): PaymentRail | undefined {\n if (\n value === PaymentRail.SUI_ESCROW ||\n value === PaymentRail.SUI_TRANSFER ||\n value === PaymentRail.X402_BASE\n ) {\n return value;\n }\n\n return undefined;\n}\n\nfunction parseBigInt(value: unknown, field: string): bigint {\n if (typeof value === 'bigint') {\n return value;\n }\n\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) {\n return BigInt(value);\n }\n\n if (typeof value === 'string' && /^\\d+$/.test(value.trim())) {\n return BigInt(value.trim());\n }\n\n throw new Error(`${field} must be a non-negative integer.`);\n}\n\nfunction getEnvDataDir(): string | undefined {\n return process.env.COLLECTIVE_DATA_DIR ? normalizePath(process.env.COLLECTIVE_DATA_DIR) : undefined;\n}\n\nfunction getNestedValue(record: LooseRecord, ...keys: string[]): unknown {\n let current: unknown = record;\n for (const key of keys) {\n if (!isRecord(current)) {\n return undefined;\n }\n\n current = current[key];\n }\n\n return current;\n}\n\nfunction normalizePath(value: string): string {\n return resolve(expandHome(value));\n}\n\nfunction expandHome(value: string): string {\n if (value === '~') {\n return homedir();\n }\n\n if (value.startsWith('~/') || value.startsWith('~\\\\')) {\n return join(homedir(), value.slice(2));\n }\n\n return value;\n}\n\n/**\n * Resolve the network config from YAML. If a `name` field is present (e.g. \"testnet\"),\n * use the corresponding preset as the base, then overlay any explicit fields.\n */\nfunction resolveNetworkFromConfig(network: LooseRecord, defaults: NetworkConfig): NetworkConfig {\n const nameField = readString(network.name);\n const preset = nameField ? getNetworkPreset(nameField) : undefined;\n const base = preset ?? defaults;\n\n return {\n rpcUrl: readString(network.rpcUrl) ?? base.rpcUrl,\n faucetUrl: readString(network.faucetUrl) ?? base.faucetUrl,\n packageId: readHexString(network.packageId) ?? base.packageId,\n registryId: readHexString(network.registryId) ?? base.registryId,\n };\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction readPositiveInteger(value: unknown, field: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) {\n return value;\n }\n\n if (typeof value === 'string' && /^\\d+$/.test(value.trim())) {\n return Number(value.trim());\n }\n\n throw new Error(`${field} must be a non-negative integer.`);\n}\n\nfunction readHexString(value: unknown): string | undefined {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) {\n return `0x${value.toString(16)}`;\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is LooseRecord {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n"],"mappings":"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","names":["resolve"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
saveConfig
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VGVQWRGO.js";
|
|
4
4
|
import {
|
|
5
5
|
buildOAuthConfig
|
|
6
6
|
} from "./chunk-Q3V4V7UR.js";
|
|
@@ -1002,4 +1002,4 @@ function isNetworkValidationError(error) {
|
|
|
1002
1002
|
export {
|
|
1003
1003
|
PortalServer
|
|
1004
1004
|
};
|
|
1005
|
-
//# sourceMappingURL=chunk-
|
|
1005
|
+
//# sourceMappingURL=chunk-Y62YXMRX.js.map
|
package/dist/config.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
} from "./chunk-BHN4GOYD.js";
|
|
5
5
|
import {
|
|
6
6
|
PortalServer
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-Y62YXMRX.js";
|
|
8
8
|
import {
|
|
9
9
|
getConfigPath,
|
|
10
10
|
loadConfig
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-VGVQWRGO.js";
|
|
12
12
|
import {
|
|
13
13
|
DaemonState,
|
|
14
14
|
createDaemonIdentityContext
|
package/dist/portal/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hivemind-os/collective-daemon",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -51,10 +51,10 @@
|
|
|
51
51
|
"pino": "^9.0.0",
|
|
52
52
|
"pino-pretty": "^13.0.0",
|
|
53
53
|
"ws": "^8.0.0",
|
|
54
|
-
"@hivemind-os/collective-
|
|
55
|
-
"@hivemind-os/collective-mcp-server": "0.2.
|
|
56
|
-
"@hivemind-os/collective-
|
|
57
|
-
"@hivemind-os/collective-
|
|
54
|
+
"@hivemind-os/collective-types": "0.2.2",
|
|
55
|
+
"@hivemind-os/collective-mcp-server": "0.2.2",
|
|
56
|
+
"@hivemind-os/collective-core": "0.2.2",
|
|
57
|
+
"@hivemind-os/collective-relay": "0.2.2"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@types/js-yaml": "^4.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as fsPromises from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, extname, join, resolve } from 'node:path';\nimport { isDeepStrictEqual } from 'node:util';\n\nimport {\n PaymentRail,\n NETWORK_PRESETS,\n getNetworkPreset,\n type AuthConfig,\n type BlobStoreConfig,\n type EncryptionConfig,\n type NetworkConfig,\n type NetworkName,\n type PaymentConfig,\n type SpendingLimit,\n type SpendingPolicy,\n} from '@hivemind-os/collective-types';\nimport yaml from 'js-yaml';\n\nimport { getDefaultIpcPath } from './ipc/pipe-security.js';\n\nexport interface DaemonPerAppSpendingConfig {\n limits: SpendingLimit[];\n}\n\nexport interface DaemonSpendingPolicy extends SpendingPolicy {\n perApp?: Record<string, DaemonPerAppSpendingConfig>;\n}\n\nexport interface DaemonFullConfig {\n network: NetworkConfig;\n identity: {\n dataDir: string;\n };\n auth: AuthConfig;\n spending: DaemonSpendingPolicy;\n payment: PaymentConfig;\n daemon: {\n ipcPath: string;\n dataDir: string;\n pidFile: string;\n logLevel: 'debug' | 'info' | 'warn' | 'error';\n logFile?: string;\n };\n relay: {\n enabled: boolean;\n endpoints: Array<{\n url: string;\n relayDid?: string;\n }>;\n autoConnect: boolean;\n providerMode: boolean;\n reconnectIntervalMs?: number;\n heartbeatIntervalMs?: number;\n };\n blobstore: BlobStoreConfig;\n encryption: EncryptionConfig;\n provider?: {\n enabled: boolean;\n capabilities: Array<{\n name: string;\n description: string;\n version: string;\n priceMist: number;\n currency?: string;\n adapter: string;\n adapterConfig?: Record<string, unknown>;\n }>;\n maxConcurrency?: number;\n autoRegister?: boolean;\n };\n}\n\ntype LooseRecord = Record<string, unknown>;\ninterface ConfigDiff {\n path: string[];\n value?: unknown;\n delete?: true;\n}\n\nconst LOG_LEVELS = new Set<DaemonFullConfig['daemon']['logLevel']>(['debug', 'info', 'warn', 'error']);\nconst configSaveLocks = new Map<string, Promise<void>>();\nexport const configIo = {\n mkdir: fsPromises.mkdir,\n writeFile: fsPromises.writeFile,\n rename: fsPromises.rename,\n rm: fsPromises.rm,\n};\n\nexport function getDefaultConfig(): DaemonFullConfig {\n return buildDefaultConfig(resolve(homedir(), '.hivemind-os/collective'));\n}\n\nexport function getConfigPath(configPath?: string): string {\n return resolve(expandHome(configPath ?? join(getEnvDataDir() ?? resolve(homedir(), '.hivemind-os/collective'), 'config.yaml')));\n}\n\nexport { getDefaultIpcPath };\n\nexport function loadConfig(configPath?: string): DaemonFullConfig {\n const resolvedConfigPath = getConfigPath(configPath);\n\n const parsed = loadConfigFile(resolvedConfigPath);\n const config = buildResolvedConfig(parsed);\n validateConfig(config);\n\n if (!fs.existsSync(resolvedConfigPath)) {\n fs.mkdirSync(dirname(resolvedConfigPath), { recursive: true, mode: 0o700 });\n writePrivateConfigFile(resolvedConfigPath, formatConfigContents(serializeConfig(config), resolvedConfigPath));\n } else {\n enforcePrivateFilePermissions(resolvedConfigPath);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: DaemonFullConfig, configPath = getConfigPath()): Promise<string> {\n const resolvedConfigPath = getConfigPath(configPath);\n validateConfig(config);\n\n await withConfigSaveLock(resolvedConfigPath, async () => {\n const parsed = loadConfigFile(resolvedConfigPath);\n const currentConfig = buildResolvedConfig(parsed);\n const updates = collectConfigDiffs(serializeConfig(currentConfig), serializeConfig(config));\n const nextParsed = applyConfigDiffs(parsed, updates);\n await writePrivateConfigFileAtomic(\n resolvedConfigPath,\n formatConfigContents(nextParsed, resolvedConfigPath),\n );\n });\n\n return resolvedConfigPath;\n}\n\nfunction writePrivateConfigFile(configPath: string, contents: string): void {\n fs.writeFileSync(configPath, contents, { encoding: 'utf8', mode: 0o600 });\n enforcePrivateFilePermissions(configPath);\n}\n\nasync function writePrivateConfigFileAtomic(configPath: string, contents: string): Promise<void> {\n const tempPath = `${configPath}.${process.pid}.${randomUUID()}.tmp`;\n await configIo.mkdir(dirname(configPath), { recursive: true, mode: 0o700 });\n\n try {\n await configIo.writeFile(tempPath, contents, { encoding: 'utf8', mode: 0o600 });\n await configIo.rename(tempPath, configPath);\n enforcePrivateFilePermissions(configPath);\n } finally {\n await configIo.rm(tempPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction enforcePrivateFilePermissions(path: string): void {\n fs.chmodSync(path, 0o600);\n}\n\nfunction loadConfigFile(configPath: string): LooseRecord {\n if (!fs.existsSync(configPath)) {\n return {};\n }\n\n const loaded = yaml.load(fs.readFileSync(configPath, 'utf8'));\n return isRecord(loaded) ? loaded : {};\n}\n\nfunction buildResolvedConfig(parsed: LooseRecord): DaemonFullConfig {\n const baseDataDir = normalizePath(\n getEnvDataDir() ?? readString(getNestedValue(parsed, 'daemon', 'dataDir')) ?? resolve(homedir(), '.hivemind-os/collective'),\n );\n const hasExplicitIpcPath = readString(getNestedValue(parsed, 'daemon', 'ipcPath')) !== undefined;\n\n return applyEnvironmentOverrides(mergeConfig(buildDefaultConfig(baseDataDir), parsed), { hasExplicitIpcPath });\n}\n\nasync function withConfigSaveLock<T>(configPath: string, operation: () => Promise<T>): Promise<T> {\n const previous = configSaveLocks.get(configPath) ?? Promise.resolve();\n let release!: () => void;\n const gate = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chain = previous.catch(() => undefined).then(() => gate);\n configSaveLocks.set(configPath, chain);\n\n await previous.catch(() => undefined);\n\n try {\n return await operation();\n } finally {\n release();\n if (configSaveLocks.get(configPath) === chain) {\n configSaveLocks.delete(configPath);\n }\n }\n}\n\nfunction collectConfigDiffs(current: unknown, next: unknown, path: string[] = []): ConfigDiff[] {\n if (isRecord(current) && isRecord(next)) {\n const diffs: ConfigDiff[] = [];\n const keys = new Set([...Object.keys(current), ...Object.keys(next)]);\n\n for (const key of keys) {\n const hasCurrent = Object.hasOwn(current, key);\n const hasNext = Object.hasOwn(next, key);\n if (!hasNext) {\n diffs.push({ path: [...path, key], delete: true });\n continue;\n }\n\n if (!hasCurrent) {\n diffs.push({ path: [...path, key], value: structuredClone(next[key]) });\n continue;\n }\n\n diffs.push(...collectConfigDiffs(current[key], next[key], [...path, key]));\n }\n\n return diffs;\n }\n\n return isDeepStrictEqual(current, next) ? [] : [{ path, value: structuredClone(next) }];\n}\n\nfunction applyConfigDiffs(parsed: LooseRecord, diffs: ConfigDiff[]): LooseRecord {\n const next = structuredClone(parsed);\n\n for (const diff of diffs) {\n if (diff.path.length === 0) {\n return isRecord(diff.value) ? structuredClone(diff.value) : {};\n }\n\n if (diff.delete) {\n deleteNestedValue(next, diff.path);\n continue;\n }\n\n setNestedValue(next, diff.path, structuredClone(diff.value));\n }\n\n return next;\n}\n\nfunction setNestedValue(record: LooseRecord, path: string[], value: unknown): void {\n let current = record;\n for (const segment of path.slice(0, -1)) {\n const next = current[segment];\n if (!isRecord(next)) {\n current[segment] = {};\n }\n current = current[segment] as LooseRecord;\n }\n\n current[path[path.length - 1] as string] = value;\n}\n\nfunction deleteNestedValue(record: LooseRecord, path: string[]): void {\n const parents: Array<{ record: LooseRecord; key: string }> = [];\n let current: LooseRecord | undefined = record;\n\n for (const segment of path.slice(0, -1)) {\n if (!current || !isRecord(current[segment])) {\n return;\n }\n\n parents.push({ record: current, key: segment });\n current = current[segment] as LooseRecord;\n }\n\n if (!current) {\n return;\n }\n\n delete current[path[path.length - 1] as string];\n\n for (let index = parents.length - 1; index >= 0; index -= 1) {\n const parent = parents[index];\n const child = parent.record[parent.key];\n if (!isRecord(child) || Object.keys(child).length > 0) {\n break;\n }\n\n delete parent.record[parent.key];\n }\n}\n\nfunction formatConfigContents(config: LooseRecord, configPath: string): string {\n if (extname(configPath).toLowerCase() === '.json') {\n return `${JSON.stringify(config, null, 2)}\\n`;\n }\n\n return yaml.dump(config, { lineWidth: 120 });\n}\n\nfunction buildDefaultConfig(dataDir: string): DaemonFullConfig {\n const resolvedDataDir = normalizePath(dataDir);\n const defaultNetwork = NETWORK_PRESETS.testnet;\n\n return {\n network: {\n rpcUrl: defaultNetwork.rpcUrl,\n faucetUrl: defaultNetwork.faucetUrl,\n packageId: defaultNetwork.packageId,\n registryId: defaultNetwork.registryId,\n },\n identity: {\n dataDir: join(resolvedDataDir, 'identity'),\n },\n auth: {\n mode: 'ed25519',\n portal: {\n port: 19876,\n },\n },\n spending: {\n defaultRail: PaymentRail.SUI_ESCROW,\n limits: [{ amount: 1_000_000_000n, interval: 'day', currency: 'MIST' }],\n },\n payment: {\n preferredRail: 'auto',\n evm: {\n enabled: false,\n network: 'base',\n },\n },\n daemon: {\n ipcPath: getDefaultIpcPath(resolvedDataDir),\n dataDir: resolvedDataDir,\n pidFile: join(resolvedDataDir, 'daemon.pid'),\n logLevel: 'info',\n },\n relay: {\n enabled: false,\n endpoints: [],\n autoConnect: true,\n providerMode: false,\n reconnectIntervalMs: 5_000,\n heartbeatIntervalMs: 30_000,\n },\n blobstore: {\n mode: 'filesystem',\n filesystem: {\n dataDir: join(resolvedDataDir, 'blobs'),\n },\n },\n encryption: {\n enabled: true,\n requireEncryption: false,\n },\n };\n}\n\nfunction mergeConfig(defaults: DaemonFullConfig, parsed: LooseRecord): DaemonFullConfig {\n const network = isRecord(parsed.network) ? parsed.network : {};\n const identity = isRecord(parsed.identity) ? parsed.identity : {};\n const auth = isRecord(parsed.auth) ? parsed.auth : {};\n const payment = isRecord(parsed.payment) ? parsed.payment : {};\n const daemon = isRecord(parsed.daemon) ? parsed.daemon : {};\n const relay = isRecord(parsed.relay) ? parsed.relay : {};\n const blobstore = isRecord(parsed.blobstore) ? parsed.blobstore : {};\n const encryption = isRecord(parsed.encryption) ? parsed.encryption : {};\n const provider = isRecord(parsed.provider) ? parsed.provider : undefined;\n\n return {\n network: {\n ...resolveNetworkFromConfig(network, defaults.network),\n },\n identity: {\n dataDir: normalizePath(readString(identity.dataDir) ?? defaults.identity.dataDir),\n },\n auth: normalizeAuthConfig(auth, defaults.auth),\n spending: normalizeSpendingPolicy(parsed.spending, defaults.spending),\n payment: normalizePaymentConfig(payment, defaults.payment),\n daemon: {\n ipcPath: readString(daemon.ipcPath) ?? defaults.daemon.ipcPath,\n dataDir: normalizePath(readString(daemon.dataDir) ?? defaults.daemon.dataDir),\n pidFile: normalizePath(readString(daemon.pidFile) ?? defaults.daemon.pidFile),\n logLevel: normalizeLogLevel(daemon.logLevel, defaults.daemon.logLevel),\n logFile: readString(daemon.logFile) ? normalizePath(readString(daemon.logFile) as string) : undefined,\n },\n relay: normalizeRelayConfig(relay, defaults.relay),\n blobstore: normalizeBlobStoreConfig(blobstore, defaults.blobstore),\n encryption: normalizeEncryptionConfig(encryption, defaults.encryption),\n provider: normalizeProviderConfig(provider),\n };\n}\n\nfunction applyEnvironmentOverrides(\n config: DaemonFullConfig,\n options: { hasExplicitIpcPath: boolean } = { hasExplicitIpcPath: false },\n): DaemonFullConfig {\n const envDataDir = getEnvDataDir();\n const withDataDir = envDataDir\n ? {\n ...config,\n identity: { dataDir: join(envDataDir, 'identity') },\n daemon: {\n ...config.daemon,\n dataDir: envDataDir,\n pidFile: join(envDataDir, 'daemon.pid'),\n ipcPath: options.hasExplicitIpcPath ? config.daemon.ipcPath : getDefaultIpcPath(envDataDir),\n },\n blobstore: applyBlobStoreDataDirOverride(config.blobstore, join(envDataDir, 'blobs')),\n }\n : config;\n\n return {\n ...withDataDir,\n network: {\n ...withDataDir.network,\n ...resolveNetworkEnvOverrides(withDataDir.network),\n },\n daemon: {\n ...withDataDir.daemon,\n logLevel: normalizeLogLevel(process.env.COLLECTIVE_LOG_LEVEL, withDataDir.daemon.logLevel),\n },\n };\n}\n\nfunction resolveNetworkEnvOverrides(base: NetworkConfig): Partial<NetworkConfig> {\n // COLLECTIVE_NETWORK=testnet|mainnet|devnet|local applies a full preset\n const networkName = process.env.COLLECTIVE_NETWORK as NetworkName | undefined;\n const preset = networkName ? getNetworkPreset(networkName) : undefined;\n const merged = preset ? { ...base, ...preset } : base;\n\n // Individual env vars override the preset\n return {\n rpcUrl: process.env.COLLECTIVE_RPC_URL ?? merged.rpcUrl,\n faucetUrl: merged.faucetUrl,\n packageId: process.env.COLLECTIVE_PACKAGE_ID ?? merged.packageId,\n registryId: process.env.COLLECTIVE_REGISTRY_ID ?? merged.registryId,\n };\n}\n\nfunction normalizeAuthConfig(value: LooseRecord, defaults: AuthConfig): AuthConfig {\n const google = isRecord(value.google) ? value.google : {};\n const apple = isRecord(value.apple) ? value.apple : {};\n const portal = isRecord(value.portal) ? value.portal : {};\n\n return {\n mode: value.mode === 'zklogin' ? 'zklogin' : defaults.mode,\n google: readString(google.clientId)\n ? {\n clientId: readString(google.clientId) as string,\n }\n : defaults.google,\n apple: readString(apple.clientId)\n ? {\n clientId: readString(apple.clientId) as string,\n }\n : defaults.apple,\n portal: {\n port: readPositiveInteger(portal.port, 'auth.portal.port') ?? defaults.portal?.port ?? 19876,\n },\n };\n}\n\nfunction normalizePaymentConfig(value: LooseRecord, defaults: PaymentConfig): PaymentConfig {\n const evm = isRecord(value.evm) ? value.evm : {};\n const preferredRail = readString(value.preferredRail);\n const network = readString(evm.network);\n\n return {\n preferredRail:\n preferredRail === 'sui' || preferredRail === 'x402' || preferredRail === 'auto'\n ? preferredRail\n : defaults.preferredRail,\n evm: {\n enabled: readBoolean(evm.enabled) ?? defaults.evm?.enabled ?? false,\n network:\n network === 'base' || network === 'base-sepolia' || network === 'localhost'\n ? network\n : (defaults.evm?.network ?? 'base'),\n rpcUrl: readString(evm.rpcUrl) ?? defaults.evm?.rpcUrl,\n },\n };\n}\n\nfunction normalizeRelayConfig(\n value: LooseRecord,\n defaults: DaemonFullConfig['relay'],\n): DaemonFullConfig['relay'] {\n const endpoints = Array.isArray(value.endpoints)\n ? value.endpoints\n .map((entry) => {\n if (!isRecord(entry)) {\n return null;\n }\n\n const url = readString(entry.url);\n if (!url) {\n return null;\n }\n\n const relayDid = readString(entry.relayDid);\n return relayDid ? { url, relayDid } : { url };\n })\n .filter((entry): entry is NonNullable<typeof entry> => entry !== null)\n : defaults.endpoints;\n\n return {\n enabled: readBoolean(value.enabled) ?? defaults.enabled,\n endpoints,\n autoConnect: readBoolean(value.autoConnect) ?? defaults.autoConnect,\n providerMode: readBoolean(value.providerMode) ?? defaults.providerMode,\n reconnectIntervalMs: readPositiveInteger(value.reconnectIntervalMs, 'relay.reconnectIntervalMs') ?? defaults.reconnectIntervalMs,\n heartbeatIntervalMs: readPositiveInteger(value.heartbeatIntervalMs, 'relay.heartbeatIntervalMs') ?? defaults.heartbeatIntervalMs,\n };\n}\n\nfunction normalizeEncryptionConfig(\n value: LooseRecord,\n defaults: DaemonFullConfig['encryption'],\n): DaemonFullConfig['encryption'] {\n return {\n enabled: readBoolean(value.enabled) ?? defaults.enabled,\n requireEncryption: readBoolean(value.requireEncryption) ?? defaults.requireEncryption,\n };\n}\n\nfunction normalizeBlobStoreConfig(value: unknown, defaults: BlobStoreConfig): BlobStoreConfig {\n const blobstore = isRecord(value) ? value : {};\n const filesystem = isRecord(blobstore.filesystem) ? blobstore.filesystem : {};\n const walrus = isRecord(blobstore.walrus) ? blobstore.walrus : {};\n const hybrid = isRecord(blobstore.hybrid) ? blobstore.hybrid : {};\n const mode = normalizeBlobStoreMode(readString(blobstore.mode) ?? readString(blobstore.type) ?? defaults.mode);\n const filesystemDataDir = readString(filesystem.dataDir) ?? readString(blobstore.baseDir) ?? defaults.filesystem?.dataDir;\n const publisherUrl = readString(walrus.publisherUrl) ?? readString(blobstore.publisherUrl) ?? defaults.walrus?.publisherUrl;\n const aggregatorUrl = readString(walrus.aggregatorUrl) ?? readString(blobstore.aggregatorUrl) ?? defaults.walrus?.aggregatorUrl;\n\n return {\n mode,\n filesystem: filesystemDataDir\n ? {\n dataDir: normalizePath(filesystemDataDir),\n }\n : defaults.filesystem,\n walrus:\n publisherUrl || aggregatorUrl || defaults.walrus\n ? {\n publisherUrl: publisherUrl ?? '',\n aggregatorUrl: aggregatorUrl ?? '',\n epochs: readPositiveInteger(walrus.epochs, 'blobstore.walrus.epochs') ?? defaults.walrus?.epochs,\n maxBlobSize:\n readPositiveInteger(walrus.maxBlobSize, 'blobstore.walrus.maxBlobSize') ?? defaults.walrus?.maxBlobSize,\n retryAttempts:\n readPositiveInteger(walrus.retryAttempts, 'blobstore.walrus.retryAttempts') ?? defaults.walrus?.retryAttempts,\n retryDelayMs:\n readPositiveInteger(walrus.retryDelayMs, 'blobstore.walrus.retryDelayMs') ?? defaults.walrus?.retryDelayMs,\n timeoutMs: readPositiveInteger(walrus.timeoutMs, 'blobstore.walrus.timeoutMs') ?? defaults.walrus?.timeoutMs,\n }\n : defaults.walrus,\n hybrid: {\n cacheLocally: readBoolean(hybrid.cacheLocally) ?? defaults.hybrid?.cacheLocally ?? true,\n preferWalrus: readBoolean(hybrid.preferWalrus) ?? defaults.hybrid?.preferWalrus ?? true,\n },\n };\n}\n\nfunction applyBlobStoreDataDirOverride(config: BlobStoreConfig, dataDir: string): BlobStoreConfig {\n if (config.mode !== 'filesystem' && config.mode !== 'hybrid') {\n return config;\n }\n\n return {\n ...config,\n filesystem: {\n dataDir,\n },\n };\n}\n\nfunction normalizeBlobStoreMode(value: string): BlobStoreConfig['mode'] {\n if (value === 'filesystem' || value === 'walrus' || value === 'hybrid') {\n return value;\n }\n\n throw new Error(`Unsupported blobstore mode: ${value}`);\n}\n\nfunction normalizeSpendingPolicy(value: unknown, defaults: DaemonSpendingPolicy): DaemonSpendingPolicy {\n if (!isRecord(value)) {\n return defaults;\n }\n\n return {\n defaultRail: normalizeRail(value.defaultRail) ?? defaults.defaultRail,\n requireConfirmationAbove:\n value.requireConfirmationAbove === undefined\n ? defaults.requireConfirmationAbove\n : parseBigInt(value.requireConfirmationAbove, 'spending.requireConfirmationAbove'),\n allowlist: Array.isArray(value.allowlist)\n ? value.allowlist.filter((entry): entry is string => typeof entry === 'string')\n : defaults.allowlist,\n denylist: Array.isArray(value.denylist)\n ? value.denylist.filter((entry): entry is string => typeof entry === 'string')\n : defaults.denylist,\n limits:\n Array.isArray(value.limits) && value.limits.length > 0\n ? value.limits.map((limit, index) => normalizeSpendingLimit(limit, index, 'spending.limits'))\n : defaults.limits,\n perApp: normalizePerAppSpendingConfig(value.perApp, defaults.perApp),\n };\n}\n\nfunction normalizePerAppSpendingConfig(\n value: unknown,\n defaults: DaemonSpendingPolicy['perApp'],\n): DaemonSpendingPolicy['perApp'] {\n if (!isRecord(value)) {\n return defaults;\n }\n\n const perApp = Object.entries(value).map(([appName, config]) => {\n if (!isRecord(config)) {\n throw new Error(`spending.perApp.${appName} must be an object.`);\n }\n\n if (!Array.isArray(config.limits) || config.limits.length === 0) {\n throw new Error(`spending.perApp.${appName}.limits must contain at least one limit.`);\n }\n\n return [\n appName,\n {\n limits: config.limits.map((limit, index) =>\n normalizeSpendingLimit(limit, index, `spending.perApp.${appName}.limits`),\n ),\n },\n ] as const;\n });\n\n return Object.fromEntries(perApp);\n}\n\nfunction normalizeSpendingLimit(\n value: unknown,\n index: number,\n path: string,\n): DaemonSpendingPolicy['limits'][number] {\n if (!isRecord(value)) {\n throw new Error(`${path}[${index}] must be an object.`);\n }\n\n const interval = readString(value.interval);\n if (!interval || !['transaction', 'hour', 'day', 'month', 'lifetime'].includes(interval)) {\n throw new Error(`${path}[${index}].interval is invalid.`);\n }\n\n const normalizedInterval = interval as DaemonSpendingPolicy['limits'][number]['interval'];\n\n return {\n amount: parseBigInt(value.amount, `${path}[${index}].amount`),\n interval: normalizedInterval,\n rail: normalizeRail(value.rail),\n currency: readString(value.currency)?.toUpperCase(),\n scope: readString(value.scope) ?? undefined,\n };\n}\n\nfunction normalizeProviderConfig(value: LooseRecord | undefined): DaemonFullConfig['provider'] {\n if (!value) {\n return undefined;\n }\n\n const capabilities = Array.isArray(value.capabilities)\n ? value.capabilities.map((entry, index) => normalizeProviderCapability(entry, index))\n : [];\n\n return {\n enabled: readBoolean(value.enabled) ?? false,\n capabilities,\n maxConcurrency: readPositiveInteger(value.maxConcurrency, 'provider.maxConcurrency'),\n autoRegister: readBoolean(value.autoRegister),\n };\n}\n\nfunction normalizeProviderCapability(\n value: unknown,\n index: number,\n): NonNullable<DaemonFullConfig['provider']>['capabilities'][number] {\n if (!isRecord(value)) {\n throw new Error(`provider.capabilities[${index}] must be an object.`);\n }\n\n const name = readString(value.name);\n const description = readString(value.description);\n const version = readString(value.version);\n const adapter = readString(value.adapter);\n const priceMist = readPositiveInteger(value.priceMist, `provider.capabilities[${index}].priceMist`);\n\n if (!name || !description || !version || !adapter || priceMist === undefined) {\n throw new Error(`provider.capabilities[${index}] is incomplete.`);\n }\n\n return {\n name,\n description,\n version,\n priceMist,\n currency: readString(value.currency),\n adapter,\n adapterConfig: isRecord(value.adapterConfig) ? value.adapterConfig : undefined,\n };\n}\n\nfunction validateConfig(config: DaemonFullConfig): void {\n if (!config.network.rpcUrl) {\n throw new Error('network.rpcUrl is required.');\n }\n\n if (!config.identity.dataDir) {\n throw new Error('identity.dataDir is required.');\n }\n\n if (!config.auth.mode) {\n throw new Error('auth.mode is required.');\n }\n\n if (config.auth.mode === 'zklogin' && !config.auth.google?.clientId) {\n throw new Error('auth.google.clientId is required when auth.mode is zklogin.');\n }\n\n if (!config.payment.evm) {\n throw new Error('payment.evm configuration is required.');\n }\n\n if (!config.daemon.ipcPath || !config.daemon.dataDir || !config.daemon.pidFile) {\n throw new Error('daemon configuration is incomplete.');\n }\n\n if (config.relay.enabled && config.relay.endpoints.length === 0) {\n throw new Error('relay.endpoints must contain at least one entry when relay is enabled.');\n }\n\n for (const endpoint of config.relay.endpoints) {\n if (!/^wss?:\\/\\//i.test(endpoint.url)) {\n throw new Error(`Invalid relay endpoint URL: ${endpoint.url}`);\n }\n }\n\n if (config.blobstore.mode === 'filesystem' || config.blobstore.mode === 'hybrid') {\n if (!config.blobstore.filesystem?.dataDir) {\n throw new Error('blobstore.filesystem.dataDir is required.');\n }\n }\n\n if (config.blobstore.mode === 'walrus' || config.blobstore.mode === 'hybrid') {\n if (!config.blobstore.walrus?.publisherUrl || !config.blobstore.walrus.aggregatorUrl) {\n throw new Error('blobstore.walrus.publisherUrl and blobstore.walrus.aggregatorUrl are required.');\n }\n }\n\n if (!LOG_LEVELS.has(config.daemon.logLevel)) {\n throw new Error(`Invalid log level: ${config.daemon.logLevel}`);\n }\n\n if (config.encryption.requireEncryption && !config.encryption.enabled) {\n throw new Error('encryption.requireEncryption cannot be true when encryption.enabled is false.');\n }\n}\n\nfunction serializeConfig(config: DaemonFullConfig): LooseRecord {\n return serializeValue(config) as LooseRecord;\n}\n\nfunction serializeValue(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => serializeValue(entry));\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entry]) => entry !== undefined)\n .map(([key, entry]) => [key, serializeValue(entry)]),\n );\n }\n\n return value;\n}\n\nfunction normalizeLogLevel(value: unknown, fallback: DaemonFullConfig['daemon']['logLevel']) {\n return typeof value === 'string' && LOG_LEVELS.has(value as DaemonFullConfig['daemon']['logLevel'])\n ? (value as DaemonFullConfig['daemon']['logLevel'])\n : fallback;\n}\n\nfunction normalizeRail(value: unknown): PaymentRail | undefined {\n if (\n value === PaymentRail.SUI_ESCROW ||\n value === PaymentRail.SUI_TRANSFER ||\n value === PaymentRail.X402_BASE\n ) {\n return value;\n }\n\n return undefined;\n}\n\nfunction parseBigInt(value: unknown, field: string): bigint {\n if (typeof value === 'bigint') {\n return value;\n }\n\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) {\n return BigInt(value);\n }\n\n if (typeof value === 'string' && /^\\d+$/.test(value.trim())) {\n return BigInt(value.trim());\n }\n\n throw new Error(`${field} must be a non-negative integer.`);\n}\n\nfunction getEnvDataDir(): string | undefined {\n return process.env.COLLECTIVE_DATA_DIR ? normalizePath(process.env.COLLECTIVE_DATA_DIR) : undefined;\n}\n\nfunction getNestedValue(record: LooseRecord, ...keys: string[]): unknown {\n let current: unknown = record;\n for (const key of keys) {\n if (!isRecord(current)) {\n return undefined;\n }\n\n current = current[key];\n }\n\n return current;\n}\n\nfunction normalizePath(value: string): string {\n return resolve(expandHome(value));\n}\n\nfunction expandHome(value: string): string {\n if (value === '~') {\n return homedir();\n }\n\n if (value.startsWith('~/') || value.startsWith('~\\\\')) {\n return join(homedir(), value.slice(2));\n }\n\n return value;\n}\n\n/**\n * Resolve the network config from YAML. If a `name` field is present (e.g. \"testnet\"),\n * use the corresponding preset as the base, then overlay any explicit fields.\n */\nfunction resolveNetworkFromConfig(network: LooseRecord, defaults: NetworkConfig): NetworkConfig {\n const nameField = readString(network.name);\n const preset = nameField ? getNetworkPreset(nameField) : undefined;\n const base = preset ?? defaults;\n\n return {\n rpcUrl: readString(network.rpcUrl) ?? base.rpcUrl,\n faucetUrl: readString(network.faucetUrl) ?? base.faucetUrl,\n packageId: readHexString(network.packageId) ?? base.packageId,\n registryId: readHexString(network.registryId) ?? base.registryId,\n };\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction readPositiveInteger(value: unknown, field: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) {\n return value;\n }\n\n if (typeof value === 'string' && /^\\d+$/.test(value.trim())) {\n return Number(value.trim());\n }\n\n throw new Error(`${field} must be a non-negative integer.`);\n}\n\nfunction readHexString(value: unknown): string | undefined {\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) {\n return `0x${value.toString(16)}`;\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is LooseRecord {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n"],"mappings":"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","names":["resolve"]}
|
|
File without changes
|