@undefineds.co/xpod 0.3.22 → 0.3.24
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/api/runs/PiAgentRuntimeDriver.d.ts +1 -0
- package/dist/api/runs/PiAgentRuntimeDriver.js +4 -1
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
- package/dist/identity/drizzle/PodLookupRepository.d.ts +8 -0
- package/dist/identity/drizzle/PodLookupRepository.js +22 -8
- package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
- package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +1 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js +4 -2
- package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -1
- package/dist/solidfs/LocalSolidFS.js +31 -124
- package/dist/solidfs/LocalSolidFS.js.map +1 -1
- package/dist/solidfs/SolidFsPathUtils.d.ts +13 -0
- package/dist/solidfs/SolidFsPathUtils.js +114 -0
- package/dist/solidfs/SolidFsPathUtils.js.map +1 -0
- package/dist/solidfs/SolidFsSyncJournal.d.ts +117 -0
- package/dist/solidfs/SolidFsSyncJournal.js +553 -0
- package/dist/solidfs/SolidFsSyncJournal.js.map +1 -0
- package/dist/solidfs/index.d.ts +1 -0
- package/dist/solidfs/index.js +1 -0
- package/dist/solidfs/index.js.map +1 -1
- package/dist/solidfs/types.d.ts +1 -0
- package/dist/solidfs/types.js.map +1 -1
- package/package.json +1 -1
- package/static/app/assets/main.js +32 -31
- package/templates/identity/account/create-pod.html.ejs +2 -4
|
@@ -47,7 +47,10 @@ class PiAgentRuntimeDriver {
|
|
|
47
47
|
this.git = new GitWorktreeService_1.GitWorktreeService();
|
|
48
48
|
this.warmRuntimes = new Map();
|
|
49
49
|
this.solidfs = options.solidfs ?? new solidfs_1.LocalSolidFS({
|
|
50
|
-
syncer: new solidfs_1.
|
|
50
|
+
syncer: new solidfs_1.WorkspaceJournaledSolidFsSyncer({
|
|
51
|
+
syncer: new solidfs_1.PodSolidFsSyncer(),
|
|
52
|
+
journalRoot: options.solidfsJournalRootDir,
|
|
53
|
+
}),
|
|
51
54
|
hydrator: new solidfs_1.PodSolidFsHydrator(),
|
|
52
55
|
});
|
|
53
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiAgentRuntimeDriver.js","sourceRoot":"","sources":["../../../src/api/runs/PiAgentRuntimeDriver.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as crypto from 'node:crypto';\nimport { createInterface } from 'node:readline';\nimport type { WorkspaceRef } from '../workspace/types';\nimport { getDefaultBaseUrl } from '../service/provider-registry';\nimport { getPlatformApiBaseUrl, getPlatformApiKey, getPlatformDefaultModel, getPlatformProviderId } from '../service/platform-ai-config';\nimport { GitWorktreeService } from '../chatkit/runtime/GitWorktreeService';\nimport { SandboxFactory } from '../../terminal/sandbox';\nimport { LocalSolidFS, PodSolidFsHydrator, PodSolidFsSyncer, SolidFsNotFoundError, type MaterializedWorkspace, type SolidFS, type SolidFsProjection } from '../../solidfs';\nimport type {\n AgentRuntimeConfig,\n AgentRuntimeEvent,\n} from './AgentRuntimeTypes';\nimport type { RunConversationMessage, RunExecutionBackend, RunExecutionInput } from './RunExecutionBackend';\n\ntype PiSdk = typeof import('@mariozechner/pi-coding-agent');\ntype AgentSessionEvent = import('@mariozechner/pi-coding-agent').AgentSessionEvent;\ntype CreateAgentSessionOptions = NonNullable<Parameters<PiSdk['createAgentSession']>[0]>;\ntype PiTool = ReturnType<PiSdk['createCodingTools']>[number];\ntype PiReadOperations = import('@mariozechner/pi-coding-agent').ReadOperations;\ntype PiEditOperations = import('@mariozechner/pi-coding-agent').EditOperations;\ntype PiWriteOperations = import('@mariozechner/pi-coding-agent').WriteOperations;\ntype PiApi = string;\ntype PiModel = {\n id: string;\n name: string;\n api: PiApi;\n provider: string;\n baseUrl: string;\n reasoning: boolean;\n input: Array<'text' | 'image'>;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n };\n contextWindow: number;\n maxTokens: number;\n compat?: Record<string, unknown>;\n};\ntype PiMessage =\n | {\n role: 'user';\n content: Array<{ type: 'text'; text: string }>;\n timestamp: number;\n }\n | {\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n api: PiApi;\n provider: string;\n model: string;\n usage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n totalTokens: number;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n total: number;\n };\n };\n stopReason: 'stop';\n timestamp: number;\n };\n\nexport interface PiAgentRuntimeDriverOptions {\n /**\n * local: run pi's full Agent Loop in the API process.\n * cloud: run the entire pi Agent Loop in a sandboxed worker process.\n */\n agentLoopIsolation?: 'in-process' | 'sandboxed-process';\n /**\n * Cloud defaults to strict sandboxing: do not fall back to an unsandboxed\n * process if sandbox-exec/bubblewrap is unavailable.\n */\n requireSandbox?: boolean;\n workerPath?: string;\n sandboxedLoopRunner?: (input: RunExecutionInput, workdir: string) => AsyncIterable<AgentRuntimeEvent>;\n sessionRootDir?: string;\n /**\n * Off by default: pi sessions are request-scoped implementation detail. When\n * enabled, the JSONL session is a diagnostic copy only; Xpod still restores\n * authoritative state from Run/Thread/Message before each execution.\n */\n persistPiSessions?: boolean;\n piSdk?: PiSdk;\n solidfs?: SolidFS;\n solidfsProjection?: SolidFsProjection;\n}\n\ntype WarmRuntime = {\n pi: PiSdk;\n workdir: string;\n piConfig: {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n };\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n authStorage: NonNullable<CreateAgentSessionOptions['authStorage']>;\n modelRegistry: NonNullable<CreateAgentSessionOptions['modelRegistry']>;\n settingsManager: ReturnType<PiSdk['SettingsManager']['inMemory']>;\n resourceLoader: NonNullable<CreateAgentSessionOptions['resourceLoader']>;\n tools: PiTool[];\n};\n\n/**\n * Request-scoped adapter around pi's AgentSession primitives.\n *\n * Xpod restores durable conversation state into pi with replaceMessages() on\n * every run. pi owns the atomic agent loop, tools and streaming events for the\n * current invocation only; its SessionManager is not the Xpod state center.\n */\nexport class PiAgentRuntimeDriver implements RunExecutionBackend {\n private static sdkPromise?: Promise<PiSdk>;\n\n private readonly git = new GitWorktreeService();\n private readonly warmRuntimes = new Map<string, Promise<WarmRuntime>>();\n private readonly solidfs: SolidFS;\n\n public constructor(private readonly options: PiAgentRuntimeDriverOptions = {}) {\n this.solidfs = options.solidfs ?? new LocalSolidFS({\n syncer: new PodSolidFsSyncer(),\n hydrator: new PodSolidFsHydrator(),\n });\n }\n\n public async *start(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n if (this.options.agentLoopIsolation === 'sandboxed-process') {\n let workspace: MaterializedWorkspace | undefined;\n let completed = false;\n try {\n workspace = await this.prepareWorkspace(input);\n const runner = this.options.sandboxedLoopRunner\n ?? ((runInput, runWorkdir) => this.startSandboxedAgentLoop(runInput, runWorkdir));\n for await (const event of runner(input, workspace.cwd)) {\n yield event;\n if (event.type === 'error') {\n return;\n }\n }\n await workspace.commit();\n completed = true;\n } catch (error) {\n yield this.startupErrorToEvent(error);\n } finally {\n if (!completed) {\n await workspace?.rollback().catch((error) => {\n this.logWorkspaceRollbackError(error);\n });\n }\n }\n return;\n }\n\n yield* this.startInProcess(input);\n }\n\n private async *startInProcess(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n let session: Awaited<ReturnType<PiSdk['createAgentSession']>>['session'] | undefined;\n let workspace: MaterializedWorkspace | undefined;\n let completed = false;\n let failed = false;\n\n try {\n workspace = await this.prepareWorkspace(input);\n const runtime = await this.getWarmRuntime(input, workspace);\n const sessionManager = this.createSessionManager(runtime.pi, input.runId, runtime.workdir);\n const result = await runtime.pi.createAgentSession({\n cwd: runtime.workdir,\n authStorage: runtime.authStorage,\n modelRegistry: runtime.modelRegistry,\n settingsManager: runtime.settingsManager,\n sessionManager,\n resourceLoader: runtime.resourceLoader,\n model: runtime.piConfig.model,\n thinkingLevel: runtime.thinkingLevel,\n tools: runtime.tools,\n });\n session = result.session;\n session.agent.replaceMessages(this.toPiMessages(input.conversation, runtime.piConfig));\n\n const streamState = {\n lastAssistantText: '',\n assistantTextStreamed: false,\n };\n const unsubscribe = session.subscribe((event) => {\n this.projectPiEvent(event, queue, streamState);\n });\n\n void session.prompt(input.prompt, { expandPromptTemplates: false, source: 'rpc' }).then(() => {\n if (!streamState.assistantTextStreamed && streamState.lastAssistantText.length > 0) {\n queue.push({ type: 'text', text: streamState.lastAssistantText });\n }\n queue.close();\n }).catch((error) => {\n queue.push({ type: 'error', message: this.formatError(error) });\n queue.close();\n }).finally(() => {\n unsubscribe();\n session?.dispose();\n });\n\n for await (const event of queue.iterate()) {\n if (event.type === 'error') {\n failed = true;\n }\n yield event;\n }\n if (!failed) {\n await workspace.commit();\n completed = true;\n }\n } catch (error) {\n session?.dispose();\n yield this.startupErrorToEvent(error);\n } finally {\n if (!completed) {\n await workspace?.rollback().catch((error) => {\n this.logWorkspaceRollbackError(error);\n });\n }\n }\n }\n\n private startSandboxedAgentLoop(input: RunExecutionInput, workdir: string): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n const requireSandbox = this.options.requireSandbox ?? true;\n\n if (requireSandbox && !SandboxFactory.isAvailable()) {\n queue.push({ type: 'error', message: 'Cloud Agent Runtime requires an OS sandbox, but none is available on this host' });\n queue.close();\n return queue.iterate();\n }\n\n const child = SandboxFactory.launch({\n workdir,\n command: process.execPath,\n args: [this.resolveWorkerPath()],\n env: this.workerEnv(),\n isolateNetwork: false,\n });\n\n if (requireSandbox && !child.sandboxed) {\n child.process.kill();\n queue.push({ type: 'error', message: 'Cloud Agent Runtime refused to run without a sandbox' });\n queue.close();\n return queue.iterate();\n }\n\n const stderrChunks: Buffer[] = [];\n const stderrMaxBytes = 16 * 1024;\n let closed = false;\n\n const closeOnce = (): void => {\n if (closed) {\n return;\n }\n closed = true;\n queue.close();\n };\n\n child.process.stdin?.end(JSON.stringify({\n input,\n options: {\n persistPiSessions: this.options.persistPiSessions === true,\n sessionRootDir: this.options.sessionRootDir,\n },\n }));\n\n const rl = createInterface({ input: child.process.stdout! });\n rl.on('line', (line) => {\n if (!line.startsWith(PI_AGENT_WORKER_EVENT_PREFIX)) {\n return;\n }\n const payload = line.slice(PI_AGENT_WORKER_EVENT_PREFIX.length);\n try {\n queue.push(JSON.parse(payload) as AgentRuntimeEvent);\n } catch (error) {\n queue.push({ type: 'error', message: `Invalid Agent Runtime worker event: ${this.formatError(error)}` });\n }\n });\n\n child.process.stderr?.on('data', (chunk: Buffer) => {\n if (Buffer.concat(stderrChunks).length < stderrMaxBytes) {\n stderrChunks.push(chunk);\n }\n });\n\n child.process.on('error', (error) => {\n queue.push({ type: 'error', message: `Agent Runtime worker failed to start: ${this.formatError(error)}` });\n closeOnce();\n });\n\n child.process.on('close', (code, signal) => {\n rl.close();\n if (code !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString('utf-8').trim();\n const suffix = stderr ? `: ${stderr}` : signal ? ` (signal ${signal})` : '';\n queue.push({ type: 'error', message: `Agent Runtime worker exited with code ${code ?? 'null'}${suffix}` });\n }\n closeOnce();\n });\n\n return queue.iterate();\n }\n\n private projectPiEvent(\n event: AgentSessionEvent,\n queue: AsyncPushQueue<AgentRuntimeEvent>,\n state: {\n lastAssistantText: string;\n assistantTextStreamed: boolean;\n },\n ): void {\n if (event.type === 'message_update' && event.assistantMessageEvent?.type === 'text_delta') {\n queue.push({ type: 'text', text: event.assistantMessageEvent.delta });\n state.assistantTextStreamed = true;\n return;\n }\n\n if (event.type === 'message_update' && event.message.role === 'assistant') {\n state.lastAssistantText = this.extractText(event.message.content);\n return;\n }\n\n if (event.type === 'message_end' && event.message.role === 'assistant') {\n const finalText = this.extractText(event.message.content);\n const alreadyStreamed = state.assistantTextStreamed;\n state.lastAssistantText = '';\n state.assistantTextStreamed = false;\n if (!alreadyStreamed && finalText.length > 0) {\n queue.push({ type: 'text', text: finalText });\n }\n return;\n }\n\n // pi emits tool_execution_start for its own read/bash/edit/write tools.\n // Those are internal runtime activity, not client-side tool requests.\n }\n\n private resolvePiConfig(config: AgentRuntimeConfig): {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n } {\n const baseUrl = config.agentConfig?.baseUrl || getPlatformApiBaseUrl();\n const provider = this.resolveProviderId(baseUrl);\n const apiKey = config.agentConfig?.apiKey || getPlatformApiKey();\n if (!apiKey) {\n throw new Error('No API key configured for pi Agent Runtime. Store the agent credential in the Pod or set DEFAULT_API_KEY for local development.');\n }\n const resolvedBaseUrl = baseUrl || getDefaultBaseUrl(provider);\n const modelId = config.agentConfig?.model || getPlatformDefaultModel();\n const api = this.resolveApiForBaseUrl(resolvedBaseUrl);\n\n return {\n provider,\n apiKey,\n api,\n baseUrl: resolvedBaseUrl,\n model: {\n id: modelId,\n name: modelId,\n api,\n provider,\n baseUrl: resolvedBaseUrl,\n reasoning: false,\n input: ['text'],\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n contextWindow: 128_000,\n maxTokens: 8192,\n compat: api === 'openai-completions'\n ? {\n supportsStore: false,\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n }\n : undefined,\n },\n };\n }\n\n private resolveProviderId(baseUrl: string | undefined): string {\n const configured = getPlatformProviderId();\n if (configured && configured !== 'undefineds') {\n return configured;\n }\n if (!baseUrl) {\n return 'xpod';\n }\n try {\n const host = new URL(baseUrl).hostname;\n if (host.includes('openai.com')) return 'openai';\n if (host.includes('anthropic.com')) return 'anthropic';\n if (host.includes('openrouter.ai')) return 'openrouter';\n if (host.includes('deepseek.com')) return 'deepseek';\n if (host.includes('mistral.ai')) return 'mistral';\n if (host === 'localhost' || host === '127.0.0.1') return 'ollama';\n } catch {\n // fall through to xpod\n }\n return 'xpod';\n }\n\n private resolveApiForBaseUrl(baseUrl: string): PiApi {\n try {\n const host = new URL(baseUrl).hostname;\n return host === 'api.openai.com' ? 'openai-responses' : 'openai-completions';\n } catch {\n return 'openai-completions';\n }\n }\n\n private resolveThinkingLevel(config: AgentRuntimeConfig): 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' {\n const level = (config.agentConfig as any)?.thinkingLevel;\n return level === 'minimal' || level === 'low' || level === 'medium' || level === 'high' || level === 'xhigh'\n ? level\n : 'off';\n }\n\n private resolveTools(pi: PiSdk, workspace: MaterializedWorkspace, config: AgentRuntimeConfig): PiTool[] {\n const workdir = workspace.cwd;\n const permissionMode = config.agentConfig?.permissionMode;\n const allowed = new Set(config.agentConfig?.allowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const disallowed = new Set(config.agentConfig?.disallowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const baseTools = permissionMode === 'plan' || allowed.size > 0\n ? this.createSolidFsReadOnlyTools(pi, workspace)\n : this.createSolidFsCodingTools(pi, workspace);\n\n return baseTools.filter((tool) => {\n const name = tool.name.toLowerCase();\n if (disallowed.has(name)) {\n return false;\n }\n return allowed.size === 0 || allowed.has(name);\n }) as PiTool[];\n }\n\n private async getWarmRuntime(input: RunExecutionInput, workspace: MaterializedWorkspace): Promise<WarmRuntime> {\n const pi = await this.loadPiSdk();\n const workdir = workspace.cwd;\n const key = this.warmRuntimeKey(workdir, input.config);\n const existing = this.warmRuntimes.get(key);\n if (existing) {\n return existing;\n }\n\n const created = this.createWarmRuntime(pi, workspace, input.config).catch((error) => {\n this.warmRuntimes.delete(key);\n throw error;\n });\n this.warmRuntimes.set(key, created);\n return created;\n }\n\n private async createWarmRuntime(pi: PiSdk, workspace: MaterializedWorkspace, config: AgentRuntimeConfig): Promise<WarmRuntime> {\n const workdir = workspace.cwd;\n const piConfig = this.resolvePiConfig(config);\n const authStorage = pi.AuthStorage.inMemory();\n authStorage.setRuntimeApiKey(piConfig.provider, piConfig.apiKey);\n\n const modelRegistry = new pi.ModelRegistry(authStorage, undefined);\n modelRegistry.registerProvider(piConfig.provider, {\n baseUrl: piConfig.baseUrl,\n apiKey: piConfig.apiKey,\n api: piConfig.api,\n models: [ piConfig.model ],\n });\n\n const thinkingLevel = this.resolveThinkingLevel(config);\n const settingsManager = pi.SettingsManager.inMemory({\n defaultProvider: piConfig.provider,\n defaultModel: piConfig.model.id,\n defaultThinkingLevel: thinkingLevel,\n });\n\n const resourceLoader = new pi.DefaultResourceLoader({\n cwd: workdir,\n settingsManager,\n systemPrompt: config.agentConfig?.systemPrompt,\n appendSystemPrompt: config.agentConfig?.skillsContent,\n noExtensions: true,\n noSkills: true,\n noPromptTemplates: true,\n noThemes: true,\n });\n await resourceLoader.reload();\n\n return {\n pi,\n workdir,\n piConfig,\n thinkingLevel,\n authStorage,\n modelRegistry,\n settingsManager,\n resourceLoader,\n tools: this.resolveTools(pi, workspace, config),\n };\n }\n\n private createSolidFsCodingTools(pi: PiSdk, workspace: MaterializedWorkspace): PiTool[] {\n if (!this.canHydrateWorkspace(workspace)) {\n return pi.createCodingTools(workspace.cwd);\n }\n\n return [\n pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }) as PiTool,\n pi.createBashTool(workspace.cwd) as PiTool,\n pi.createEditTool(workspace.cwd, { operations: this.createSolidFsEditOperations(workspace) }) as PiTool,\n pi.createWriteTool(workspace.cwd, { operations: this.createSolidFsWriteOperations(workspace) }) as PiTool,\n ];\n }\n\n private createSolidFsReadOnlyTools(pi: PiSdk, workspace: MaterializedWorkspace): PiTool[] {\n if (!this.canHydrateWorkspace(workspace)) {\n return pi.createReadOnlyTools(workspace.cwd);\n }\n\n return [\n pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }) as PiTool,\n ...pi.createReadOnlyTools(workspace.cwd).filter((tool) => tool.name !== 'read'),\n ];\n }\n\n private createSolidFsReadOperations(workspace: MaterializedWorkspace): PiReadOperations {\n return {\n readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),\n access: async (absolutePath) => {\n await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK);\n },\n detectImageMimeType: async (absolutePath) => this.detectImageMimeType(await this.ensureSolidFsPath(workspace, absolutePath)),\n };\n }\n\n private createSolidFsEditOperations(workspace: MaterializedWorkspace): PiEditOperations {\n return {\n readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),\n writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),\n access: async (absolutePath) => {\n await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK | fs.constants.W_OK);\n },\n };\n }\n\n private createSolidFsWriteOperations(workspace: MaterializedWorkspace): PiWriteOperations {\n return {\n writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),\n mkdir: (dir) => fs.promises.mkdir(dir, { recursive: true }).then(() => undefined),\n };\n }\n\n private async ensureSolidFsWritablePath(workspace: MaterializedWorkspace, absolutePath: string): Promise<string> {\n try {\n return await this.ensureSolidFsPath(workspace, absolutePath);\n } catch (error) {\n if (error instanceof SolidFsNotFoundError) {\n return path.resolve(absolutePath);\n }\n throw error;\n }\n }\n\n private async ensureSolidFsPath(workspace: MaterializedWorkspace, absolutePath: string): Promise<string> {\n if (!this.canHydrateWorkspace(workspace)) {\n return absolutePath;\n }\n\n const resolved = path.resolve(absolutePath);\n const root = path.resolve(workspace.cwd);\n if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {\n return absolutePath;\n }\n\n try {\n await fs.promises.access(resolved, fs.constants.F_OK);\n return resolved;\n } catch {\n const relativePath = path.relative(root, resolved);\n await workspace.hydrate(relativePath);\n return resolved;\n }\n }\n\n private canHydrateWorkspace(workspace: MaterializedWorkspace): workspace is MaterializedWorkspace & Required<Pick<MaterializedWorkspace, 'hydrate'>> {\n return workspace.manifest.projection === 'hydrated-object' && typeof workspace.hydrate === 'function';\n }\n\n private async detectImageMimeType(absolutePath: string): Promise<string | null> {\n const handle = await fs.promises.open(absolutePath, 'r');\n try {\n const buffer = Buffer.alloc(12);\n const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);\n const header = buffer.subarray(0, bytesRead);\n if (header.subarray(0, 3).equals(Buffer.from([0xff, 0xd8, 0xff]))) {\n return 'image/jpeg';\n }\n if (header.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {\n return 'image/png';\n }\n if (header.subarray(0, 6).toString('ascii') === 'GIF87a' || header.subarray(0, 6).toString('ascii') === 'GIF89a') {\n return 'image/gif';\n }\n if (header.subarray(0, 4).toString('ascii') === 'RIFF' && header.subarray(8, 12).toString('ascii') === 'WEBP') {\n return 'image/webp';\n }\n return null;\n } finally {\n await handle.close();\n }\n }\n\n private warmRuntimeKey(workdir: string, config: AgentRuntimeConfig): string {\n const agent = config.agentConfig;\n return JSON.stringify({\n workdir,\n baseUrl: agent?.baseUrl ?? getPlatformApiBaseUrl(),\n model: agent?.model ?? getPlatformDefaultModel(),\n apiKeyHash: this.hashSecret(agent?.apiKey ?? getPlatformApiKey()),\n systemPrompt: agent?.systemPrompt ?? '',\n skillsContent: agent?.skillsContent ?? '',\n permissionMode: agent?.permissionMode ?? '',\n allowedTools: agent?.allowedTools ?? [],\n disallowedTools: agent?.disallowedTools ?? [],\n persistPiSessions: this.options.persistPiSessions === true,\n agentLoopIsolation: this.options.agentLoopIsolation ?? 'in-process',\n thinkingLevel: this.resolveThinkingLevel(config),\n });\n }\n\n private hashSecret(value: string | undefined): string {\n return value\n ? crypto.createHash('sha256').update(value).digest('hex').slice(0, 16)\n : '';\n }\n\n private toPiMessages(\n conversation: RunConversationMessage[],\n config: { api: PiApi; provider: string; model: PiModel },\n ): PiMessage[] {\n return conversation.map((message) => {\n if (message.role === 'user') {\n return {\n role: 'user',\n content: [{ type: 'text', text: message.text }],\n timestamp: message.createdAt * 1000,\n };\n }\n return {\n role: 'assistant',\n content: [{ type: 'text', text: message.text }],\n api: config.api,\n provider: config.provider,\n model: config.model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n },\n stopReason: 'stop',\n timestamp: message.createdAt * 1000,\n };\n });\n }\n\n private async prepareWorkspace(input: RunExecutionInput): Promise<MaterializedWorkspace> {\n const source = await this.resolveWorkspaceSource(input.threadId, input.config.workspace, input.config);\n return this.solidfs.prepare({\n run: {\n id: input.runId,\n workspace: input.config.workspace,\n },\n workspace: input.config.workspace,\n sourcePath: source.sourcePath,\n projection: this.options.solidfsProjection ?? 'direct',\n context: input.context,\n });\n }\n\n private async resolveWorkspaceSource(\n threadId: string,\n workspace: WorkspaceRef,\n config?: AgentRuntimeConfig,\n ): Promise<{ sourcePath?: string }> {\n const url = new URL(workspace);\n let sourcePath: string | undefined;\n\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n const mapped = this.mapPodUrlToLocalPath(workspace);\n if (!mapped || !fs.existsSync(mapped)) {\n throw new WaitingRunnerError(workspace, `Workspace is not mounted on this runner: ${workspace}`);\n }\n sourcePath = mapped;\n } else if (url.protocol === 'file:') {\n if (!this.canResolveFileWorkspace(url)) {\n throw new WaitingRunnerError(workspace, `Waiting for a runner that can resolve workspace ${workspace}`);\n }\n sourcePath = decodeURIComponent(url.pathname);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`workspace reference does not exist on this runner: ${workspace}`);\n }\n } else {\n throw new Error(`Unsupported workspace reference protocol: ${url.protocol}`);\n }\n\n const worktree = config?.worktree;\n if (!worktree) {\n return { sourcePath };\n }\n\n const repoRoot = sourcePath;\n if (!repoRoot) {\n throw new Error(`Cannot create worktree without a local workspace source: ${workspace}`);\n }\n\n if (worktree.mode === 'existing') {\n if (!fs.existsSync(worktree.path)) {\n throw new Error(`worktree.path not found: ${worktree.path}`);\n }\n return { sourcePath: worktree.path };\n }\n\n await this.git.assertGitRepo(repoRoot);\n\n const root = path.join(repoRoot, '.xpod-worktrees');\n const worktreePath = path.join(root, threadId);\n\n if (fs.existsSync(worktreePath)) {\n return { sourcePath: worktreePath };\n }\n\n await this.git.createWorktree({\n repoPath: repoRoot,\n worktreePath,\n baseRef: worktree.baseRef ?? 'main',\n branch: worktree.branch,\n });\n\n return { sourcePath: worktreePath };\n }\n\n private canResolveFileWorkspace(url: URL): boolean {\n const authority = url.hostname;\n if (!authority || authority === 'localhost') {\n return true;\n }\n const configured = process.env.XPOD_RUNNER_AUTHORITY?.trim();\n return authority === configured || authority === os.hostname();\n }\n\n private mapPodUrlToLocalPath(rootUrl: string): string | undefined {\n const rootFilePath = process.env.CSS_ROOT_FILE_PATH;\n const baseUrl = process.env.CSS_BASE_URL;\n if (!rootFilePath || !baseUrl) {\n return undefined;\n }\n\n try {\n const base = new URL(baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`);\n const pod = new URL(rootUrl.endsWith('/') ? rootUrl : `${rootUrl}/`);\n if (base.origin !== pod.origin) {\n return undefined;\n }\n if (!pod.pathname.startsWith(base.pathname)) {\n return undefined;\n }\n const relativePath = decodeURIComponent(pod.pathname.slice(base.pathname.length)).replace(/\\/+$/, '');\n const resolvedRoot = path.resolve(rootFilePath);\n const resolved = path.resolve(resolvedRoot, relativePath);\n if (resolved !== resolvedRoot && !resolved.startsWith(`${resolvedRoot}${path.sep}`)) {\n return undefined;\n }\n return resolved;\n } catch {\n return undefined;\n }\n }\n\n private createSessionManager(pi: PiSdk, runId: string, workdir: string): ReturnType<PiSdk['SessionManager']['inMemory']> {\n if (this.options.persistPiSessions) {\n return pi.SessionManager.create(workdir, this.resolveSessionDir(runId, workdir));\n }\n return pi.SessionManager.inMemory(workdir);\n }\n\n private resolveSessionDir(runId: string, workdir: string): string {\n const root = this.options.sessionRootDir ?? path.join(os.tmpdir(), 'xpod-pi-sessions');\n const hash = crypto.createHash('sha256').update(`${workdir}:${runId}`).digest('hex').slice(0, 20);\n return path.join(root, hash);\n }\n\n private resolveWorkerPath(): string {\n if (this.options.workerPath) {\n return this.options.workerPath;\n }\n return path.join(__dirname, `PiAgentRuntimeWorker${path.extname(__filename)}`);\n }\n\n private workerEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') {\n env[key] = value;\n }\n }\n env.XPOD_AGENT_LOOP_WORKER = '1';\n return env;\n }\n\n private extractText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n return content\n .map((part) => {\n if (part && typeof part === 'object' && (part as any).type === 'text') {\n return typeof (part as any).text === 'string' ? (part as any).text : '';\n }\n return '';\n })\n .join('');\n }\n\n private formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private startupErrorToEvent(error: unknown): AgentRuntimeEvent {\n if (error instanceof WaitingRunnerError) {\n return {\n type: 'waiting_runner',\n workspace: error.workspace,\n message: error.message,\n };\n }\n return { type: 'error', message: this.formatError(error) };\n }\n\n private logWorkspaceRollbackError(error: unknown): void {\n console.warn(`SolidFS rollback failed: ${this.formatError(error)}`);\n }\n\n private async loadPiSdk(): Promise<PiSdk> {\n if (this.options.piSdk) {\n return this.options.piSdk;\n }\n if (PiAgentRuntimeDriver.sdkPromise) {\n return PiAgentRuntimeDriver.sdkPromise;\n }\n // Keep a native dynamic import so the CommonJS build can lazily load pi's\n // ESM-only package instead of requiring it during CSS component discovery.\n const nativeImport = new Function('specifier', 'return import(specifier)') as (specifier: string) => Promise<PiSdk>;\n PiAgentRuntimeDriver.sdkPromise = nativeImport('@mariozechner/pi-coding-agent');\n return PiAgentRuntimeDriver.sdkPromise;\n }\n}\n\nexport const PI_AGENT_WORKER_EVENT_PREFIX = 'XPOD_AGENT_EVENT ';\n\nclass WaitingRunnerError extends Error {\n public constructor(\n public readonly workspace: WorkspaceRef,\n message: string,\n ) {\n super(message);\n }\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private closed = false;\n\n public push(item: T): void {\n if (this.closed) {\n return;\n }\n this.items.push(item);\n const resolver = this.resolvers.shift();\n resolver?.();\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const resolver of this.resolvers) {\n resolver();\n }\n this.resolvers = [];\n }\n\n public async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this.closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PiAgentRuntimeDriver.js","sourceRoot":"","sources":["../../../src/api/runs/PiAgentRuntimeDriver.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as crypto from 'node:crypto';\nimport { createInterface } from 'node:readline';\nimport type { WorkspaceRef } from '../workspace/types';\nimport { getDefaultBaseUrl } from '../service/provider-registry';\nimport { getPlatformApiBaseUrl, getPlatformApiKey, getPlatformDefaultModel, getPlatformProviderId } from '../service/platform-ai-config';\nimport { GitWorktreeService } from '../chatkit/runtime/GitWorktreeService';\nimport { SandboxFactory } from '../../terminal/sandbox';\nimport { LocalSolidFS, PodSolidFsHydrator, PodSolidFsSyncer, SolidFsNotFoundError, WorkspaceJournaledSolidFsSyncer, type MaterializedWorkspace, type SolidFS, type SolidFsProjection } from '../../solidfs';\nimport type {\n AgentRuntimeConfig,\n AgentRuntimeEvent,\n} from './AgentRuntimeTypes';\nimport type { RunConversationMessage, RunExecutionBackend, RunExecutionInput } from './RunExecutionBackend';\n\ntype PiSdk = typeof import('@mariozechner/pi-coding-agent');\ntype AgentSessionEvent = import('@mariozechner/pi-coding-agent').AgentSessionEvent;\ntype CreateAgentSessionOptions = NonNullable<Parameters<PiSdk['createAgentSession']>[0]>;\ntype PiTool = ReturnType<PiSdk['createCodingTools']>[number];\ntype PiReadOperations = import('@mariozechner/pi-coding-agent').ReadOperations;\ntype PiEditOperations = import('@mariozechner/pi-coding-agent').EditOperations;\ntype PiWriteOperations = import('@mariozechner/pi-coding-agent').WriteOperations;\ntype PiApi = string;\ntype PiModel = {\n id: string;\n name: string;\n api: PiApi;\n provider: string;\n baseUrl: string;\n reasoning: boolean;\n input: Array<'text' | 'image'>;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n };\n contextWindow: number;\n maxTokens: number;\n compat?: Record<string, unknown>;\n};\ntype PiMessage =\n | {\n role: 'user';\n content: Array<{ type: 'text'; text: string }>;\n timestamp: number;\n }\n | {\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n api: PiApi;\n provider: string;\n model: string;\n usage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n totalTokens: number;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n total: number;\n };\n };\n stopReason: 'stop';\n timestamp: number;\n };\n\nexport interface PiAgentRuntimeDriverOptions {\n /**\n * local: run pi's full Agent Loop in the API process.\n * cloud: run the entire pi Agent Loop in a sandboxed worker process.\n */\n agentLoopIsolation?: 'in-process' | 'sandboxed-process';\n /**\n * Cloud defaults to strict sandboxing: do not fall back to an unsandboxed\n * process if sandbox-exec/bubblewrap is unavailable.\n */\n requireSandbox?: boolean;\n workerPath?: string;\n sandboxedLoopRunner?: (input: RunExecutionInput, workdir: string) => AsyncIterable<AgentRuntimeEvent>;\n sessionRootDir?: string;\n /**\n * Off by default: pi sessions are request-scoped implementation detail. When\n * enabled, the JSONL session is a diagnostic copy only; Xpod still restores\n * authoritative state from Run/Thread/Message before each execution.\n */\n persistPiSessions?: boolean;\n piSdk?: PiSdk;\n solidfs?: SolidFS;\n solidfsProjection?: SolidFsProjection;\n solidfsJournalRootDir?: string;\n}\n\ntype WarmRuntime = {\n pi: PiSdk;\n workdir: string;\n piConfig: {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n };\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n authStorage: NonNullable<CreateAgentSessionOptions['authStorage']>;\n modelRegistry: NonNullable<CreateAgentSessionOptions['modelRegistry']>;\n settingsManager: ReturnType<PiSdk['SettingsManager']['inMemory']>;\n resourceLoader: NonNullable<CreateAgentSessionOptions['resourceLoader']>;\n tools: PiTool[];\n};\n\n/**\n * Request-scoped adapter around pi's AgentSession primitives.\n *\n * Xpod restores durable conversation state into pi with replaceMessages() on\n * every run. pi owns the atomic agent loop, tools and streaming events for the\n * current invocation only; its SessionManager is not the Xpod state center.\n */\nexport class PiAgentRuntimeDriver implements RunExecutionBackend {\n private static sdkPromise?: Promise<PiSdk>;\n\n private readonly git = new GitWorktreeService();\n private readonly warmRuntimes = new Map<string, Promise<WarmRuntime>>();\n private readonly solidfs: SolidFS;\n\n public constructor(private readonly options: PiAgentRuntimeDriverOptions = {}) {\n this.solidfs = options.solidfs ?? new LocalSolidFS({\n syncer: new WorkspaceJournaledSolidFsSyncer({\n syncer: new PodSolidFsSyncer(),\n journalRoot: options.solidfsJournalRootDir,\n }),\n hydrator: new PodSolidFsHydrator(),\n });\n }\n\n public async *start(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n if (this.options.agentLoopIsolation === 'sandboxed-process') {\n let workspace: MaterializedWorkspace | undefined;\n let completed = false;\n try {\n workspace = await this.prepareWorkspace(input);\n const runner = this.options.sandboxedLoopRunner\n ?? ((runInput, runWorkdir) => this.startSandboxedAgentLoop(runInput, runWorkdir));\n for await (const event of runner(input, workspace.cwd)) {\n yield event;\n if (event.type === 'error') {\n return;\n }\n }\n await workspace.commit();\n completed = true;\n } catch (error) {\n yield this.startupErrorToEvent(error);\n } finally {\n if (!completed) {\n await workspace?.rollback().catch((error) => {\n this.logWorkspaceRollbackError(error);\n });\n }\n }\n return;\n }\n\n yield* this.startInProcess(input);\n }\n\n private async *startInProcess(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n let session: Awaited<ReturnType<PiSdk['createAgentSession']>>['session'] | undefined;\n let workspace: MaterializedWorkspace | undefined;\n let completed = false;\n let failed = false;\n\n try {\n workspace = await this.prepareWorkspace(input);\n const runtime = await this.getWarmRuntime(input, workspace);\n const sessionManager = this.createSessionManager(runtime.pi, input.runId, runtime.workdir);\n const result = await runtime.pi.createAgentSession({\n cwd: runtime.workdir,\n authStorage: runtime.authStorage,\n modelRegistry: runtime.modelRegistry,\n settingsManager: runtime.settingsManager,\n sessionManager,\n resourceLoader: runtime.resourceLoader,\n model: runtime.piConfig.model,\n thinkingLevel: runtime.thinkingLevel,\n tools: runtime.tools,\n });\n session = result.session;\n session.agent.replaceMessages(this.toPiMessages(input.conversation, runtime.piConfig));\n\n const streamState = {\n lastAssistantText: '',\n assistantTextStreamed: false,\n };\n const unsubscribe = session.subscribe((event) => {\n this.projectPiEvent(event, queue, streamState);\n });\n\n void session.prompt(input.prompt, { expandPromptTemplates: false, source: 'rpc' }).then(() => {\n if (!streamState.assistantTextStreamed && streamState.lastAssistantText.length > 0) {\n queue.push({ type: 'text', text: streamState.lastAssistantText });\n }\n queue.close();\n }).catch((error) => {\n queue.push({ type: 'error', message: this.formatError(error) });\n queue.close();\n }).finally(() => {\n unsubscribe();\n session?.dispose();\n });\n\n for await (const event of queue.iterate()) {\n if (event.type === 'error') {\n failed = true;\n }\n yield event;\n }\n if (!failed) {\n await workspace.commit();\n completed = true;\n }\n } catch (error) {\n session?.dispose();\n yield this.startupErrorToEvent(error);\n } finally {\n if (!completed) {\n await workspace?.rollback().catch((error) => {\n this.logWorkspaceRollbackError(error);\n });\n }\n }\n }\n\n private startSandboxedAgentLoop(input: RunExecutionInput, workdir: string): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n const requireSandbox = this.options.requireSandbox ?? true;\n\n if (requireSandbox && !SandboxFactory.isAvailable()) {\n queue.push({ type: 'error', message: 'Cloud Agent Runtime requires an OS sandbox, but none is available on this host' });\n queue.close();\n return queue.iterate();\n }\n\n const child = SandboxFactory.launch({\n workdir,\n command: process.execPath,\n args: [this.resolveWorkerPath()],\n env: this.workerEnv(),\n isolateNetwork: false,\n });\n\n if (requireSandbox && !child.sandboxed) {\n child.process.kill();\n queue.push({ type: 'error', message: 'Cloud Agent Runtime refused to run without a sandbox' });\n queue.close();\n return queue.iterate();\n }\n\n const stderrChunks: Buffer[] = [];\n const stderrMaxBytes = 16 * 1024;\n let closed = false;\n\n const closeOnce = (): void => {\n if (closed) {\n return;\n }\n closed = true;\n queue.close();\n };\n\n child.process.stdin?.end(JSON.stringify({\n input,\n options: {\n persistPiSessions: this.options.persistPiSessions === true,\n sessionRootDir: this.options.sessionRootDir,\n },\n }));\n\n const rl = createInterface({ input: child.process.stdout! });\n rl.on('line', (line) => {\n if (!line.startsWith(PI_AGENT_WORKER_EVENT_PREFIX)) {\n return;\n }\n const payload = line.slice(PI_AGENT_WORKER_EVENT_PREFIX.length);\n try {\n queue.push(JSON.parse(payload) as AgentRuntimeEvent);\n } catch (error) {\n queue.push({ type: 'error', message: `Invalid Agent Runtime worker event: ${this.formatError(error)}` });\n }\n });\n\n child.process.stderr?.on('data', (chunk: Buffer) => {\n if (Buffer.concat(stderrChunks).length < stderrMaxBytes) {\n stderrChunks.push(chunk);\n }\n });\n\n child.process.on('error', (error) => {\n queue.push({ type: 'error', message: `Agent Runtime worker failed to start: ${this.formatError(error)}` });\n closeOnce();\n });\n\n child.process.on('close', (code, signal) => {\n rl.close();\n if (code !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString('utf-8').trim();\n const suffix = stderr ? `: ${stderr}` : signal ? ` (signal ${signal})` : '';\n queue.push({ type: 'error', message: `Agent Runtime worker exited with code ${code ?? 'null'}${suffix}` });\n }\n closeOnce();\n });\n\n return queue.iterate();\n }\n\n private projectPiEvent(\n event: AgentSessionEvent,\n queue: AsyncPushQueue<AgentRuntimeEvent>,\n state: {\n lastAssistantText: string;\n assistantTextStreamed: boolean;\n },\n ): void {\n if (event.type === 'message_update' && event.assistantMessageEvent?.type === 'text_delta') {\n queue.push({ type: 'text', text: event.assistantMessageEvent.delta });\n state.assistantTextStreamed = true;\n return;\n }\n\n if (event.type === 'message_update' && event.message.role === 'assistant') {\n state.lastAssistantText = this.extractText(event.message.content);\n return;\n }\n\n if (event.type === 'message_end' && event.message.role === 'assistant') {\n const finalText = this.extractText(event.message.content);\n const alreadyStreamed = state.assistantTextStreamed;\n state.lastAssistantText = '';\n state.assistantTextStreamed = false;\n if (!alreadyStreamed && finalText.length > 0) {\n queue.push({ type: 'text', text: finalText });\n }\n return;\n }\n\n // pi emits tool_execution_start for its own read/bash/edit/write tools.\n // Those are internal runtime activity, not client-side tool requests.\n }\n\n private resolvePiConfig(config: AgentRuntimeConfig): {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n } {\n const baseUrl = config.agentConfig?.baseUrl || getPlatformApiBaseUrl();\n const provider = this.resolveProviderId(baseUrl);\n const apiKey = config.agentConfig?.apiKey || getPlatformApiKey();\n if (!apiKey) {\n throw new Error('No API key configured for pi Agent Runtime. Store the agent credential in the Pod or set DEFAULT_API_KEY for local development.');\n }\n const resolvedBaseUrl = baseUrl || getDefaultBaseUrl(provider);\n const modelId = config.agentConfig?.model || getPlatformDefaultModel();\n const api = this.resolveApiForBaseUrl(resolvedBaseUrl);\n\n return {\n provider,\n apiKey,\n api,\n baseUrl: resolvedBaseUrl,\n model: {\n id: modelId,\n name: modelId,\n api,\n provider,\n baseUrl: resolvedBaseUrl,\n reasoning: false,\n input: ['text'],\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n contextWindow: 128_000,\n maxTokens: 8192,\n compat: api === 'openai-completions'\n ? {\n supportsStore: false,\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n }\n : undefined,\n },\n };\n }\n\n private resolveProviderId(baseUrl: string | undefined): string {\n const configured = getPlatformProviderId();\n if (configured && configured !== 'undefineds') {\n return configured;\n }\n if (!baseUrl) {\n return 'xpod';\n }\n try {\n const host = new URL(baseUrl).hostname;\n if (host.includes('openai.com')) return 'openai';\n if (host.includes('anthropic.com')) return 'anthropic';\n if (host.includes('openrouter.ai')) return 'openrouter';\n if (host.includes('deepseek.com')) return 'deepseek';\n if (host.includes('mistral.ai')) return 'mistral';\n if (host === 'localhost' || host === '127.0.0.1') return 'ollama';\n } catch {\n // fall through to xpod\n }\n return 'xpod';\n }\n\n private resolveApiForBaseUrl(baseUrl: string): PiApi {\n try {\n const host = new URL(baseUrl).hostname;\n return host === 'api.openai.com' ? 'openai-responses' : 'openai-completions';\n } catch {\n return 'openai-completions';\n }\n }\n\n private resolveThinkingLevel(config: AgentRuntimeConfig): 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' {\n const level = (config.agentConfig as any)?.thinkingLevel;\n return level === 'minimal' || level === 'low' || level === 'medium' || level === 'high' || level === 'xhigh'\n ? level\n : 'off';\n }\n\n private resolveTools(pi: PiSdk, workspace: MaterializedWorkspace, config: AgentRuntimeConfig): PiTool[] {\n const workdir = workspace.cwd;\n const permissionMode = config.agentConfig?.permissionMode;\n const allowed = new Set(config.agentConfig?.allowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const disallowed = new Set(config.agentConfig?.disallowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const baseTools = permissionMode === 'plan' || allowed.size > 0\n ? this.createSolidFsReadOnlyTools(pi, workspace)\n : this.createSolidFsCodingTools(pi, workspace);\n\n return baseTools.filter((tool) => {\n const name = tool.name.toLowerCase();\n if (disallowed.has(name)) {\n return false;\n }\n return allowed.size === 0 || allowed.has(name);\n }) as PiTool[];\n }\n\n private async getWarmRuntime(input: RunExecutionInput, workspace: MaterializedWorkspace): Promise<WarmRuntime> {\n const pi = await this.loadPiSdk();\n const workdir = workspace.cwd;\n const key = this.warmRuntimeKey(workdir, input.config);\n const existing = this.warmRuntimes.get(key);\n if (existing) {\n return existing;\n }\n\n const created = this.createWarmRuntime(pi, workspace, input.config).catch((error) => {\n this.warmRuntimes.delete(key);\n throw error;\n });\n this.warmRuntimes.set(key, created);\n return created;\n }\n\n private async createWarmRuntime(pi: PiSdk, workspace: MaterializedWorkspace, config: AgentRuntimeConfig): Promise<WarmRuntime> {\n const workdir = workspace.cwd;\n const piConfig = this.resolvePiConfig(config);\n const authStorage = pi.AuthStorage.inMemory();\n authStorage.setRuntimeApiKey(piConfig.provider, piConfig.apiKey);\n\n const modelRegistry = new pi.ModelRegistry(authStorage, undefined);\n modelRegistry.registerProvider(piConfig.provider, {\n baseUrl: piConfig.baseUrl,\n apiKey: piConfig.apiKey,\n api: piConfig.api,\n models: [ piConfig.model ],\n });\n\n const thinkingLevel = this.resolveThinkingLevel(config);\n const settingsManager = pi.SettingsManager.inMemory({\n defaultProvider: piConfig.provider,\n defaultModel: piConfig.model.id,\n defaultThinkingLevel: thinkingLevel,\n });\n\n const resourceLoader = new pi.DefaultResourceLoader({\n cwd: workdir,\n settingsManager,\n systemPrompt: config.agentConfig?.systemPrompt,\n appendSystemPrompt: config.agentConfig?.skillsContent,\n noExtensions: true,\n noSkills: true,\n noPromptTemplates: true,\n noThemes: true,\n });\n await resourceLoader.reload();\n\n return {\n pi,\n workdir,\n piConfig,\n thinkingLevel,\n authStorage,\n modelRegistry,\n settingsManager,\n resourceLoader,\n tools: this.resolveTools(pi, workspace, config),\n };\n }\n\n private createSolidFsCodingTools(pi: PiSdk, workspace: MaterializedWorkspace): PiTool[] {\n if (!this.canHydrateWorkspace(workspace)) {\n return pi.createCodingTools(workspace.cwd);\n }\n\n return [\n pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }) as PiTool,\n pi.createBashTool(workspace.cwd) as PiTool,\n pi.createEditTool(workspace.cwd, { operations: this.createSolidFsEditOperations(workspace) }) as PiTool,\n pi.createWriteTool(workspace.cwd, { operations: this.createSolidFsWriteOperations(workspace) }) as PiTool,\n ];\n }\n\n private createSolidFsReadOnlyTools(pi: PiSdk, workspace: MaterializedWorkspace): PiTool[] {\n if (!this.canHydrateWorkspace(workspace)) {\n return pi.createReadOnlyTools(workspace.cwd);\n }\n\n return [\n pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }) as PiTool,\n ...pi.createReadOnlyTools(workspace.cwd).filter((tool) => tool.name !== 'read'),\n ];\n }\n\n private createSolidFsReadOperations(workspace: MaterializedWorkspace): PiReadOperations {\n return {\n readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),\n access: async (absolutePath) => {\n await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK);\n },\n detectImageMimeType: async (absolutePath) => this.detectImageMimeType(await this.ensureSolidFsPath(workspace, absolutePath)),\n };\n }\n\n private createSolidFsEditOperations(workspace: MaterializedWorkspace): PiEditOperations {\n return {\n readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),\n writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),\n access: async (absolutePath) => {\n await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK | fs.constants.W_OK);\n },\n };\n }\n\n private createSolidFsWriteOperations(workspace: MaterializedWorkspace): PiWriteOperations {\n return {\n writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),\n mkdir: (dir) => fs.promises.mkdir(dir, { recursive: true }).then(() => undefined),\n };\n }\n\n private async ensureSolidFsWritablePath(workspace: MaterializedWorkspace, absolutePath: string): Promise<string> {\n try {\n return await this.ensureSolidFsPath(workspace, absolutePath);\n } catch (error) {\n if (error instanceof SolidFsNotFoundError) {\n return path.resolve(absolutePath);\n }\n throw error;\n }\n }\n\n private async ensureSolidFsPath(workspace: MaterializedWorkspace, absolutePath: string): Promise<string> {\n if (!this.canHydrateWorkspace(workspace)) {\n return absolutePath;\n }\n\n const resolved = path.resolve(absolutePath);\n const root = path.resolve(workspace.cwd);\n if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {\n return absolutePath;\n }\n\n try {\n await fs.promises.access(resolved, fs.constants.F_OK);\n return resolved;\n } catch {\n const relativePath = path.relative(root, resolved);\n await workspace.hydrate(relativePath);\n return resolved;\n }\n }\n\n private canHydrateWorkspace(workspace: MaterializedWorkspace): workspace is MaterializedWorkspace & Required<Pick<MaterializedWorkspace, 'hydrate'>> {\n return workspace.manifest.projection === 'hydrated-object' && typeof workspace.hydrate === 'function';\n }\n\n private async detectImageMimeType(absolutePath: string): Promise<string | null> {\n const handle = await fs.promises.open(absolutePath, 'r');\n try {\n const buffer = Buffer.alloc(12);\n const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);\n const header = buffer.subarray(0, bytesRead);\n if (header.subarray(0, 3).equals(Buffer.from([0xff, 0xd8, 0xff]))) {\n return 'image/jpeg';\n }\n if (header.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {\n return 'image/png';\n }\n if (header.subarray(0, 6).toString('ascii') === 'GIF87a' || header.subarray(0, 6).toString('ascii') === 'GIF89a') {\n return 'image/gif';\n }\n if (header.subarray(0, 4).toString('ascii') === 'RIFF' && header.subarray(8, 12).toString('ascii') === 'WEBP') {\n return 'image/webp';\n }\n return null;\n } finally {\n await handle.close();\n }\n }\n\n private warmRuntimeKey(workdir: string, config: AgentRuntimeConfig): string {\n const agent = config.agentConfig;\n return JSON.stringify({\n workdir,\n baseUrl: agent?.baseUrl ?? getPlatformApiBaseUrl(),\n model: agent?.model ?? getPlatformDefaultModel(),\n apiKeyHash: this.hashSecret(agent?.apiKey ?? getPlatformApiKey()),\n systemPrompt: agent?.systemPrompt ?? '',\n skillsContent: agent?.skillsContent ?? '',\n permissionMode: agent?.permissionMode ?? '',\n allowedTools: agent?.allowedTools ?? [],\n disallowedTools: agent?.disallowedTools ?? [],\n persistPiSessions: this.options.persistPiSessions === true,\n agentLoopIsolation: this.options.agentLoopIsolation ?? 'in-process',\n thinkingLevel: this.resolveThinkingLevel(config),\n });\n }\n\n private hashSecret(value: string | undefined): string {\n return value\n ? crypto.createHash('sha256').update(value).digest('hex').slice(0, 16)\n : '';\n }\n\n private toPiMessages(\n conversation: RunConversationMessage[],\n config: { api: PiApi; provider: string; model: PiModel },\n ): PiMessage[] {\n return conversation.map((message) => {\n if (message.role === 'user') {\n return {\n role: 'user',\n content: [{ type: 'text', text: message.text }],\n timestamp: message.createdAt * 1000,\n };\n }\n return {\n role: 'assistant',\n content: [{ type: 'text', text: message.text }],\n api: config.api,\n provider: config.provider,\n model: config.model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n },\n stopReason: 'stop',\n timestamp: message.createdAt * 1000,\n };\n });\n }\n\n private async prepareWorkspace(input: RunExecutionInput): Promise<MaterializedWorkspace> {\n const source = await this.resolveWorkspaceSource(input.threadId, input.config.workspace, input.config);\n return this.solidfs.prepare({\n run: {\n id: input.runId,\n workspace: input.config.workspace,\n },\n workspace: input.config.workspace,\n sourcePath: source.sourcePath,\n projection: this.options.solidfsProjection ?? 'direct',\n context: input.context,\n });\n }\n\n private async resolveWorkspaceSource(\n threadId: string,\n workspace: WorkspaceRef,\n config?: AgentRuntimeConfig,\n ): Promise<{ sourcePath?: string }> {\n const url = new URL(workspace);\n let sourcePath: string | undefined;\n\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n const mapped = this.mapPodUrlToLocalPath(workspace);\n if (!mapped || !fs.existsSync(mapped)) {\n throw new WaitingRunnerError(workspace, `Workspace is not mounted on this runner: ${workspace}`);\n }\n sourcePath = mapped;\n } else if (url.protocol === 'file:') {\n if (!this.canResolveFileWorkspace(url)) {\n throw new WaitingRunnerError(workspace, `Waiting for a runner that can resolve workspace ${workspace}`);\n }\n sourcePath = decodeURIComponent(url.pathname);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`workspace reference does not exist on this runner: ${workspace}`);\n }\n } else {\n throw new Error(`Unsupported workspace reference protocol: ${url.protocol}`);\n }\n\n const worktree = config?.worktree;\n if (!worktree) {\n return { sourcePath };\n }\n\n const repoRoot = sourcePath;\n if (!repoRoot) {\n throw new Error(`Cannot create worktree without a local workspace source: ${workspace}`);\n }\n\n if (worktree.mode === 'existing') {\n if (!fs.existsSync(worktree.path)) {\n throw new Error(`worktree.path not found: ${worktree.path}`);\n }\n return { sourcePath: worktree.path };\n }\n\n await this.git.assertGitRepo(repoRoot);\n\n const root = path.join(repoRoot, '.xpod-worktrees');\n const worktreePath = path.join(root, threadId);\n\n if (fs.existsSync(worktreePath)) {\n return { sourcePath: worktreePath };\n }\n\n await this.git.createWorktree({\n repoPath: repoRoot,\n worktreePath,\n baseRef: worktree.baseRef ?? 'main',\n branch: worktree.branch,\n });\n\n return { sourcePath: worktreePath };\n }\n\n private canResolveFileWorkspace(url: URL): boolean {\n const authority = url.hostname;\n if (!authority || authority === 'localhost') {\n return true;\n }\n const configured = process.env.XPOD_RUNNER_AUTHORITY?.trim();\n return authority === configured || authority === os.hostname();\n }\n\n private mapPodUrlToLocalPath(rootUrl: string): string | undefined {\n const rootFilePath = process.env.CSS_ROOT_FILE_PATH;\n const baseUrl = process.env.CSS_BASE_URL;\n if (!rootFilePath || !baseUrl) {\n return undefined;\n }\n\n try {\n const base = new URL(baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`);\n const pod = new URL(rootUrl.endsWith('/') ? rootUrl : `${rootUrl}/`);\n if (base.origin !== pod.origin) {\n return undefined;\n }\n if (!pod.pathname.startsWith(base.pathname)) {\n return undefined;\n }\n const relativePath = decodeURIComponent(pod.pathname.slice(base.pathname.length)).replace(/\\/+$/, '');\n const resolvedRoot = path.resolve(rootFilePath);\n const resolved = path.resolve(resolvedRoot, relativePath);\n if (resolved !== resolvedRoot && !resolved.startsWith(`${resolvedRoot}${path.sep}`)) {\n return undefined;\n }\n return resolved;\n } catch {\n return undefined;\n }\n }\n\n private createSessionManager(pi: PiSdk, runId: string, workdir: string): ReturnType<PiSdk['SessionManager']['inMemory']> {\n if (this.options.persistPiSessions) {\n return pi.SessionManager.create(workdir, this.resolveSessionDir(runId, workdir));\n }\n return pi.SessionManager.inMemory(workdir);\n }\n\n private resolveSessionDir(runId: string, workdir: string): string {\n const root = this.options.sessionRootDir ?? path.join(os.tmpdir(), 'xpod-pi-sessions');\n const hash = crypto.createHash('sha256').update(`${workdir}:${runId}`).digest('hex').slice(0, 20);\n return path.join(root, hash);\n }\n\n private resolveWorkerPath(): string {\n if (this.options.workerPath) {\n return this.options.workerPath;\n }\n return path.join(__dirname, `PiAgentRuntimeWorker${path.extname(__filename)}`);\n }\n\n private workerEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') {\n env[key] = value;\n }\n }\n env.XPOD_AGENT_LOOP_WORKER = '1';\n return env;\n }\n\n private extractText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n return content\n .map((part) => {\n if (part && typeof part === 'object' && (part as any).type === 'text') {\n return typeof (part as any).text === 'string' ? (part as any).text : '';\n }\n return '';\n })\n .join('');\n }\n\n private formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private startupErrorToEvent(error: unknown): AgentRuntimeEvent {\n if (error instanceof WaitingRunnerError) {\n return {\n type: 'waiting_runner',\n workspace: error.workspace,\n message: error.message,\n };\n }\n return { type: 'error', message: this.formatError(error) };\n }\n\n private logWorkspaceRollbackError(error: unknown): void {\n console.warn(`SolidFS rollback failed: ${this.formatError(error)}`);\n }\n\n private async loadPiSdk(): Promise<PiSdk> {\n if (this.options.piSdk) {\n return this.options.piSdk;\n }\n if (PiAgentRuntimeDriver.sdkPromise) {\n return PiAgentRuntimeDriver.sdkPromise;\n }\n // Keep a native dynamic import so the CommonJS build can lazily load pi's\n // ESM-only package instead of requiring it during CSS component discovery.\n const nativeImport = new Function('specifier', 'return import(specifier)') as (specifier: string) => Promise<PiSdk>;\n PiAgentRuntimeDriver.sdkPromise = nativeImport('@mariozechner/pi-coding-agent');\n return PiAgentRuntimeDriver.sdkPromise;\n }\n}\n\nexport const PI_AGENT_WORKER_EVENT_PREFIX = 'XPOD_AGENT_EVENT ';\n\nclass WaitingRunnerError extends Error {\n public constructor(\n public readonly workspace: WorkspaceRef,\n message: string,\n ) {\n super(message);\n }\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private closed = false;\n\n public push(item: T): void {\n if (this.closed) {\n return;\n }\n this.items.push(item);\n const resolver = this.resolvers.shift();\n resolver?.();\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const resolver of this.resolvers) {\n resolver();\n }\n this.resolvers = [];\n }\n\n public async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this.closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
|
|
@@ -45,6 +45,14 @@ export declare class PodLookupRepository {
|
|
|
45
45
|
* not have to match the storage base URL.
|
|
46
46
|
*/
|
|
47
47
|
findByWebId(webId: string): Promise<PodLookupResult | undefined>;
|
|
48
|
+
/**
|
|
49
|
+
* Find all Pods linked to a WebID.
|
|
50
|
+
*
|
|
51
|
+
* A Cloud WebID can legitimately back both a Cloud Pod and a Local SP Pod.
|
|
52
|
+
* Callers that are scoped to a storage provider must inspect all candidates
|
|
53
|
+
* instead of accepting the first account record returned by CSS storage.
|
|
54
|
+
*/
|
|
55
|
+
findAllByWebId(webId: string): Promise<PodLookupResult[]>;
|
|
48
56
|
/**
|
|
49
57
|
* Find Pods by linked WebID URLs in one scan.
|
|
50
58
|
*/
|
|
@@ -48,29 +48,43 @@ class PodLookupRepository {
|
|
|
48
48
|
* not have to match the storage base URL.
|
|
49
49
|
*/
|
|
50
50
|
async findByWebId(webId) {
|
|
51
|
+
return (await this.findAllByWebId(webId))[0];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Find all Pods linked to a WebID.
|
|
55
|
+
*
|
|
56
|
+
* A Cloud WebID can legitimately back both a Cloud Pod and a Local SP Pod.
|
|
57
|
+
* Callers that are scoped to a storage provider must inspect all candidates
|
|
58
|
+
* instead of accepting the first account record returned by CSS storage.
|
|
59
|
+
*/
|
|
60
|
+
async findAllByWebId(webId) {
|
|
51
61
|
const normalized = normalizeWebId(webId);
|
|
52
62
|
if (!normalized) {
|
|
53
|
-
return
|
|
63
|
+
return [];
|
|
54
64
|
}
|
|
65
|
+
const results = [];
|
|
55
66
|
const pods = await this.getAllPods();
|
|
56
67
|
for (const pod of pods) {
|
|
57
68
|
const matchedWebId = getPodWebIds(pod).find((candidate) => normalizeWebId(candidate) === normalized);
|
|
58
69
|
if (matchedWebId) {
|
|
59
|
-
|
|
70
|
+
results.push({
|
|
60
71
|
...pod,
|
|
61
72
|
webId: matchedWebId,
|
|
62
|
-
};
|
|
73
|
+
});
|
|
63
74
|
}
|
|
64
75
|
}
|
|
76
|
+
if (results.length > 0) {
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
65
79
|
const indexed = await this.findByWebIdIndex(normalized);
|
|
66
80
|
if (!indexed) {
|
|
67
|
-
return
|
|
81
|
+
return [];
|
|
68
82
|
}
|
|
69
83
|
const usage = await this.getUsageByPodId();
|
|
70
|
-
return {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
return [{
|
|
85
|
+
...indexed,
|
|
86
|
+
storageUrl: indexed.storageUrl ?? usage.get(indexed.podId)?.storageUrl,
|
|
87
|
+
}];
|
|
74
88
|
}
|
|
75
89
|
/**
|
|
76
90
|
* Find Pods by linked WebID URLs in one scan.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PodLookupRepository.js","sourceRoot":"","sources":["../../../src/identity/drizzle/PodLookupRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'drizzle-orm';\nimport { type IdentityDatabase, executeQuery, executeStatement } from './db';\n\nexport interface PodLookupResult {\n podId: string;\n accountId: string;\n baseUrl: string;\n storageUrl?: string;\n webId?: string;\n webIds?: string[];\n nodeId?: string;\n edgeNodeId?: string;\n}\n\nexport interface PodMigrationStatus {\n podId: string;\n nodeId?: string;\n migrationStatus?: 'syncing' | 'done' | null;\n migrationTargetNode?: string;\n migrationProgress?: number;\n}\n\ninterface InternalKvRow {\n key?: string;\n value?: string;\n id?: string;\n account_id?: string;\n base_url?: string;\n storage_url?: string;\n node_id?: string;\n edge_node_id?: string;\n}\n\ninterface PodUsageRow {\n pod_id?: string;\n storage_url?: string | null;\n}\n\n/**\n * Repository for Pod lookup operations.\n *\n * Reads Pod data from CSS's internal_kv table where account data is stored.\n * CSS stores account data at key \"accounts/data/{accountId}\" with Pod info\n * nested in the \"**pod**\" field.\n */\nexport class PodLookupRepository {\n private readonly kvTableName: string;\n private readonly indexedStoreTableName: string;\n private readonly usageTableName: string;\n\n public constructor(\n private readonly db: IdentityDatabase,\n kvTableName?: string,\n ) {\n this.kvTableName = kvTableName ?? 'internal_kv';\n this.indexedStoreTableName = 'identity_store';\n this.usageTableName = 'identity_pod_usage';\n }\n\n /**\n * Find Pod by resource path (matches longest canonical storage/base URL prefix).\n */\n public async findByResourceIdentifier(resourcePath: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n\n let bestMatch: PodLookupResult | undefined;\n let bestLength = 0;\n\n for (const pod of pods) {\n const candidateBase = pod.storageUrl ?? pod.baseUrl;\n if (resourcePath.startsWith(candidateBase) && candidateBase.length > bestLength) {\n bestMatch = pod;\n bestLength = candidateBase.length;\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Get Pod by ID.\n */\n public async findById(podId: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n return pods.find((p) => p.podId === podId);\n }\n\n /**\n * Find Pod by a linked WebID URL.\n *\n * CSS account data stores WebID links separately from Pod base URLs. This is\n * the precise lookup for IdP/SP split deployments where the WebID path does\n * not have to match the storage base URL.\n */\n public async findByWebId(webId: string): Promise<PodLookupResult | undefined> {\n const normalized = normalizeWebId(webId);\n if (!normalized) {\n return undefined;\n }\n\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => normalizeWebId(candidate) === normalized);\n if (matchedWebId) {\n return {\n ...pod,\n webId: matchedWebId,\n };\n }\n }\n const indexed = await this.findByWebIdIndex(normalized);\n if (!indexed) {\n return undefined;\n }\n const usage = await this.getUsageByPodId();\n return {\n ...indexed,\n storageUrl: indexed.storageUrl ?? usage.get(indexed.podId)?.storageUrl,\n };\n }\n\n /**\n * Find Pods by linked WebID URLs in one scan.\n */\n public async findByWebIds(webIds: string[]): Promise<PodLookupResult[]> {\n const normalizedTargets = new Set(webIds.map(normalizeWebId).filter((value): value is string => Boolean(value)));\n if (normalizedTargets.size === 0) {\n return [];\n }\n\n const results: PodLookupResult[] = [];\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => {\n const normalized = normalizeWebId(candidate);\n return normalized ? normalizedTargets.has(normalized) : false;\n });\n if (!matchedWebId) {\n continue;\n }\n results.push({\n ...pod,\n webId: matchedWebId,\n });\n }\n if (results.length < normalizedTargets.size) {\n const seen = new Set(results.map((result) => normalizeWebId(result.webId)).filter(Boolean));\n for (const normalized of normalizedTargets) {\n if (seen.has(normalized)) {\n continue;\n }\n const indexed = await this.findByWebIdIndex(normalized);\n if (indexed) {\n const usage = await this.getUsageByPodId();\n results.push({\n ...indexed,\n storageUrl: indexed.storageUrl ?? usage.get(indexed.podId)?.storageUrl,\n });\n }\n }\n }\n return results;\n }\n\n /**\n * List Pods for a specific account.\n */\n public async listByAccountId(accountId: string): Promise<PodLookupResult[]> {\n const pods = await this.getAllPods();\n return pods.filter((pod) => pod.accountId === accountId);\n }\n\n /**\n * Set the canonical storage URL for a Pod in identity_pod_usage.\n */\n public async setStorageUrl(podId: string, accountId: string, storageUrl: string): Promise<void> {\n const tableId = sql.identifier([this.usageTableName]);\n await executeStatement(this.db, sql`\n INSERT INTO ${tableId} (pod_id, account_id, storage_url)\n VALUES (${podId}, ${accountId}, ${storageUrl})\n ON CONFLICT (pod_id) DO UPDATE SET\n account_id = ${accountId},\n storage_url = ${storageUrl}\n `);\n }\n\n /**\n * Get migration status for a Pod from identity_pod_usage table.\n */\n public async getMigrationStatus(podId: string): Promise<PodMigrationStatus | undefined> {\n try {\n const tableId = sql.identifier([this.usageTableName]);\n const result = await executeQuery<{\n pod_id?: string;\n id?: string;\n node_id?: string | null;\n migration_status?: string | null;\n migration_target_node?: string | null;\n migration_progress?: number | null;\n }>(this.db, sql`\n SELECT pod_id, node_id, migration_status, migration_target_node, migration_progress\n FROM ${tableId}\n WHERE pod_id = ${podId}\n LIMIT 1\n `);\n\n if (result.rows.length === 0) {\n return undefined;\n }\n const row = result.rows[0];\n return {\n podId: row.pod_id ?? row.id ?? podId,\n nodeId: row.node_id ?? undefined,\n migrationStatus: row.migration_status as 'syncing' | 'done' | null | undefined,\n migrationTargetNode: row.migration_target_node ?? undefined,\n migrationProgress: row.migration_progress ?? undefined,\n };\n } catch {\n // Table might not exist.\n return undefined;\n }\n }\n\n /**\n * Set the nodeId for a Pod in identity_pod_usage table.\n */\n public async setNodeId(podId: string, nodeId: string): Promise<void> {\n const tableId = sql.identifier([this.usageTableName]);\n await executeStatement(this.db, sql`\n INSERT INTO ${tableId} (pod_id, account_id, node_id)\n VALUES (${podId}, '', ${nodeId})\n ON CONFLICT (pod_id) DO UPDATE SET node_id = ${nodeId}\n `);\n }\n\n /**\n * Update migration status for a Pod in identity_pod_usage table.\n */\n public async setMigrationStatus(\n podId: string,\n status: 'syncing' | 'done' | null,\n targetNode?: string | null,\n progress?: number | null,\n ): Promise<void> {\n const tableId = sql.identifier([this.usageTableName]);\n await executeStatement(this.db, sql`\n INSERT INTO ${tableId} (pod_id, account_id, migration_status, migration_target_node, migration_progress)\n VALUES (${podId}, '', ${status}, ${targetNode ?? null}, ${progress ?? 0})\n ON CONFLICT (pod_id) DO UPDATE SET\n migration_status = ${status},\n migration_target_node = ${targetNode ?? null},\n migration_progress = ${progress ?? 0}\n `);\n }\n\n /**\n * List all pods.\n */\n public async listAllPods(): Promise<PodLookupResult[]> {\n return this.getAllPods();\n }\n\n /**\n * Extract all pods from CSS's internal_kv storage.\n *\n * It keeps backward compatibility with legacy rows that already expose\n * id/account_id/base_url columns (used by some unit tests and older schemas).\n */\n private async getAllPods(): Promise<PodLookupResult[]> {\n const kvTableId = sql.identifier([this.kvTableName]);\n\n const result = await executeQuery<InternalKvRow>(this.db, sql`\n SELECT key, value FROM ${kvTableId}\n WHERE key LIKE 'accounts/data/%'\n OR key LIKE '/.internal/accounts/data/%'\n `);\n const usageByPodId = await this.getUsageByPodId();\n\n const pods: PodLookupResult[] = [];\n\n for (const row of result?.rows ?? []) {\n if (row.id && row.account_id && row.base_url) {\n pods.push({\n podId: String(row.id),\n accountId: String(row.account_id),\n baseUrl: String(row.base_url),\n storageUrl: row.storage_url ? String(row.storage_url) : undefined,\n nodeId: row.node_id ? String(row.node_id) : undefined,\n edgeNodeId: row.edge_node_id ? String(row.edge_node_id) : undefined,\n });\n continue;\n }\n\n if (!row.key || row.value === undefined) {\n continue;\n }\n\n try {\n const accountId = extractAccountIdFromAccountDataKey(row.key);\n if (!accountId) {\n continue;\n }\n const data = unwrapStoredValue(typeof row.value === 'string' ? JSON.parse(row.value) : row.value);\n\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const usage = usageByPodId.get(podId);\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl: stringValue(pod.storageUrl) ?? usage?.storageUrl,\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : undefined,\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n } catch {\n // Skip malformed entries.\n }\n }\n\n return mergePodLookupResults([\n ...pods,\n ...await this.getPodsFromIndexedStore(),\n ]);\n }\n\n private async getUsageByPodId(): Promise<Map<string, { storageUrl?: string }>> {\n const tableId = sql.identifier([this.usageTableName]);\n try {\n const result = await executeQuery<PodUsageRow>(this.db, sql`\n SELECT pod_id, storage_url FROM ${tableId}\n `);\n const byPodId = new Map<string, { storageUrl?: string }>();\n for (const row of result.rows) {\n if (!row.pod_id) {\n continue;\n }\n byPodId.set(row.pod_id, {\n storageUrl: row.storage_url ?? undefined,\n });\n }\n return byPodId;\n } catch {\n return new Map();\n }\n }\n\n /**\n * Fast path for CSS WrappedIndexedStorage. WebID indexes point to the root\n * account id, so a single indexed key plus account data row can resolve the\n * profile without scanning all account records.\n */\n private async findByWebIdIndex(webId: string): Promise<PodLookupResult | undefined> {\n const accountIds = await this.readStringArrayFromKv(`accounts/index/webIdLink/webId/${encodeURIComponent(webId)}`);\n for (const accountId of accountIds) {\n const account = await this.readAccountData(accountId);\n if (!account) {\n continue;\n }\n const pods = this.extractPodsFromAccountData(accountId, account);\n const match = pods.find((pod) => getPodWebIds(pod).some((candidate) => normalizeWebId(candidate) === webId));\n if (match) {\n return {\n ...match,\n webId,\n };\n }\n if (pods.length === 1) {\n return {\n ...pods[0],\n webId,\n ...webIdsProperty([webId, ...getPodWebIds(pods[0])]),\n };\n }\n }\n return undefined;\n }\n\n private async readAccountData(accountId: string): Promise<Record<string, unknown> | undefined> {\n for (const key of [`accounts/data/${accountId}`, `/.internal/accounts/data/${accountId}`]) {\n const value = await this.readKvValue(key);\n const record = parsePayloadRecord(value);\n if (record) {\n return record;\n }\n }\n return undefined;\n }\n\n private async readStringArrayFromKv(key: string): Promise<string[]> {\n const value = await this.readKvValue(key);\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n }\n\n private async readKvValue(key: string): Promise<unknown> {\n const tableId = sql.identifier([this.kvTableName]);\n try {\n const result = await executeQuery<{ value?: unknown }>(this.db, sql`\n SELECT value FROM ${tableId}\n WHERE key = ${key}\n LIMIT 1\n `);\n if (result.rows.length === 0) {\n return undefined;\n }\n return parseStoredValue(result.rows[0].value);\n } catch {\n return undefined;\n }\n }\n\n private extractPodsFromAccountData(accountId: string, data: Record<string, unknown>): PodLookupResult[] {\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n const pods: PodLookupResult[] = [];\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl: stringValue(pod.storageUrl),\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : undefined,\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n\n return pods;\n }\n\n /**\n * Older Xpod/CSS deployments may have used the IndexedStorage-compatible\n * identity_store table instead of CSS's WrappedIndexedStorage JSON tree in\n * internal_kv. Keep this as a read-only compatibility source so hosted WebID\n * profile lookup still works after storage implementation changes.\n */\n private async getPodsFromIndexedStore(): Promise<PodLookupResult[]> {\n const storeTableId = sql.identifier([this.indexedStoreTableName]);\n let result: { rows?: Array<{ container?: string; id?: string; payload?: unknown }> } | undefined;\n try {\n result = await executeQuery(this.db, sql`\n SELECT container, id, payload FROM ${storeTableId}\n WHERE container IN ('pod', 'owner', 'webIdLink')\n `);\n } catch {\n return [];\n }\n\n const podPayloads = new Map<string, Record<string, unknown>>();\n const ownerWebIdsByPodId = new Map<string, string[]>();\n const webIdsByAccountId = new Map<string, string[]>();\n\n for (const row of result?.rows ?? []) {\n if (!row.id || !row.container) {\n continue;\n }\n const payload = parsePayloadRecord(row.payload);\n if (!payload) {\n continue;\n }\n\n if (row.container === 'pod') {\n podPayloads.set(row.id, payload);\n continue;\n }\n\n if (row.container === 'owner') {\n const podId = stringValue(payload.podId);\n const webId = stringValue(payload.webId);\n if (podId && webId) {\n appendMapValue(ownerWebIdsByPodId, podId, webId);\n }\n continue;\n }\n\n if (row.container === 'webIdLink') {\n const accountId = stringValue(payload.accountId);\n const webId = stringValue(payload.webId);\n if (accountId && webId) {\n appendMapValue(webIdsByAccountId, accountId, webId);\n }\n }\n }\n\n const pods: PodLookupResult[] = [];\n for (const [podId, pod] of podPayloads) {\n const baseUrl = stringValue(pod.baseUrl);\n const accountId = stringValue(pod.accountId);\n if (!baseUrl || !accountId) {\n continue;\n }\n const podWebIds = dedupeStrings([\n stringValue(pod.webId),\n ...(ownerWebIdsByPodId.get(podId) ?? []),\n ...(webIdsByAccountId.get(accountId) ?? []),\n ].filter((value): value is string => typeof value === 'string'));\n\n pods.push({\n podId,\n accountId,\n baseUrl,\n storageUrl: stringValue(pod.storageUrl),\n webId: podWebIds[0],\n ...webIdsProperty(podWebIds),\n nodeId: stringValue(pod.nodeId),\n edgeNodeId: stringValue(pod.edgeNodeId),\n });\n }\n\n return pods;\n }\n}\n\nfunction extractAccountIdFromAccountDataKey(key: string): string | undefined {\n const marker = 'accounts/data/';\n const index = key.indexOf(marker);\n if (index < 0) {\n return undefined;\n }\n const accountId = key.slice(index + marker.length).replace(/\\.json$/u, '');\n return accountId || undefined;\n}\n\nfunction extractAccountWebIds(data: unknown): string[] {\n if (!data || typeof data !== 'object') {\n return [];\n }\n\n const record = data as Record<string, unknown>;\n const linkMap = record['**webIdLink**'] || record.webIdLink || {};\n if (!linkMap || typeof linkMap !== 'object') {\n return [];\n }\n\n return Object.values(linkMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction extractPodOwnerWebIds(pod: Record<string, unknown>): string[] {\n const ownerMap = pod['**owner**'] || pod.owner || {};\n if (!ownerMap || typeof ownerMap !== 'object') {\n return [];\n }\n\n return Object.values(ownerMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction normalizeWebId(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n return new URL(webId).toString();\n } catch {\n return webId;\n }\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction getPodWebIds(pod: PodLookupResult): string[] {\n return dedupeStrings([\n pod.webId,\n ...(pod.webIds ?? []),\n ].filter((value): value is string => typeof value === 'string' && value.length > 0));\n}\n\nfunction webIdsProperty(values: string[]): Pick<PodLookupResult, 'webIds'> {\n const webIds = dedupeStrings(values);\n return webIds.length > 1 ? { webIds } : {};\n}\n\nfunction mergePodLookupResults(values: PodLookupResult[]): PodLookupResult[] {\n const byPodId = new Map<string, PodLookupResult>();\n for (const value of values) {\n const existing = byPodId.get(value.podId);\n if (!existing) {\n byPodId.set(value.podId, value);\n continue;\n }\n\n const webIds = dedupeStrings([\n ...getPodWebIds(existing),\n ...getPodWebIds(value),\n ]);\n byPodId.set(value.podId, {\n ...existing,\n baseUrl: existing.baseUrl || value.baseUrl,\n storageUrl: existing.storageUrl ?? value.storageUrl,\n accountId: existing.accountId || value.accountId,\n webId: webIds[0],\n ...webIdsProperty(webIds),\n nodeId: existing.nodeId ?? value.nodeId,\n edgeNodeId: existing.edgeNodeId ?? value.edgeNodeId,\n });\n }\n return [...byPodId.values()];\n}\n\nfunction parsePayloadRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value) as unknown;\n const unwrapped = unwrapStoredValue(parsed);\n return unwrapped && typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n }\n const unwrapped = unwrapStoredValue(value);\n return typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n}\n\nfunction parseStoredValue(value: unknown): unknown {\n if (typeof value === 'string') {\n try {\n return unwrapStoredValue(JSON.parse(value));\n } catch {\n return undefined;\n }\n }\n return unwrapStoredValue(value);\n}\n\nfunction unwrapStoredValue(value: unknown): unknown {\n if (value && typeof value === 'object' && 'key' in value && 'payload' in value) {\n return (value as Record<string, unknown>).payload;\n }\n return value;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction appendMapValue(map: Map<string, string[]>, key: string, value: string): void {\n const values = map.get(key) ?? [];\n values.push(value);\n map.set(key, values);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PodLookupRepository.js","sourceRoot":"","sources":["../../../src/identity/drizzle/PodLookupRepository.ts"],"names":[],"mappings":"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","sourcesContent":["import { sql } from 'drizzle-orm';\nimport { type IdentityDatabase, executeQuery, executeStatement } from './db';\n\nexport interface PodLookupResult {\n podId: string;\n accountId: string;\n baseUrl: string;\n storageUrl?: string;\n webId?: string;\n webIds?: string[];\n nodeId?: string;\n edgeNodeId?: string;\n}\n\nexport interface PodMigrationStatus {\n podId: string;\n nodeId?: string;\n migrationStatus?: 'syncing' | 'done' | null;\n migrationTargetNode?: string;\n migrationProgress?: number;\n}\n\ninterface InternalKvRow {\n key?: string;\n value?: string;\n id?: string;\n account_id?: string;\n base_url?: string;\n storage_url?: string;\n node_id?: string;\n edge_node_id?: string;\n}\n\ninterface PodUsageRow {\n pod_id?: string;\n storage_url?: string | null;\n}\n\n/**\n * Repository for Pod lookup operations.\n *\n * Reads Pod data from CSS's internal_kv table where account data is stored.\n * CSS stores account data at key \"accounts/data/{accountId}\" with Pod info\n * nested in the \"**pod**\" field.\n */\nexport class PodLookupRepository {\n private readonly kvTableName: string;\n private readonly indexedStoreTableName: string;\n private readonly usageTableName: string;\n\n public constructor(\n private readonly db: IdentityDatabase,\n kvTableName?: string,\n ) {\n this.kvTableName = kvTableName ?? 'internal_kv';\n this.indexedStoreTableName = 'identity_store';\n this.usageTableName = 'identity_pod_usage';\n }\n\n /**\n * Find Pod by resource path (matches longest canonical storage/base URL prefix).\n */\n public async findByResourceIdentifier(resourcePath: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n\n let bestMatch: PodLookupResult | undefined;\n let bestLength = 0;\n\n for (const pod of pods) {\n const candidateBase = pod.storageUrl ?? pod.baseUrl;\n if (resourcePath.startsWith(candidateBase) && candidateBase.length > bestLength) {\n bestMatch = pod;\n bestLength = candidateBase.length;\n }\n }\n\n return bestMatch;\n }\n\n /**\n * Get Pod by ID.\n */\n public async findById(podId: string): Promise<PodLookupResult | undefined> {\n const pods = await this.getAllPods();\n return pods.find((p) => p.podId === podId);\n }\n\n /**\n * Find Pod by a linked WebID URL.\n *\n * CSS account data stores WebID links separately from Pod base URLs. This is\n * the precise lookup for IdP/SP split deployments where the WebID path does\n * not have to match the storage base URL.\n */\n public async findByWebId(webId: string): Promise<PodLookupResult | undefined> {\n return (await this.findAllByWebId(webId))[0];\n }\n\n /**\n * Find all Pods linked to a WebID.\n *\n * A Cloud WebID can legitimately back both a Cloud Pod and a Local SP Pod.\n * Callers that are scoped to a storage provider must inspect all candidates\n * instead of accepting the first account record returned by CSS storage.\n */\n public async findAllByWebId(webId: string): Promise<PodLookupResult[]> {\n const normalized = normalizeWebId(webId);\n if (!normalized) {\n return [];\n }\n\n const results: PodLookupResult[] = [];\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => normalizeWebId(candidate) === normalized);\n if (matchedWebId) {\n results.push({\n ...pod,\n webId: matchedWebId,\n });\n }\n }\n\n if (results.length > 0) {\n return results;\n }\n\n const indexed = await this.findByWebIdIndex(normalized);\n if (!indexed) {\n return [];\n }\n const usage = await this.getUsageByPodId();\n return [{\n ...indexed,\n storageUrl: indexed.storageUrl ?? usage.get(indexed.podId)?.storageUrl,\n }];\n }\n\n /**\n * Find Pods by linked WebID URLs in one scan.\n */\n public async findByWebIds(webIds: string[]): Promise<PodLookupResult[]> {\n const normalizedTargets = new Set(webIds.map(normalizeWebId).filter((value): value is string => Boolean(value)));\n if (normalizedTargets.size === 0) {\n return [];\n }\n\n const results: PodLookupResult[] = [];\n const pods = await this.getAllPods();\n for (const pod of pods) {\n const matchedWebId = getPodWebIds(pod).find((candidate) => {\n const normalized = normalizeWebId(candidate);\n return normalized ? normalizedTargets.has(normalized) : false;\n });\n if (!matchedWebId) {\n continue;\n }\n results.push({\n ...pod,\n webId: matchedWebId,\n });\n }\n if (results.length < normalizedTargets.size) {\n const seen = new Set(results.map((result) => normalizeWebId(result.webId)).filter(Boolean));\n for (const normalized of normalizedTargets) {\n if (seen.has(normalized)) {\n continue;\n }\n const indexed = await this.findByWebIdIndex(normalized);\n if (indexed) {\n const usage = await this.getUsageByPodId();\n results.push({\n ...indexed,\n storageUrl: indexed.storageUrl ?? usage.get(indexed.podId)?.storageUrl,\n });\n }\n }\n }\n return results;\n }\n\n /**\n * List Pods for a specific account.\n */\n public async listByAccountId(accountId: string): Promise<PodLookupResult[]> {\n const pods = await this.getAllPods();\n return pods.filter((pod) => pod.accountId === accountId);\n }\n\n /**\n * Set the canonical storage URL for a Pod in identity_pod_usage.\n */\n public async setStorageUrl(podId: string, accountId: string, storageUrl: string): Promise<void> {\n const tableId = sql.identifier([this.usageTableName]);\n await executeStatement(this.db, sql`\n INSERT INTO ${tableId} (pod_id, account_id, storage_url)\n VALUES (${podId}, ${accountId}, ${storageUrl})\n ON CONFLICT (pod_id) DO UPDATE SET\n account_id = ${accountId},\n storage_url = ${storageUrl}\n `);\n }\n\n /**\n * Get migration status for a Pod from identity_pod_usage table.\n */\n public async getMigrationStatus(podId: string): Promise<PodMigrationStatus | undefined> {\n try {\n const tableId = sql.identifier([this.usageTableName]);\n const result = await executeQuery<{\n pod_id?: string;\n id?: string;\n node_id?: string | null;\n migration_status?: string | null;\n migration_target_node?: string | null;\n migration_progress?: number | null;\n }>(this.db, sql`\n SELECT pod_id, node_id, migration_status, migration_target_node, migration_progress\n FROM ${tableId}\n WHERE pod_id = ${podId}\n LIMIT 1\n `);\n\n if (result.rows.length === 0) {\n return undefined;\n }\n const row = result.rows[0];\n return {\n podId: row.pod_id ?? row.id ?? podId,\n nodeId: row.node_id ?? undefined,\n migrationStatus: row.migration_status as 'syncing' | 'done' | null | undefined,\n migrationTargetNode: row.migration_target_node ?? undefined,\n migrationProgress: row.migration_progress ?? undefined,\n };\n } catch {\n // Table might not exist.\n return undefined;\n }\n }\n\n /**\n * Set the nodeId for a Pod in identity_pod_usage table.\n */\n public async setNodeId(podId: string, nodeId: string): Promise<void> {\n const tableId = sql.identifier([this.usageTableName]);\n await executeStatement(this.db, sql`\n INSERT INTO ${tableId} (pod_id, account_id, node_id)\n VALUES (${podId}, '', ${nodeId})\n ON CONFLICT (pod_id) DO UPDATE SET node_id = ${nodeId}\n `);\n }\n\n /**\n * Update migration status for a Pod in identity_pod_usage table.\n */\n public async setMigrationStatus(\n podId: string,\n status: 'syncing' | 'done' | null,\n targetNode?: string | null,\n progress?: number | null,\n ): Promise<void> {\n const tableId = sql.identifier([this.usageTableName]);\n await executeStatement(this.db, sql`\n INSERT INTO ${tableId} (pod_id, account_id, migration_status, migration_target_node, migration_progress)\n VALUES (${podId}, '', ${status}, ${targetNode ?? null}, ${progress ?? 0})\n ON CONFLICT (pod_id) DO UPDATE SET\n migration_status = ${status},\n migration_target_node = ${targetNode ?? null},\n migration_progress = ${progress ?? 0}\n `);\n }\n\n /**\n * List all pods.\n */\n public async listAllPods(): Promise<PodLookupResult[]> {\n return this.getAllPods();\n }\n\n /**\n * Extract all pods from CSS's internal_kv storage.\n *\n * It keeps backward compatibility with legacy rows that already expose\n * id/account_id/base_url columns (used by some unit tests and older schemas).\n */\n private async getAllPods(): Promise<PodLookupResult[]> {\n const kvTableId = sql.identifier([this.kvTableName]);\n\n const result = await executeQuery<InternalKvRow>(this.db, sql`\n SELECT key, value FROM ${kvTableId}\n WHERE key LIKE 'accounts/data/%'\n OR key LIKE '/.internal/accounts/data/%'\n `);\n const usageByPodId = await this.getUsageByPodId();\n\n const pods: PodLookupResult[] = [];\n\n for (const row of result?.rows ?? []) {\n if (row.id && row.account_id && row.base_url) {\n pods.push({\n podId: String(row.id),\n accountId: String(row.account_id),\n baseUrl: String(row.base_url),\n storageUrl: row.storage_url ? String(row.storage_url) : undefined,\n nodeId: row.node_id ? String(row.node_id) : undefined,\n edgeNodeId: row.edge_node_id ? String(row.edge_node_id) : undefined,\n });\n continue;\n }\n\n if (!row.key || row.value === undefined) {\n continue;\n }\n\n try {\n const accountId = extractAccountIdFromAccountDataKey(row.key);\n if (!accountId) {\n continue;\n }\n const data = unwrapStoredValue(typeof row.value === 'string' ? JSON.parse(row.value) : row.value);\n\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const usage = usageByPodId.get(podId);\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl: stringValue(pod.storageUrl) ?? usage?.storageUrl,\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : undefined,\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n } catch {\n // Skip malformed entries.\n }\n }\n\n return mergePodLookupResults([\n ...pods,\n ...await this.getPodsFromIndexedStore(),\n ]);\n }\n\n private async getUsageByPodId(): Promise<Map<string, { storageUrl?: string }>> {\n const tableId = sql.identifier([this.usageTableName]);\n try {\n const result = await executeQuery<PodUsageRow>(this.db, sql`\n SELECT pod_id, storage_url FROM ${tableId}\n `);\n const byPodId = new Map<string, { storageUrl?: string }>();\n for (const row of result.rows) {\n if (!row.pod_id) {\n continue;\n }\n byPodId.set(row.pod_id, {\n storageUrl: row.storage_url ?? undefined,\n });\n }\n return byPodId;\n } catch {\n return new Map();\n }\n }\n\n /**\n * Fast path for CSS WrappedIndexedStorage. WebID indexes point to the root\n * account id, so a single indexed key plus account data row can resolve the\n * profile without scanning all account records.\n */\n private async findByWebIdIndex(webId: string): Promise<PodLookupResult | undefined> {\n const accountIds = await this.readStringArrayFromKv(`accounts/index/webIdLink/webId/${encodeURIComponent(webId)}`);\n for (const accountId of accountIds) {\n const account = await this.readAccountData(accountId);\n if (!account) {\n continue;\n }\n const pods = this.extractPodsFromAccountData(accountId, account);\n const match = pods.find((pod) => getPodWebIds(pod).some((candidate) => normalizeWebId(candidate) === webId));\n if (match) {\n return {\n ...match,\n webId,\n };\n }\n if (pods.length === 1) {\n return {\n ...pods[0],\n webId,\n ...webIdsProperty([webId, ...getPodWebIds(pods[0])]),\n };\n }\n }\n return undefined;\n }\n\n private async readAccountData(accountId: string): Promise<Record<string, unknown> | undefined> {\n for (const key of [`accounts/data/${accountId}`, `/.internal/accounts/data/${accountId}`]) {\n const value = await this.readKvValue(key);\n const record = parsePayloadRecord(value);\n if (record) {\n return record;\n }\n }\n return undefined;\n }\n\n private async readStringArrayFromKv(key: string): Promise<string[]> {\n const value = await this.readKvValue(key);\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n }\n\n private async readKvValue(key: string): Promise<unknown> {\n const tableId = sql.identifier([this.kvTableName]);\n try {\n const result = await executeQuery<{ value?: unknown }>(this.db, sql`\n SELECT value FROM ${tableId}\n WHERE key = ${key}\n LIMIT 1\n `);\n if (result.rows.length === 0) {\n return undefined;\n }\n return parseStoredValue(result.rows[0].value);\n } catch {\n return undefined;\n }\n }\n\n private extractPodsFromAccountData(accountId: string, data: Record<string, unknown>): PodLookupResult[] {\n const podMap = (data as any)['**pod**'] || (data as any).pod || {};\n const webIds = extractAccountWebIds(data);\n const pods: PodLookupResult[] = [];\n\n for (const [podId, podData] of Object.entries(podMap)) {\n const pod = podData as Record<string, unknown>;\n if (pod.baseUrl && typeof pod.baseUrl === 'string') {\n const podWebIds = [\n typeof pod.webId === 'string' ? pod.webId : undefined,\n ...extractPodOwnerWebIds(pod),\n ...webIds,\n ].filter((value): value is string => typeof value === 'string');\n pods.push({\n podId,\n accountId,\n baseUrl: pod.baseUrl,\n storageUrl: stringValue(pod.storageUrl),\n webId: dedupeStrings(podWebIds)[0],\n ...webIdsProperty(podWebIds),\n nodeId: typeof pod.nodeId === 'string' ? pod.nodeId : undefined,\n edgeNodeId: typeof pod.edgeNodeId === 'string' ? pod.edgeNodeId : undefined,\n });\n }\n }\n\n return pods;\n }\n\n /**\n * Older Xpod/CSS deployments may have used the IndexedStorage-compatible\n * identity_store table instead of CSS's WrappedIndexedStorage JSON tree in\n * internal_kv. Keep this as a read-only compatibility source so hosted WebID\n * profile lookup still works after storage implementation changes.\n */\n private async getPodsFromIndexedStore(): Promise<PodLookupResult[]> {\n const storeTableId = sql.identifier([this.indexedStoreTableName]);\n let result: { rows?: Array<{ container?: string; id?: string; payload?: unknown }> } | undefined;\n try {\n result = await executeQuery(this.db, sql`\n SELECT container, id, payload FROM ${storeTableId}\n WHERE container IN ('pod', 'owner', 'webIdLink')\n `);\n } catch {\n return [];\n }\n\n const podPayloads = new Map<string, Record<string, unknown>>();\n const ownerWebIdsByPodId = new Map<string, string[]>();\n const webIdsByAccountId = new Map<string, string[]>();\n\n for (const row of result?.rows ?? []) {\n if (!row.id || !row.container) {\n continue;\n }\n const payload = parsePayloadRecord(row.payload);\n if (!payload) {\n continue;\n }\n\n if (row.container === 'pod') {\n podPayloads.set(row.id, payload);\n continue;\n }\n\n if (row.container === 'owner') {\n const podId = stringValue(payload.podId);\n const webId = stringValue(payload.webId);\n if (podId && webId) {\n appendMapValue(ownerWebIdsByPodId, podId, webId);\n }\n continue;\n }\n\n if (row.container === 'webIdLink') {\n const accountId = stringValue(payload.accountId);\n const webId = stringValue(payload.webId);\n if (accountId && webId) {\n appendMapValue(webIdsByAccountId, accountId, webId);\n }\n }\n }\n\n const pods: PodLookupResult[] = [];\n for (const [podId, pod] of podPayloads) {\n const baseUrl = stringValue(pod.baseUrl);\n const accountId = stringValue(pod.accountId);\n if (!baseUrl || !accountId) {\n continue;\n }\n const podWebIds = dedupeStrings([\n stringValue(pod.webId),\n ...(ownerWebIdsByPodId.get(podId) ?? []),\n ...(webIdsByAccountId.get(accountId) ?? []),\n ].filter((value): value is string => typeof value === 'string'));\n\n pods.push({\n podId,\n accountId,\n baseUrl,\n storageUrl: stringValue(pod.storageUrl),\n webId: podWebIds[0],\n ...webIdsProperty(podWebIds),\n nodeId: stringValue(pod.nodeId),\n edgeNodeId: stringValue(pod.edgeNodeId),\n });\n }\n\n return pods;\n }\n}\n\nfunction extractAccountIdFromAccountDataKey(key: string): string | undefined {\n const marker = 'accounts/data/';\n const index = key.indexOf(marker);\n if (index < 0) {\n return undefined;\n }\n const accountId = key.slice(index + marker.length).replace(/\\.json$/u, '');\n return accountId || undefined;\n}\n\nfunction extractAccountWebIds(data: unknown): string[] {\n if (!data || typeof data !== 'object') {\n return [];\n }\n\n const record = data as Record<string, unknown>;\n const linkMap = record['**webIdLink**'] || record.webIdLink || {};\n if (!linkMap || typeof linkMap !== 'object') {\n return [];\n }\n\n return Object.values(linkMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction extractPodOwnerWebIds(pod: Record<string, unknown>): string[] {\n const ownerMap = pod['**owner**'] || pod.owner || {};\n if (!ownerMap || typeof ownerMap !== 'object') {\n return [];\n }\n\n return Object.values(ownerMap as Record<string, unknown>)\n .map((value) => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const webId = (value as Record<string, unknown>).webId;\n return typeof webId === 'string' ? webId : undefined;\n })\n .filter((value): value is string => typeof value === 'string');\n}\n\nfunction normalizeWebId(webId: string | undefined): string | undefined {\n if (!webId) {\n return undefined;\n }\n try {\n return new URL(webId).toString();\n } catch {\n return webId;\n }\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction getPodWebIds(pod: PodLookupResult): string[] {\n return dedupeStrings([\n pod.webId,\n ...(pod.webIds ?? []),\n ].filter((value): value is string => typeof value === 'string' && value.length > 0));\n}\n\nfunction webIdsProperty(values: string[]): Pick<PodLookupResult, 'webIds'> {\n const webIds = dedupeStrings(values);\n return webIds.length > 1 ? { webIds } : {};\n}\n\nfunction mergePodLookupResults(values: PodLookupResult[]): PodLookupResult[] {\n const byPodId = new Map<string, PodLookupResult>();\n for (const value of values) {\n const existing = byPodId.get(value.podId);\n if (!existing) {\n byPodId.set(value.podId, value);\n continue;\n }\n\n const webIds = dedupeStrings([\n ...getPodWebIds(existing),\n ...getPodWebIds(value),\n ]);\n byPodId.set(value.podId, {\n ...existing,\n baseUrl: existing.baseUrl || value.baseUrl,\n storageUrl: existing.storageUrl ?? value.storageUrl,\n accountId: existing.accountId || value.accountId,\n webId: webIds[0],\n ...webIdsProperty(webIds),\n nodeId: existing.nodeId ?? value.nodeId,\n edgeNodeId: existing.edgeNodeId ?? value.edgeNodeId,\n });\n }\n return [...byPodId.values()];\n}\n\nfunction parsePayloadRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value) as unknown;\n const unwrapped = unwrapStoredValue(parsed);\n return unwrapped && typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n } catch {\n return undefined;\n }\n }\n const unwrapped = unwrapStoredValue(value);\n return typeof unwrapped === 'object' ? unwrapped as Record<string, unknown> : undefined;\n}\n\nfunction parseStoredValue(value: unknown): unknown {\n if (typeof value === 'string') {\n try {\n return unwrapStoredValue(JSON.parse(value));\n } catch {\n return undefined;\n }\n }\n return unwrapStoredValue(value);\n}\n\nfunction unwrapStoredValue(value: unknown): unknown {\n if (value && typeof value === 'object' && 'key' in value && 'payload' in value) {\n return (value as Record<string, unknown>).payload;\n }\n return value;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction appendMapValue(map: Map<string, string[]>, key: string, value: string): void {\n const values = map.get(key) ?? [];\n values.push(value);\n map.set(key, values);\n}\n"]}
|
|
@@ -11,6 +11,7 @@ export interface ScopedPickWebIdHandlerOptions {
|
|
|
11
11
|
}
|
|
12
12
|
export interface PodWebIdLookupRepository {
|
|
13
13
|
findByWebId: (webId: string) => Promise<PodLookupResult | undefined>;
|
|
14
|
+
findAllByWebId?: (webId: string) => Promise<PodLookupResult[]>;
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* CSS-compatible WebID picker scoped to the current storage provider.
|
|
@@ -97,8 +97,10 @@ class ScopedPickWebIdHandler extends community_server_1.JsonInteractionHandler {
|
|
|
97
97
|
return undefined;
|
|
98
98
|
}
|
|
99
99
|
try {
|
|
100
|
-
const
|
|
101
|
-
|
|
100
|
+
const pods = this.podLookupRepository.findAllByWebId
|
|
101
|
+
? await this.podLookupRepository.findAllByWebId(webId)
|
|
102
|
+
: await this.podLookupRepository.findByWebId(webId).then((pod) => pod ? [pod] : []);
|
|
103
|
+
return pods.find((pod) => matchesTargetStorage(pod, targetStorageUrl));
|
|
102
104
|
}
|
|
103
105
|
catch (error) {
|
|
104
106
|
this.logger.warn(`Pod lookup unavailable for WebID ${webId}: ${error}`);
|