@hivemind-os/collective-daemon 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-57QD6553.js +803 -0
- package/dist/chunk-57QD6553.js.map +1 -0
- package/dist/chunk-BHN4GOYD.js +1196 -0
- package/dist/chunk-BHN4GOYD.js.map +1 -0
- package/dist/chunk-BJW47ZD5.js +341 -0
- package/dist/chunk-BJW47ZD5.js.map +1 -0
- package/dist/chunk-CJHYQ7RR.js +656 -0
- package/dist/chunk-CJHYQ7RR.js.map +1 -0
- package/dist/chunk-NXIFS427.js +183 -0
- package/dist/chunk-NXIFS427.js.map +1 -0
- package/dist/chunk-Q3V4V7UR.js +305 -0
- package/dist/chunk-Q3V4V7UR.js.map +1 -0
- package/dist/chunk-VHECO532.js +1005 -0
- package/dist/chunk-VHECO532.js.map +1 -0
- package/dist/config-SuloXL2_.d.ts +90 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +523 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/server.d.ts +69 -0
- package/dist/ipc/server.js +8 -0
- package/dist/ipc/server.js.map +1 -0
- package/dist/portal/server.d.ts +72 -0
- package/dist/portal/server.js +10 -0
- package/dist/portal/server.js.map +1 -0
- package/dist/provider/index.d.ts +202 -0
- package/dist/provider/index.js +22 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/relay/index.d.ts +55 -0
- package/dist/relay/index.js +7 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/session-monitor-P9hNAFw4.d.ts +16 -0
- package/dist/state.d.ts +59 -0
- package/dist/state.js +11 -0
- package/dist/state.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport pino from 'pino';\n\nimport {\n AgentCache,\n type AuthProvider,\n type BlobStore,\n type OAuthConfig,\n type OAuthProvider,\n type X25519KeyPair,\n createDID,\n deriveEvmKey,\n Ed25519AuthProvider,\n ed25519ToX25519,\n EncryptedBlobStore,\n EventSubscription,\n EvmWallet,\n FilesystemBlobStore,\n HybridBlobStore,\n loadOrCreateKeypair,\n MeshSuiClient,\n RegistryClient,\n SqliteCursorStore,\n SpendingPolicyEngine,\n SessionExpiredError,\n TaskClient,\n WalrusBlobStore,\n X402Client,\n ZkLoginProvider,\n ZkLoginSessionStore,\n} from '@hivemind-os/collective-core';\nimport { PaymentRail, type DID } from '@hivemind-os/collective-types';\nimport type { Signer } from '@mysten/sui/cryptography';\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\n\nimport type { DaemonFullConfig } from './config.js';\n\nexport interface DaemonStatusBase {\n did: DID;\n address: string;\n evmAddress?: string;\n uptime: number;\n spendingToday: string;\n providerRunning: boolean;\n authMode: AuthProvider['mode'];\n authenticated: boolean;\n}\n\nexport interface DaemonIdentityContext {\n authProvider: AuthProvider;\n did: DID;\n identityKeypair: Ed25519Keypair;\n identitySecretKey: Uint8Array;\n}\n\nconst logger = pino({ name: '@hivemind-os/collective-daemon:state' });\n\nexport class DaemonState {\n readonly keypair: Signer;\n readonly identityKeypair: Ed25519Keypair;\n readonly authProvider: AuthProvider;\n readonly relayAuthProvider: AuthProvider;\n readonly did: DID;\n readonly suiClient: MeshSuiClient;\n readonly registryClient: RegistryClient;\n readonly taskClient: TaskClient;\n readonly agentCache: AgentCache;\n readonly blobStore: BlobStore;\n readonly encryptionKeyPair: X25519KeyPair;\n readonly encryption: {\n enabled: boolean;\n requireEncryption: boolean;\n publicKey?: string;\n };\n readonly spendingPolicy: SpendingPolicyEngine;\n readonly evmWallet?: EvmWallet;\n readonly x402Client?: X402Client;\n readonly network: DaemonFullConfig['network'];\n readonly startedAt: number;\n readonly address: string;\n\n private readonly cursorStore: SqliteCursorStore;\n private readonly subscriptions: EventSubscription[];\n private providerRunning = false;\n\n private constructor(params: {\n keypair: Signer;\n identityKeypair: Ed25519Keypair;\n authProvider: AuthProvider;\n relayAuthProvider: AuthProvider;\n did: DID;\n suiClient: MeshSuiClient;\n registryClient: RegistryClient;\n taskClient: TaskClient;\n agentCache: AgentCache;\n blobStore: BlobStore;\n encryptionKeyPair: X25519KeyPair;\n encryption: {\n enabled: boolean;\n requireEncryption: boolean;\n publicKey?: string;\n };\n spendingPolicy: SpendingPolicyEngine;\n evmWallet?: EvmWallet;\n x402Client?: X402Client;\n cursorStore: SqliteCursorStore;\n network: DaemonFullConfig['network'];\n address: string;\n }) {\n this.keypair = params.keypair;\n this.identityKeypair = params.identityKeypair;\n this.authProvider = params.authProvider;\n this.relayAuthProvider = params.relayAuthProvider;\n this.did = params.did;\n this.suiClient = params.suiClient;\n this.registryClient = params.registryClient;\n this.taskClient = params.taskClient;\n this.agentCache = params.agentCache;\n this.blobStore = params.blobStore;\n this.encryptionKeyPair = params.encryptionKeyPair;\n this.encryption = params.encryption;\n this.spendingPolicy = params.spendingPolicy;\n this.evmWallet = params.evmWallet;\n this.x402Client = params.x402Client;\n this.cursorStore = params.cursorStore;\n this.network = params.network;\n this.subscriptions = [];\n this.startedAt = Date.now();\n this.address = params.address;\n }\n\n static async create(config: DaemonFullConfig, identityContext?: DaemonIdentityContext): Promise<DaemonState> {\n await mkdir(config.daemon.dataDir, { recursive: true });\n await mkdir(config.identity.dataDir, { recursive: true });\n\n const context = identityContext ?? (await createDaemonIdentityContext(config));\n if (!context.authProvider.isAuthenticated()) {\n throw new Error('A valid auth session is required before the daemon can start.');\n }\n\n const suiClient = new MeshSuiClient(config.network);\n const registryClient = new RegistryClient(suiClient, config.network);\n const taskClient = new TaskClient(suiClient, config.network);\n const agentCache = new AgentCache(join(config.daemon.dataDir, 'agent-cache.sqlite'));\n const encryptionKeyPair = ed25519ToX25519(context.identitySecretKey);\n const baseBlobStore = await createBlobStore(config);\n const blobStore = config.encryption.enabled\n ? new EncryptedBlobStore(baseBlobStore, encryptionKeyPair)\n : baseBlobStore;\n const spendingPolicy = new SpendingPolicyEngine({\n policy: config.spending,\n dbPath: join(config.daemon.dataDir, 'spending.sqlite'),\n });\n const cursorStore = new SqliteCursorStore(join(config.daemon.dataDir, 'event-cursors.sqlite'));\n const address = await context.authProvider.getAddress();\n const paymentContext = createPaymentContext(config, context);\n\n return new DaemonState({\n keypair: context.authProvider.toSuiSigner(),\n identityKeypair: context.identityKeypair,\n authProvider: context.authProvider,\n relayAuthProvider: new Ed25519AuthProvider(context.identityKeypair),\n did: context.did,\n suiClient,\n registryClient,\n taskClient,\n agentCache,\n blobStore,\n encryptionKeyPair,\n encryption: {\n enabled: config.encryption.enabled,\n requireEncryption: config.encryption.requireEncryption,\n publicKey: config.encryption.enabled ? toHex(encryptionKeyPair.publicKey) : undefined,\n },\n spendingPolicy,\n evmWallet: paymentContext.evmWallet,\n x402Client: paymentContext.x402Client,\n cursorStore,\n network: config.network,\n address,\n });\n }\n\n setProviderRunning(providerRunning: boolean): void {\n this.providerRunning = providerRunning;\n }\n\n getStatusBase(): DaemonStatusBase {\n return {\n did: this.did,\n address: this.address,\n evmAddress: this.evmWallet?.address,\n uptime: Date.now() - this.startedAt,\n spendingToday: formatMistAsSui(this.spendingPolicy.getSpent('day', PaymentRail.SUI_ESCROW)),\n providerRunning: this.providerRunning,\n authMode: this.authProvider.mode,\n authenticated: this.authProvider.isAuthenticated(),\n };\n }\n\n async shutdown(): Promise<void> {\n this.providerRunning = false;\n for (const subscription of this.subscriptions) {\n subscription.stop();\n }\n\n this.subscriptions.length = 0;\n this.cursorStore.close();\n this.agentCache.close();\n this.spendingPolicy.close();\n }\n}\n\nexport async function createDaemonIdentityContext(config: DaemonFullConfig): Promise<DaemonIdentityContext> {\n await mkdir(config.daemon.dataDir, { recursive: true });\n await mkdir(config.identity.dataDir, { recursive: true });\n\n const identity = await loadOrCreateKeypair(config.identity.dataDir);\n const identityKeypair = Ed25519Keypair.fromSecretKey(identity.secretKey);\n const did = createDID(identity.publicKey);\n\n if (config.auth.mode !== 'zklogin') {\n return {\n authProvider: new Ed25519AuthProvider(identityKeypair),\n did,\n identityKeypair,\n identitySecretKey: identity.secretKey,\n };\n }\n\n const suiClient = new MeshSuiClient(config.network);\n const sessionStore = new ZkLoginSessionStore(\n join(config.daemon.dataDir, 'sessions'),\n deriveSessionEncryptionKey(identity.secretKey),\n );\n const currentEpoch = Number.parseInt((await suiClient.client.getCurrentEpoch()).epoch, 10);\n const persistedSession = await sessionStore.loadLatestValid(currentEpoch);\n const authProvider = new ZkLoginProvider({\n client: suiClient.client,\n oauth: buildOAuthConfig(config, '', getStoredOAuthProvider(persistedSession)),\n sessionStore,\n });\n try {\n await authProvider.restoreSession();\n } catch (error) {\n if (!(error instanceof SessionExpiredError)) {\n throw error;\n }\n\n logger.warn({ err: error, sessionState: authProvider.getSessionState() }, 'Stored zkLogin session requires re-authentication.');\n }\n\n return {\n authProvider,\n did,\n identityKeypair,\n identitySecretKey: identity.secretKey,\n };\n}\n\nexport function buildOAuthConfig(\n config: DaemonFullConfig,\n redirectUri = '',\n preferredProvider?: OAuthProvider,\n): OAuthConfig {\n const provider = resolveOAuthProvider(config, preferredProvider);\n\n if (provider === 'google') {\n return {\n provider,\n clientId: config.auth.google?.clientId ?? '',\n redirectUri,\n };\n }\n\n return {\n provider,\n clientId: config.auth.apple?.clientId ?? '',\n redirectUri,\n };\n}\n\nfunction resolveOAuthProvider(config: DaemonFullConfig, preferredProvider?: OAuthProvider): OAuthProvider {\n if (preferredProvider === 'google' && config.auth.google?.clientId) {\n return 'google';\n }\n\n if (preferredProvider === 'apple' && config.auth.apple?.clientId) {\n return 'apple';\n }\n\n if (config.auth.google?.clientId) {\n return 'google';\n }\n\n if (config.auth.apple?.clientId) {\n return 'apple';\n }\n\n throw new Error('OAuth provider configuration is incomplete.');\n}\n\nfunction getStoredOAuthProvider(session: { provider?: OAuthProvider; iss: string } | null): OAuthProvider | undefined {\n if (!session) {\n return undefined;\n }\n\n if (session.provider === 'google' || session.iss === 'https://accounts.google.com') {\n return 'google';\n }\n\n if (session.provider === 'apple' || session.iss === 'https://appleid.apple.com') {\n return 'apple';\n }\n\n return undefined;\n}\n\nfunction createPaymentContext(\n config: DaemonFullConfig,\n identityContext: DaemonIdentityContext,\n): { evmWallet?: EvmWallet; x402Client?: X402Client } {\n if (!config.payment.evm?.enabled || !(identityContext.authProvider instanceof ZkLoginProvider)) {\n return {};\n }\n\n const session = identityContext.authProvider.getSession();\n if (!session) {\n return {};\n }\n\n const privateKey = deriveEvmKey(identityContext.identitySecretKey, session.salt, session.sub);\n const evmWallet = new EvmWallet(privateKey, {\n network: config.payment.evm.network,\n rpcUrl: config.payment.evm.rpcUrl,\n });\n\n return {\n evmWallet,\n x402Client: new X402Client(evmWallet),\n };\n}\n\nasync function createBlobStore(config: DaemonFullConfig): Promise<BlobStore> {\n switch (config.blobstore.mode) {\n case 'filesystem': {\n const dataDir = config.blobstore.filesystem?.dataDir;\n if (!dataDir) {\n throw new Error('blobstore.filesystem.dataDir is required for filesystem mode.');\n }\n\n await mkdir(dataDir, { recursive: true });\n return new FilesystemBlobStore(dataDir);\n }\n case 'walrus': {\n const walrus = config.blobstore.walrus;\n if (!walrus?.publisherUrl || !walrus.aggregatorUrl) {\n throw new Error('blobstore.walrus.publisherUrl and blobstore.walrus.aggregatorUrl are required.');\n }\n\n return new WalrusBlobStore(walrus);\n }\n case 'hybrid': {\n const dataDir = config.blobstore.filesystem?.dataDir;\n const walrus = config.blobstore.walrus;\n if (!dataDir) {\n throw new Error('blobstore.filesystem.dataDir is required for hybrid mode.');\n }\n if (!walrus?.publisherUrl || !walrus.aggregatorUrl) {\n throw new Error('blobstore.walrus.publisherUrl and blobstore.walrus.aggregatorUrl are required for hybrid mode.');\n }\n\n await mkdir(dataDir, { recursive: true });\n return new HybridBlobStore(\n new WalrusBlobStore(walrus),\n new FilesystemBlobStore(dataDir),\n config.blobstore.hybrid,\n );\n }\n default:\n throw new Error(`Unsupported blobstore mode: ${String((config.blobstore as { mode?: unknown }).mode)}`);\n }\n}\n\nfunction deriveSessionEncryptionKey(secretKey: Uint8Array): Uint8Array {\n return createHash('sha256')\n .update(Buffer.from(secretKey))\n .update('hivemind-collective:zklogin-session:v1')\n .digest();\n}\n\nfunction formatMistAsSui(amountMist: bigint): string {\n const whole = amountMist / 1_000_000_000n;\n const fractional = amountMist % 1_000_000_000n;\n\n if (fractional === 0n) {\n return `${whole.toString()} SUI`;\n }\n\n return `${whole.toString()}.${fractional.toString().padStart(9, '0').replace(/0+$/, '')} SUI`;\n}\n\nfunction toHex(value: Uint8Array): string {\n return Buffer.from(value).toString('hex');\n}"],"mappings":"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","names":[]}
|