@undefineds.co/xpod 0.3.48 → 0.3.49
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/bin/xpod.js +0 -0
- package/dist/api/chatkit/pod-store.d.ts +16 -17
- package/dist/api/chatkit/pod-store.js +299 -231
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/schema.d.ts +1 -1
- package/dist/api/chatkit/service.js +13 -11
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/store.d.ts +1 -0
- package/dist/api/chatkit/store.js +23 -11
- package/dist/api/chatkit/store.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +17 -10
- package/dist/api/chatkit/types.js +97 -14
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/common.js +16 -2
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/routes.js +3 -0
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +3 -0
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/ChatKitV1Handler.js +1 -2
- package/dist/api/handlers/ChatKitV1Handler.js.map +1 -1
- package/dist/api/handlers/CoordinationHandler.d.ts +6 -0
- package/dist/api/handlers/CoordinationHandler.js +115 -0
- package/dist/api/handlers/CoordinationHandler.js.map +1 -0
- package/dist/api/handlers/MatrixHandler.d.ts +11 -0
- package/dist/api/handlers/MatrixHandler.js +120 -2
- package/dist/api/handlers/MatrixHandler.js.map +1 -1
- package/dist/api/handlers/RunHandler.js +33 -15
- package/dist/api/handlers/RunHandler.js.map +1 -1
- package/dist/api/handlers/index.d.ts +1 -0
- package/dist/api/handlers/index.js +1 -0
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/matrix/PodMatrixStore.d.ts +25 -1
- package/dist/api/matrix/PodMatrixStore.js +243 -38
- package/dist/api/matrix/PodMatrixStore.js.map +1 -1
- package/dist/api/matrix/index.d.ts +1 -1
- package/dist/api/matrix/index.js.map +1 -1
- package/dist/api/matrix/types.d.ts +23 -2
- package/dist/api/matrix/types.js.map +1 -1
- package/dist/api/protocol-metadata.d.ts +4 -0
- package/dist/api/protocol-metadata.js +54 -0
- package/dist/api/protocol-metadata.js.map +1 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.d.ts +42 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.js +250 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.js.map +1 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.jsonld +186 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.d.ts +39 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.js +91 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.js.map +1 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.jsonld +146 -0
- package/dist/api/reconciler/WakeAgentQueue.d.ts +23 -0
- package/dist/api/reconciler/WakeAgentQueue.js +123 -0
- package/dist/api/reconciler/WakeAgentQueue.js.map +1 -0
- package/dist/api/reconciler/WakeAgentQueue.jsonld +91 -0
- package/dist/api/reconciler/coordination.d.ts +61 -0
- package/dist/api/reconciler/coordination.js +109 -0
- package/dist/api/reconciler/coordination.js.map +1 -0
- package/dist/api/reconciler/coordination.jsonld +186 -0
- package/dist/api/reconciler/index.d.ts +4 -0
- package/dist/api/reconciler/index.js +21 -0
- package/dist/api/reconciler/index.js.map +1 -0
- package/dist/api/runs/ManagedRunWorker.js +0 -5
- package/dist/api/runs/ManagedRunWorker.js.map +1 -1
- package/dist/api/runs/RunStateCenter.d.ts +1 -1
- package/dist/api/runs/RunStateCenter.js +12 -28
- package/dist/api/runs/RunStateCenter.js.map +1 -1
- package/dist/api/runs/store.d.ts +12 -15
- package/dist/api/runs/store.js +24 -15
- package/dist/api/runs/store.js.map +1 -1
- package/dist/api/tasks/TaskMaterializer.d.ts +1 -0
- package/dist/api/tasks/TaskMaterializer.js +10 -13
- package/dist/api/tasks/TaskMaterializer.js.map +1 -1
- package/dist/api/tasks/TaskService.d.ts +0 -2
- package/dist/api/tasks/TaskService.js +6 -16
- package/dist/api/tasks/TaskService.js.map +1 -1
- package/dist/api/tasks/store.d.ts +0 -2
- package/dist/api/tasks/store.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.js +4 -5
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/backup.js +1 -1
- package/dist/cli/commands/backup.js.map +1 -1
- package/dist/cli/commands/login.js +1 -1
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/pod.js +1 -1
- package/dist/cli/commands/pod.js.map +1 -1
- package/dist/cli/lib/auth-helper.d.ts +5 -3
- package/dist/cli/lib/auth-helper.js +5 -3
- package/dist/cli/lib/auth-helper.js.map +1 -1
- package/dist/cli/lib/credentials-store.d.ts +22 -4
- package/dist/cli/lib/credentials-store.js +68 -51
- package/dist/cli/lib/credentials-store.js.map +1 -1
- package/dist/components/components.jsonld +5 -1
- package/dist/components/context.jsonld +103 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/provision/LocalPodProvisioningService.d.ts +1 -0
- package/dist/provision/LocalPodProvisioningService.js +9 -0
- package/dist/provision/LocalPodProvisioningService.js.map +1 -1
- package/dist/provision/LocalPodProvisioningService.jsonld +4 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../src/cli/commands/backup.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { mkdirSync, writeFileSync, readFileSync, readdirSync, statSync, existsSync } from 'fs';\nimport { join, relative, dirname } from 'path';\nimport { login, checkServer } from '../lib/css-account';\nimport { loadCredentials, getClientCredentials } from '../lib/credentials-store';\nimport { getAccessToken } from '../lib/solid-auth';\n\ninterface BackupArgs {\n url?: string;\n email?: string;\n password?: string;\n}\n\ninterface BackupExportArgs extends BackupArgs {\n output: string;\n}\n\ninterface BackupImportArgs extends BackupArgs {\n input: string;\n}\n\nfunction resolveUrl(url?: string, credUrl?: string): string {\n const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\n/**\n * Resolve auth: prefer client credentials from ~/.xpod/, fall back to email/password.\n * Returns { authHeader, podUrl }.\n */\nasync function resolveBackupAuth(\n argv: BackupArgs,\n): Promise<{ authHeader: string; podUrl: string }> {\n const creds = loadCredentials();\n\n // Try client credentials first\n if (creds) {\n const clientCreds = getClientCredentials(creds);\n if (clientCreds) {\n const baseUrl = resolveUrl(argv.url, creds.url);\n const tokenResult = await getAccessToken(clientCreds.clientId, clientCreds.clientSecret, baseUrl);\n if (tokenResult) {\n // Derive pod URL from webId\n const webIdUrl = new URL(creds.webId);\n const pathParts = webIdUrl.pathname.split('/').filter(Boolean);\n const podUrl = `${webIdUrl.origin}/${pathParts[0]}/`;\n return { authHeader: `Bearer ${tokenResult.accessToken}`, podUrl };\n }\n }\n }\n\n // Fall back to email/password\n if (!argv.email || !argv.password) {\n console.error('No credentials found. Run `xpod auth create-credentials` or provide --email and --password.');\n process.exit(1);\n }\n\n const baseUrl = resolveUrl(argv.url, creds?.url);\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n\n const token = await login(argv.email, argv.password, baseUrl);\n if (!token) {\n console.error('Login failed. Check email/password.');\n process.exit(1);\n }\n\n // Resolve pod URL via account API\n const res = await fetch(`${baseUrl}.account/`, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n if (!res.ok) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n const data = (await res.json()) as { pods?: Record<string, string> };\n const podUrl = data.pods ? Object.values(data.pods)[0] : undefined;\n if (!podUrl) {\n console.error('No pod found for this account.');\n process.exit(1);\n }\n\n return { authHeader: `CSS-Account-Token ${token}`, podUrl };\n}\n\n/**\n * Parse ldp:contains links from a Turtle container listing.\n */\nfunction parseContainedUrls(turtle: string, containerUrl: string): string[] {\n const urls: string[] = [];\n const regex = /<([^>]+)>/g;\n let match: RegExpExecArray | null;\n const lines = turtle.split('\\n');\n let inContains = false;\n for (const line of lines) {\n if (line.includes('ldp:contains') || line.includes('http://www.w3.org/ns/ldp#contains')) {\n inContains = true;\n }\n if (inContains) {\n while ((match = regex.exec(line)) !== null) {\n const url = match[1];\n if (url !== containerUrl && !url.startsWith('http://www.w3.org/') && !url.startsWith('http://purl.org/')) {\n urls.push(url);\n }\n }\n if (line.includes('.')) inContains = false;\n }\n }\n return urls;\n}\n\nfunction isContainer(url: string): boolean {\n return url.endsWith('/');\n}\n\ninterface FetchedResource {\n url: string;\n contentType: string;\n body: Buffer;\n}\n\nasync function fetchResource(\n url: string,\n authHeader: string,\n): Promise<FetchedResource | null> {\n try {\n const res = await fetch(url, {\n headers: { Authorization: authHeader },\n });\n if (!res.ok) {\n console.error(` WARN: GET ${url} → ${res.status}`);\n return null;\n }\n const contentType = res.headers.get('content-type') ?? 'application/octet-stream';\n const body = Buffer.from(await res.arrayBuffer());\n return { url, contentType, body };\n } catch (err) {\n console.error(` WARN: GET ${url} failed: ${err instanceof Error ? err.message : err}`);\n return null;\n }\n}\n\nasync function fetchContainer(\n containerUrl: string,\n authHeader: string,\n): Promise<string | null> {\n try {\n const res = await fetch(containerUrl, {\n headers: {\n Accept: 'text/turtle',\n Authorization: authHeader,\n },\n });\n if (!res.ok) return null;\n return await res.text();\n } catch {\n return null;\n }\n}\n\nasync function crawlAndSave(\n containerUrl: string,\n authHeader: string,\n podUrl: string,\n outputDir: string,\n stats: { resources: number; bytes: number },\n): Promise<void> {\n const turtle = await fetchContainer(containerUrl, authHeader);\n if (!turtle) {\n console.error(` WARN: Cannot read container ${containerUrl}`);\n return;\n }\n\n const contained = parseContainedUrls(turtle, containerUrl);\n\n for (const url of contained) {\n const relativePath = url.startsWith(podUrl) ? url.slice(podUrl.length) : url;\n\n if (isContainer(url)) {\n const dirPath = join(outputDir, relativePath);\n mkdirSync(dirPath, { recursive: true });\n await crawlAndSave(url, authHeader, podUrl, outputDir, stats);\n } else {\n const resource = await fetchResource(url, authHeader);\n if (resource) {\n const filePath = join(outputDir, relativePath);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, resource.body);\n stats.resources++;\n stats.bytes += resource.body.length;\n console.error(` ${relativePath} (${resource.body.length} bytes)`);\n }\n }\n }\n\n const aclUrl = `${containerUrl}.acl`;\n const aclResource = await fetchResource(aclUrl, authHeader);\n if (aclResource) {\n const aclRelative = aclUrl.startsWith(podUrl) ? aclUrl.slice(podUrl.length) : `${containerUrl.slice(podUrl.length)}.acl`;\n const aclPath = join(outputDir, aclRelative);\n mkdirSync(dirname(aclPath), { recursive: true });\n writeFileSync(aclPath, aclResource.body);\n stats.resources++;\n stats.bytes += aclResource.body.length;\n }\n}\n\nasync function restoreFromDir(\n dirPath: string,\n podUrl: string,\n authHeader: string,\n basePath: string,\n stats: { resources: number; bytes: number },\n): Promise<void> {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const relativePath = relative(basePath, join(dirPath, entry.name));\n const containerUrl = `${podUrl}${relativePath}/`;\n try {\n await fetch(containerUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'text/turtle',\n Authorization: authHeader,\n },\n body: '',\n });\n } catch {\n // Container may already exist\n }\n await restoreFromDir(join(dirPath, entry.name), podUrl, authHeader, basePath, stats);\n }\n }\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const filePath = join(dirPath, entry.name);\n const relativePath = relative(basePath, filePath);\n const resourceUrl = `${podUrl}${relativePath}`;\n const body = readFileSync(filePath);\n\n let contentType = 'application/octet-stream';\n if (entry.name.endsWith('.ttl')) contentType = 'text/turtle';\n else if (entry.name.endsWith('.json') || entry.name.endsWith('.jsonld')) contentType = 'application/ld+json';\n else if (entry.name.endsWith('.acl')) contentType = 'text/turtle';\n else if (entry.name.endsWith('.html')) contentType = 'text/html';\n else if (entry.name.endsWith('.txt')) contentType = 'text/plain';\n else if (entry.name.endsWith('.png')) contentType = 'image/png';\n else if (entry.name.endsWith('.jpg') || entry.name.endsWith('.jpeg')) contentType = 'image/jpeg';\n\n const res = await fetch(resourceUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': contentType,\n Authorization: authHeader,\n },\n body,\n });\n\n if (res.ok) {\n stats.resources++;\n stats.bytes += body.length;\n console.error(` ${relativePath} (${body.length} bytes)`);\n } else {\n console.error(` WARN: PUT ${resourceUrl} → ${res.status}`);\n }\n }\n }\n}\n\nconst backupCommand: CommandModule<object, BackupExportArgs> = {\n command: 'backup',\n describe: 'Backup a Pod to a local directory',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email (optional if credentials stored)' })\n .option('password', { type: 'string', description: 'Account password (optional if credentials stored)' })\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .option('output', {\n alias: 'o',\n type: 'string',\n demandOption: true,\n description: 'Output directory path',\n }),\n handler: async (argv) => {\n const { authHeader, podUrl } = await resolveBackupAuth(argv);\n\n console.log(`Backing up pod: ${podUrl}`);\n console.log(`Output: ${argv.output}\\n`);\n\n mkdirSync(argv.output, { recursive: true });\n const stats = { resources: 0, bytes: 0 };\n\n await crawlAndSave(podUrl, authHeader, podUrl, argv.output, stats);\n\n console.log(`\\nBackup complete: ${stats.resources} resources, ${(stats.bytes / 1024).toFixed(1)} KB`);\n },\n};\n\nconst restoreCommand: CommandModule<object, BackupImportArgs> = {\n command: 'restore',\n describe: 'Restore a Pod from a local backup directory',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email (optional if credentials stored)' })\n .option('password', { type: 'string', description: 'Account password (optional if credentials stored)' })\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .option('input', {\n alias: 'i',\n type: 'string',\n demandOption: true,\n description: 'Input directory path',\n }),\n handler: async (argv) => {\n if (!existsSync(argv.input) || !statSync(argv.input).isDirectory()) {\n console.error(`Input path is not a directory: ${argv.input}`);\n process.exit(1);\n }\n\n const { authHeader, podUrl } = await resolveBackupAuth(argv);\n\n console.log(`Restoring to pod: ${podUrl}`);\n console.log(`Input: ${argv.input}\\n`);\n\n const stats = { resources: 0, bytes: 0 };\n await restoreFromDir(argv.input, podUrl, authHeader, argv.input, stats);\n\n console.log(`\\nRestore complete: ${stats.resources} resources, ${(stats.bytes / 1024).toFixed(1)} KB`);\n },\n};\n\nexport { backupCommand, restoreCommand };\n"]}
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../src/cli/commands/backup.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { mkdirSync, writeFileSync, readFileSync, readdirSync, statSync, existsSync } from 'fs';\nimport { join, relative, dirname } from 'path';\nimport { login, checkServer } from '../lib/css-account';\nimport { loadCredentials, getClientCredentials } from '../lib/credentials-store';\nimport { getAccessToken } from '../lib/solid-auth';\n\ninterface BackupArgs {\n url?: string;\n email?: string;\n password?: string;\n}\n\ninterface BackupExportArgs extends BackupArgs {\n output: string;\n}\n\ninterface BackupImportArgs extends BackupArgs {\n input: string;\n}\n\nfunction resolveUrl(url?: string, credUrl?: string): string {\n const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\n/**\n * Resolve auth: prefer client credentials from $SOLID_HOME/auth/, fall back to email/password.\n * Returns { authHeader, podUrl }.\n */\nasync function resolveBackupAuth(\n argv: BackupArgs,\n): Promise<{ authHeader: string; podUrl: string }> {\n const creds = loadCredentials();\n\n // Try client credentials first\n if (creds) {\n const clientCreds = getClientCredentials(creds);\n if (clientCreds) {\n const baseUrl = resolveUrl(argv.url, creds.url);\n const tokenResult = await getAccessToken(clientCreds.clientId, clientCreds.clientSecret, baseUrl);\n if (tokenResult) {\n // Derive pod URL from webId\n const webIdUrl = new URL(creds.webId);\n const pathParts = webIdUrl.pathname.split('/').filter(Boolean);\n const podUrl = `${webIdUrl.origin}/${pathParts[0]}/`;\n return { authHeader: `Bearer ${tokenResult.accessToken}`, podUrl };\n }\n }\n }\n\n // Fall back to email/password\n if (!argv.email || !argv.password) {\n console.error('No credentials found. Run `xpod auth create-credentials` or provide --email and --password.');\n process.exit(1);\n }\n\n const baseUrl = resolveUrl(argv.url, creds?.url);\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n\n const token = await login(argv.email, argv.password, baseUrl);\n if (!token) {\n console.error('Login failed. Check email/password.');\n process.exit(1);\n }\n\n // Resolve pod URL via account API\n const res = await fetch(`${baseUrl}.account/`, {\n headers: {\n Accept: 'application/json',\n Authorization: `CSS-Account-Token ${token}`,\n },\n });\n if (!res.ok) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n const data = (await res.json()) as { pods?: Record<string, string> };\n const podUrl = data.pods ? Object.values(data.pods)[0] : undefined;\n if (!podUrl) {\n console.error('No pod found for this account.');\n process.exit(1);\n }\n\n return { authHeader: `CSS-Account-Token ${token}`, podUrl };\n}\n\n/**\n * Parse ldp:contains links from a Turtle container listing.\n */\nfunction parseContainedUrls(turtle: string, containerUrl: string): string[] {\n const urls: string[] = [];\n const regex = /<([^>]+)>/g;\n let match: RegExpExecArray | null;\n const lines = turtle.split('\\n');\n let inContains = false;\n for (const line of lines) {\n if (line.includes('ldp:contains') || line.includes('http://www.w3.org/ns/ldp#contains')) {\n inContains = true;\n }\n if (inContains) {\n while ((match = regex.exec(line)) !== null) {\n const url = match[1];\n if (url !== containerUrl && !url.startsWith('http://www.w3.org/') && !url.startsWith('http://purl.org/')) {\n urls.push(url);\n }\n }\n if (line.includes('.')) inContains = false;\n }\n }\n return urls;\n}\n\nfunction isContainer(url: string): boolean {\n return url.endsWith('/');\n}\n\ninterface FetchedResource {\n url: string;\n contentType: string;\n body: Buffer;\n}\n\nasync function fetchResource(\n url: string,\n authHeader: string,\n): Promise<FetchedResource | null> {\n try {\n const res = await fetch(url, {\n headers: { Authorization: authHeader },\n });\n if (!res.ok) {\n console.error(` WARN: GET ${url} → ${res.status}`);\n return null;\n }\n const contentType = res.headers.get('content-type') ?? 'application/octet-stream';\n const body = Buffer.from(await res.arrayBuffer());\n return { url, contentType, body };\n } catch (err) {\n console.error(` WARN: GET ${url} failed: ${err instanceof Error ? err.message : err}`);\n return null;\n }\n}\n\nasync function fetchContainer(\n containerUrl: string,\n authHeader: string,\n): Promise<string | null> {\n try {\n const res = await fetch(containerUrl, {\n headers: {\n Accept: 'text/turtle',\n Authorization: authHeader,\n },\n });\n if (!res.ok) return null;\n return await res.text();\n } catch {\n return null;\n }\n}\n\nasync function crawlAndSave(\n containerUrl: string,\n authHeader: string,\n podUrl: string,\n outputDir: string,\n stats: { resources: number; bytes: number },\n): Promise<void> {\n const turtle = await fetchContainer(containerUrl, authHeader);\n if (!turtle) {\n console.error(` WARN: Cannot read container ${containerUrl}`);\n return;\n }\n\n const contained = parseContainedUrls(turtle, containerUrl);\n\n for (const url of contained) {\n const relativePath = url.startsWith(podUrl) ? url.slice(podUrl.length) : url;\n\n if (isContainer(url)) {\n const dirPath = join(outputDir, relativePath);\n mkdirSync(dirPath, { recursive: true });\n await crawlAndSave(url, authHeader, podUrl, outputDir, stats);\n } else {\n const resource = await fetchResource(url, authHeader);\n if (resource) {\n const filePath = join(outputDir, relativePath);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, resource.body);\n stats.resources++;\n stats.bytes += resource.body.length;\n console.error(` ${relativePath} (${resource.body.length} bytes)`);\n }\n }\n }\n\n const aclUrl = `${containerUrl}.acl`;\n const aclResource = await fetchResource(aclUrl, authHeader);\n if (aclResource) {\n const aclRelative = aclUrl.startsWith(podUrl) ? aclUrl.slice(podUrl.length) : `${containerUrl.slice(podUrl.length)}.acl`;\n const aclPath = join(outputDir, aclRelative);\n mkdirSync(dirname(aclPath), { recursive: true });\n writeFileSync(aclPath, aclResource.body);\n stats.resources++;\n stats.bytes += aclResource.body.length;\n }\n}\n\nasync function restoreFromDir(\n dirPath: string,\n podUrl: string,\n authHeader: string,\n basePath: string,\n stats: { resources: number; bytes: number },\n): Promise<void> {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const relativePath = relative(basePath, join(dirPath, entry.name));\n const containerUrl = `${podUrl}${relativePath}/`;\n try {\n await fetch(containerUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'text/turtle',\n Authorization: authHeader,\n },\n body: '',\n });\n } catch {\n // Container may already exist\n }\n await restoreFromDir(join(dirPath, entry.name), podUrl, authHeader, basePath, stats);\n }\n }\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const filePath = join(dirPath, entry.name);\n const relativePath = relative(basePath, filePath);\n const resourceUrl = `${podUrl}${relativePath}`;\n const body = readFileSync(filePath);\n\n let contentType = 'application/octet-stream';\n if (entry.name.endsWith('.ttl')) contentType = 'text/turtle';\n else if (entry.name.endsWith('.json') || entry.name.endsWith('.jsonld')) contentType = 'application/ld+json';\n else if (entry.name.endsWith('.acl')) contentType = 'text/turtle';\n else if (entry.name.endsWith('.html')) contentType = 'text/html';\n else if (entry.name.endsWith('.txt')) contentType = 'text/plain';\n else if (entry.name.endsWith('.png')) contentType = 'image/png';\n else if (entry.name.endsWith('.jpg') || entry.name.endsWith('.jpeg')) contentType = 'image/jpeg';\n\n const res = await fetch(resourceUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': contentType,\n Authorization: authHeader,\n },\n body,\n });\n\n if (res.ok) {\n stats.resources++;\n stats.bytes += body.length;\n console.error(` ${relativePath} (${body.length} bytes)`);\n } else {\n console.error(` WARN: PUT ${resourceUrl} → ${res.status}`);\n }\n }\n }\n}\n\nconst backupCommand: CommandModule<object, BackupExportArgs> = {\n command: 'backup',\n describe: 'Backup a Pod to a local directory',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email (optional if credentials stored)' })\n .option('password', { type: 'string', description: 'Account password (optional if credentials stored)' })\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .option('output', {\n alias: 'o',\n type: 'string',\n demandOption: true,\n description: 'Output directory path',\n }),\n handler: async (argv) => {\n const { authHeader, podUrl } = await resolveBackupAuth(argv);\n\n console.log(`Backing up pod: ${podUrl}`);\n console.log(`Output: ${argv.output}\\n`);\n\n mkdirSync(argv.output, { recursive: true });\n const stats = { resources: 0, bytes: 0 };\n\n await crawlAndSave(podUrl, authHeader, podUrl, argv.output, stats);\n\n console.log(`\\nBackup complete: ${stats.resources} resources, ${(stats.bytes / 1024).toFixed(1)} KB`);\n },\n};\n\nconst restoreCommand: CommandModule<object, BackupImportArgs> = {\n command: 'restore',\n describe: 'Restore a Pod from a local backup directory',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email (optional if credentials stored)' })\n .option('password', { type: 'string', description: 'Account password (optional if credentials stored)' })\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .option('input', {\n alias: 'i',\n type: 'string',\n demandOption: true,\n description: 'Input directory path',\n }),\n handler: async (argv) => {\n if (!existsSync(argv.input) || !statSync(argv.input).isDirectory()) {\n console.error(`Input path is not a directory: ${argv.input}`);\n process.exit(1);\n }\n\n const { authHeader, podUrl } = await resolveBackupAuth(argv);\n\n console.log(`Restoring to pod: ${podUrl}`);\n console.log(`Input: ${argv.input}\\n`);\n\n const stats = { resources: 0, bytes: 0 };\n await restoreFromDir(argv.input, podUrl, authHeader, argv.input, stats);\n\n console.log(`\\nRestore complete: ${stats.resources} resources, ${(stats.bytes / 1024).toFixed(1)} KB`);\n },\n};\n\nexport { backupCommand, restoreCommand };\n"]}
|
|
@@ -87,7 +87,7 @@ exports.loginCommandModule = {
|
|
|
87
87
|
clientSecret: credential.secret ?? '',
|
|
88
88
|
},
|
|
89
89
|
});
|
|
90
|
-
console.log(`\nSaved to ${(0, credentials_store_1.
|
|
90
|
+
console.log(`\nSaved to ${(0, credentials_store_1.getSolidCredentialsPath)()}`);
|
|
91
91
|
}
|
|
92
92
|
else {
|
|
93
93
|
console.log('Credentials created.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":";;;AACA,oDAM4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport {\n checkServer,\n login,\n getAccountControls,\n createClientCredentials,\n getAccountData,\n} from '../lib/css-account';\nimport { saveCredentials, getSolidCredentialsPath } from '../lib/credentials-store';\nimport { promptPassword, promptText } from '../lib/prompt';\nimport { CliCommandError, handleCliError } from '../lib/output';\n\ninterface LoginArgs {\n url?: string;\n email?: string;\n password?: string;\n 'web-id'?: string;\n name?: string;\n output?: boolean;\n}\n\nfunction resolveUrl(url?: string): string {\n const raw = url || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\nasync function resolveWebId(baseUrl: string, token: string, explicitWebId?: string): Promise<string> {\n if (explicitWebId) {\n return explicitWebId;\n }\n\n const accountData = await getAccountData(token, baseUrl);\n const webIds = accountData ? Object.keys(accountData.webIds) : [];\n if (webIds.length === 1 && webIds[0]) {\n return webIds[0];\n }\n if (webIds.length > 1) {\n throw new CliCommandError(\n 'webid_ambiguous',\n 'Multiple WebIDs are configured. Re-run with --web-id to select the acting identity.',\n 2,\n { webIds },\n );\n }\n throw new CliCommandError('webid_missing', 'No WebID found. Specify --web-id explicitly.', 2);\n}\n\nexport const loginCommandModule: CommandModule<object, LoginArgs> = {\n command: 'login',\n describe: 'Login to xpod/Solid and store CLI client credentials',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n default: process.env.CSS_BASE_URL || 'http://localhost:3000',\n })\n .option('email', { type: 'string', description: 'Account email (will prompt if not provided)' })\n .option('password', { type: 'string', description: 'Account password (will prompt securely if not provided)' })\n .option('web-id', { type: 'string', description: 'WebID to bind credentials to' })\n .option('name', { type: 'string', description: 'Credential label' })\n .option('output', { type: 'boolean', default: false, description: 'Do not save credentials; print non-secret metadata only' }),\n handler: async (argv) => {\n const baseUrl = resolveUrl(argv.url);\n\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n\n let email = argv.email;\n if (!email) {\n email = await promptText('Email: ');\n if (!email) {\n console.error('Email is required');\n process.exit(1);\n }\n }\n\n let password = argv.password;\n if (!password) {\n password = await promptPassword('Password: ');\n if (!password) {\n console.error('Password is required');\n process.exit(1);\n }\n }\n\n const token = await login(email, password, baseUrl);\n if (!token) {\n console.error('Login failed.');\n process.exit(1);\n }\n\n const controls = await getAccountControls(token, baseUrl);\n if (!controls?.clientCredentials) {\n console.error('Cannot find client credentials endpoint.');\n process.exit(1);\n }\n\n const webId = await resolveWebId(baseUrl, token, argv['web-id'])\n .catch((error) => handleCliError(error, false));\n\n const credential = await createClientCredentials(token, controls.clientCredentials, webId, argv.name);\n if (!credential) {\n console.error('Failed to create client credentials.');\n process.exit(1);\n }\n\n if (!argv.output) {\n saveCredentials({\n url: baseUrl,\n webId,\n authType: 'client_credentials',\n secrets: {\n clientId: credential.id,\n clientSecret: credential.secret ?? '',\n },\n });\n console.log(`\\nSaved to ${getSolidCredentialsPath()}`);\n } else {\n console.log('Credentials created.');\n }\n console.log(` client_id: ${credential.id}`);\n console.log(` webId: ${webId}`);\n },\n};\n"]}
|
package/dist/cli/commands/pod.js
CHANGED
|
@@ -9,7 +9,7 @@ function resolveUrl(url, credUrl) {
|
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Try to login via email/password (CSS Account Token) or fall back to
|
|
12
|
-
* client credentials from
|
|
12
|
+
* client credentials from $SOLID_HOME/auth/credentials.json.
|
|
13
13
|
*
|
|
14
14
|
* Returns { token, mode } where mode indicates which auth was used.
|
|
15
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pod.js","sourceRoot":"","sources":["../../../src/cli/commands/pod.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport {\n checkServer,\n login,\n getAccountData,\n createPod,\n} from '../lib/css-account';\nimport { loadCredentials } from '../lib/credentials-store';\n\ninterface PodArgs {\n url?: string;\n}\n\ninterface PodAuthArgs extends PodArgs {\n email?: string;\n password?: string;\n}\n\ninterface PodCreateArgs extends PodAuthArgs {\n name: string;\n}\n\nfunction resolveUrl(url?: string, credUrl?: string): string {\n const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\n/**\n * Try to login via email/password (CSS Account Token) or fall back to\n * client credentials from ~/.xpod/credentials.json.\n *\n * Returns { token, mode } where mode indicates which auth was used.\n */\nasync function resolveLogin(\n email: string | undefined,\n password: string | undefined,\n baseUrl: string,\n): Promise<{ token: string; mode: 'account' }> {\n if (email && password) {\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n const token = await login(email, password, baseUrl);\n if (!token) {\n console.error('Login failed. Check email/password.');\n process.exit(1);\n }\n return { token, mode: 'account' };\n }\n\n // Fall back to credentials store — get CSS Account Token via OIDC isn't possible,\n // but pod/account commands need CSS Account Token. For now, require email/password\n // for commands that use .account/ API.\n console.error('This command requires --email and --password (or run `xpod auth create-credentials` for other commands).');\n console.error('Pod management commands use the CSS Account API which requires email/password authentication.');\n process.exit(1);\n}\n\nconst podCreateCommand: CommandModule<PodArgs, PodCreateArgs> = {\n command: 'create <name>',\n describe: 'Create a new pod',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data?.controls.pod) {\n console.error('Cannot find pod creation endpoint.');\n process.exit(1);\n }\n\n const result = await createPod(token, data.controls.pod, argv.name);\n if (!result) {\n console.error(`Failed to create pod \"${argv.name}\".`);\n process.exit(1);\n }\n\n console.log(`Pod created:`);\n console.log(` URL: ${result.podUrl}`);\n console.log(` WebID: ${result.webId}`);\n },\n};\n\nconst podListCommand: CommandModule<PodArgs, PodAuthArgs> = {\n command: 'list',\n describe: 'List all pods for the account',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const podEntries = Object.entries(data.pods);\n if (podEntries.length === 0) {\n console.log('No pods found.');\n return;\n }\n\n console.log(`Found ${podEntries.length} pod(s):\\n`);\n for (const [url, name] of podEntries) {\n console.log(` ${name}`);\n console.log(` URL: ${url}`);\n }\n\n const webIdEntries = Object.entries(data.webIds);\n if (webIdEntries.length > 0) {\n console.log(`\\nWebIDs:`);\n for (const [url] of webIdEntries) {\n console.log(` ${url}`);\n }\n }\n },\n};\n\nconst podDeleteCommand: CommandModule<PodArgs, PodAuthArgs & { name: string }> = {\n command: 'delete <name>',\n describe: 'Delete a pod (not yet supported)',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async () => {\n console.error('Pod deletion is not yet supported by CSS.');\n console.error('Please delete the pod manually through the server admin interface.');\n process.exit(1);\n },\n};\n\nexport const podCommand: CommandModule<object, PodArgs> = {\n command: 'pod',\n describe: 'Pod management',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .command(podCreateCommand)\n .command(podListCommand)\n .command(podDeleteCommand)\n .demandCommand(1, 'Please specify a pod subcommand'),\n handler: () => {},\n};\n"]}
|
|
1
|
+
{"version":3,"file":"pod.js","sourceRoot":"","sources":["../../../src/cli/commands/pod.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport {\n checkServer,\n login,\n getAccountData,\n createPod,\n} from '../lib/css-account';\nimport { loadCredentials } from '../lib/credentials-store';\n\ninterface PodArgs {\n url?: string;\n}\n\ninterface PodAuthArgs extends PodArgs {\n email?: string;\n password?: string;\n}\n\ninterface PodCreateArgs extends PodAuthArgs {\n name: string;\n}\n\nfunction resolveUrl(url?: string, credUrl?: string): string {\n const raw = url || credUrl || process.env.CSS_BASE_URL || 'http://localhost:3000';\n return raw.endsWith('/') ? raw : `${raw}/`;\n}\n\n/**\n * Try to login via email/password (CSS Account Token) or fall back to\n * client credentials from $SOLID_HOME/auth/credentials.json.\n *\n * Returns { token, mode } where mode indicates which auth was used.\n */\nasync function resolveLogin(\n email: string | undefined,\n password: string | undefined,\n baseUrl: string,\n): Promise<{ token: string; mode: 'account' }> {\n if (email && password) {\n if (!(await checkServer(baseUrl))) {\n console.error(`Cannot reach server at ${baseUrl}`);\n process.exit(1);\n }\n const token = await login(email, password, baseUrl);\n if (!token) {\n console.error('Login failed. Check email/password.');\n process.exit(1);\n }\n return { token, mode: 'account' };\n }\n\n // Fall back to credentials store — get CSS Account Token via OIDC isn't possible,\n // but pod/account commands need CSS Account Token. For now, require email/password\n // for commands that use .account/ API.\n console.error('This command requires --email and --password (or run `xpod auth create-credentials` for other commands).');\n console.error('Pod management commands use the CSS Account API which requires email/password authentication.');\n process.exit(1);\n}\n\nconst podCreateCommand: CommandModule<PodArgs, PodCreateArgs> = {\n command: 'create <name>',\n describe: 'Create a new pod',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data?.controls.pod) {\n console.error('Cannot find pod creation endpoint.');\n process.exit(1);\n }\n\n const result = await createPod(token, data.controls.pod, argv.name);\n if (!result) {\n console.error(`Failed to create pod \"${argv.name}\".`);\n process.exit(1);\n }\n\n console.log(`Pod created:`);\n console.log(` URL: ${result.podUrl}`);\n console.log(` WebID: ${result.webId}`);\n },\n};\n\nconst podListCommand: CommandModule<PodArgs, PodAuthArgs> = {\n command: 'list',\n describe: 'List all pods for the account',\n builder: (yargs) =>\n yargs\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async (argv) => {\n const creds = loadCredentials();\n const baseUrl = resolveUrl(argv.url, creds?.url);\n const { token } = await resolveLogin(argv.email, argv.password, baseUrl);\n\n const data = await getAccountData(token, baseUrl);\n if (!data) {\n console.error('Failed to get account info.');\n process.exit(1);\n }\n\n const podEntries = Object.entries(data.pods);\n if (podEntries.length === 0) {\n console.log('No pods found.');\n return;\n }\n\n console.log(`Found ${podEntries.length} pod(s):\\n`);\n for (const [url, name] of podEntries) {\n console.log(` ${name}`);\n console.log(` URL: ${url}`);\n }\n\n const webIdEntries = Object.entries(data.webIds);\n if (webIdEntries.length > 0) {\n console.log(`\\nWebIDs:`);\n for (const [url] of webIdEntries) {\n console.log(` ${url}`);\n }\n }\n },\n};\n\nconst podDeleteCommand: CommandModule<PodArgs, PodAuthArgs & { name: string }> = {\n command: 'delete <name>',\n describe: 'Delete a pod (not yet supported)',\n builder: (yargs) =>\n yargs\n .positional('name', { type: 'string', demandOption: true, description: 'Pod name' })\n .option('email', { type: 'string', description: 'Account email' })\n .option('password', { type: 'string', description: 'Account password' }),\n handler: async () => {\n console.error('Pod deletion is not yet supported by CSS.');\n console.error('Please delete the pod manually through the server admin interface.');\n process.exit(1);\n },\n};\n\nexport const podCommand: CommandModule<object, PodArgs> = {\n command: 'pod',\n describe: 'Pod management',\n builder: (yargs) =>\n yargs\n .option('url', {\n alias: 'u',\n type: 'string',\n description: 'Server base URL',\n })\n .command(podCreateCommand)\n .command(podListCommand)\n .command(podDeleteCommand)\n .demandCommand(1, 'Please specify a pod subcommand'),\n handler: () => {},\n};\n"]}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI Authentication Helper
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 统一的认证入口。所有 Solid app 只从 `$SOLID_HOME/auth/credentials.json`
|
|
5
|
+
* 这一套 shared Solid auth source 恢复权限;`~/.xpod/config.json` /
|
|
6
|
+
* `~/.xpod/secrets.json` 不是 Solid auth source。
|
|
5
7
|
*/
|
|
6
8
|
import { type PodAuth } from './solid-auth';
|
|
7
9
|
/**
|
|
8
10
|
* 获取认证信息
|
|
9
11
|
*
|
|
10
|
-
*
|
|
11
|
-
* 1.
|
|
12
|
+
* 规则:
|
|
13
|
+
* 1. 只读取 shared Solid auth source:$SOLID_HOME/auth/credentials.json
|
|
12
14
|
* 2. 如果没有,提示用户先运行 `xpod auth create-credentials`
|
|
13
15
|
*
|
|
14
16
|
* @returns PodAuth 或 null(如果没有保存的 credentials)
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* CLI Authentication Helper
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* 统一的认证入口。所有 Solid app 只从 `$SOLID_HOME/auth/credentials.json`
|
|
6
|
+
* 这一套 shared Solid auth source 恢复权限;`~/.xpod/config.json` /
|
|
7
|
+
* `~/.xpod/secrets.json` 不是 Solid auth source。
|
|
6
8
|
*/
|
|
7
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
10
|
exports.getAuth = getAuth;
|
|
@@ -12,8 +14,8 @@ const credentials_store_1 = require("./credentials-store");
|
|
|
12
14
|
/**
|
|
13
15
|
* 获取认证信息
|
|
14
16
|
*
|
|
15
|
-
*
|
|
16
|
-
* 1.
|
|
17
|
+
* 规则:
|
|
18
|
+
* 1. 只读取 shared Solid auth source:$SOLID_HOME/auth/credentials.json
|
|
17
19
|
* 2. 如果没有,提示用户先运行 `xpod auth create-credentials`
|
|
18
20
|
*
|
|
19
21
|
* @returns PodAuth 或 null(如果没有保存的 credentials)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-helper.js","sourceRoot":"","sources":["../../../src/cli/lib/auth-helper.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"auth-helper.js","sourceRoot":"","sources":["../../../src/cli/lib/auth-helper.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAcH,0BA8BC;AAOD,kCAUC;AA3DD,6CAA0D;AAC1D,2DAA2E;AAE3E;;;;;;;;GAQG;AACI,KAAK,UAAU,OAAO;IAC3B,MAAM,KAAK,GAAG,IAAA,mCAAe,GAAE,CAAC;IAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,IAAA,uCAAmB,EAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAY,EAC7B,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,KAAK,CAAC,OAAO,CAAC,YAAY,EAC1B,UAAU,CACX,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC;IAE7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * CLI Authentication Helper\n *\n * 统一的认证入口。所有 Solid app 只从 `$SOLID_HOME/auth/credentials.json`\n * 这一套 shared Solid auth source 恢复权限;`~/.xpod/config.json` /\n * `~/.xpod/secrets.json` 不是 Solid auth source。\n */\n\nimport { authenticate, type PodAuth } from './solid-auth';\nimport { loadCredentials, isClientCredentials } from './credentials-store';\n\n/**\n * 获取认证信息\n *\n * 规则:\n * 1. 只读取 shared Solid auth source:$SOLID_HOME/auth/credentials.json\n * 2. 如果没有,提示用户先运行 `xpod auth create-credentials`\n *\n * @returns PodAuth 或 null(如果没有保存的 credentials)\n */\nexport async function getAuth(): Promise<PodAuth | null> {\n const creds = loadCredentials();\n\n if (!creds) {\n return null;\n }\n\n // 检查是否是 client credentials\n if (!isClientCredentials(creds.secrets)) {\n console.error('Saved credentials are not client credentials.');\n console.error('Please run: xpod auth create-credentials');\n return null;\n }\n\n // 使用 client credentials 认证\n try {\n const oidcIssuer = creds.url;\n const auth = await authenticate(\n creds.secrets.clientId,\n creds.secrets.clientSecret,\n oidcIssuer,\n );\n\n return auth;\n } catch (error) {\n console.error('Authentication failed:', error);\n console.error('Your credentials may be expired or invalid.');\n console.error('Please run: xpod auth create-credentials');\n return null;\n }\n}\n\n/**\n * 获取认证信息,如果失败则退出进程\n *\n * @returns PodAuth\n */\nexport async function requireAuth(): Promise<PodAuth> {\n const auth = await getAuth();\n\n if (!auth) {\n console.error('\\nNo credentials found. Please run:');\n console.error(' xpod auth create-credentials --email your@email.com');\n process.exit(1);\n }\n\n return auth;\n}\n"]}
|
|
@@ -12,16 +12,34 @@ export interface OidcOAuthSecrets {
|
|
|
12
12
|
oidcRefreshToken: string;
|
|
13
13
|
oidcAccessToken: string;
|
|
14
14
|
oidcExpiresAt: string;
|
|
15
|
+
oidcClientId?: string;
|
|
15
16
|
}
|
|
16
17
|
export type StoredSecrets = ClientCredentialsSecrets | OidcOAuthSecrets;
|
|
17
18
|
export interface StoredCredentials extends StoredConfig {
|
|
18
19
|
secrets: StoredSecrets;
|
|
19
20
|
}
|
|
20
|
-
export declare function
|
|
21
|
-
export declare function
|
|
21
|
+
export declare function getSolidHomeDir(): string;
|
|
22
|
+
export declare function getSolidAuthDir(): string;
|
|
23
|
+
export declare function getSolidCredentialsPath(): string;
|
|
22
24
|
export declare function saveCredentials(creds: StoredCredentials): void;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Load credentials from the shared Solid auth store.
|
|
27
|
+
*
|
|
28
|
+
* This is the only credential source for Solid apps (LinX, xpod, etc.).
|
|
29
|
+
*
|
|
30
|
+
* Format:
|
|
31
|
+
* {
|
|
32
|
+
* url: "https://id.undefineds.co/",
|
|
33
|
+
* webId: "https://id.undefineds.co/user/profile/card#me",
|
|
34
|
+
* authType: "oidc_oauth",
|
|
35
|
+
* secrets: {
|
|
36
|
+
* oidcRefreshToken: "...",
|
|
37
|
+
* oidcAccessToken: "...",
|
|
38
|
+
* oidcExpiresAt: "2026-06-06T17:10:49.000Z",
|
|
39
|
+
* oidcClientId: "..."
|
|
40
|
+
* }
|
|
41
|
+
* }
|
|
42
|
+
*/
|
|
25
43
|
export declare function loadCredentials(): StoredCredentials | null;
|
|
26
44
|
export declare function clearCredentials(): void;
|
|
27
45
|
export declare function isClientCredentials(secrets: StoredSecrets): secrets is ClientCredentialsSecrets;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
3
|
+
exports.getSolidHomeDir = getSolidHomeDir;
|
|
4
|
+
exports.getSolidAuthDir = getSolidAuthDir;
|
|
5
|
+
exports.getSolidCredentialsPath = getSolidCredentialsPath;
|
|
5
6
|
exports.saveCredentials = saveCredentials;
|
|
6
|
-
exports.loadConfig = loadConfig;
|
|
7
|
-
exports.loadSecrets = loadSecrets;
|
|
8
7
|
exports.loadCredentials = loadCredentials;
|
|
9
8
|
exports.clearCredentials = clearCredentials;
|
|
10
9
|
exports.isClientCredentials = isClientCredentials;
|
|
@@ -12,32 +11,29 @@ exports.isOidcOAuth = isOidcOAuth;
|
|
|
12
11
|
exports.getClientCredentials = getClientCredentials;
|
|
13
12
|
exports.getOAuthCredentials = getOAuthCredentials;
|
|
14
13
|
/**
|
|
15
|
-
*
|
|
14
|
+
* Shared credential storage for all Solid tools (xpod, LinX, etc.).
|
|
16
15
|
*
|
|
17
|
-
*
|
|
18
|
-
* ~/.xpod/secrets.json — secrets (clientId, clientSecret), chmod 600
|
|
16
|
+
* Single Solid auth source: $SOLID_HOME/auth/credentials.json (default: ~/.solid/auth/credentials.json)
|
|
19
17
|
*/
|
|
20
18
|
const fs_1 = require("fs");
|
|
21
19
|
const path_1 = require("path");
|
|
22
20
|
const os_1 = require("os");
|
|
23
|
-
function
|
|
24
|
-
|
|
21
|
+
function getSolidHomeDir() {
|
|
22
|
+
const override = process.env.SOLID_HOME?.trim();
|
|
23
|
+
return override ? override : (0, path_1.join)((0, os_1.homedir)(), '.solid');
|
|
25
24
|
}
|
|
26
|
-
function
|
|
27
|
-
return (0, path_1.join)(
|
|
25
|
+
function getSolidAuthDir() {
|
|
26
|
+
return (0, path_1.join)(getSolidHomeDir(), 'auth');
|
|
28
27
|
}
|
|
29
|
-
function
|
|
30
|
-
return (0, path_1.join)(
|
|
28
|
+
function getSolidCredentialsPath() {
|
|
29
|
+
return (0, path_1.join)(getSolidAuthDir(), 'credentials.json');
|
|
31
30
|
}
|
|
32
31
|
function saveCredentials(creds) {
|
|
33
|
-
const dir =
|
|
32
|
+
const dir = getSolidAuthDir();
|
|
34
33
|
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
35
|
-
const
|
|
36
|
-
(0, fs_1.writeFileSync)(
|
|
37
|
-
(0, fs_1.chmodSync)(
|
|
38
|
-
const secretsPath = getSecretsPath();
|
|
39
|
-
(0, fs_1.writeFileSync)(secretsPath, JSON.stringify(creds.secrets, null, 2) + '\n', 'utf-8');
|
|
40
|
-
(0, fs_1.chmodSync)(secretsPath, 0o600);
|
|
34
|
+
const filePath = getSolidCredentialsPath();
|
|
35
|
+
(0, fs_1.writeFileSync)(filePath, `${JSON.stringify(creds, null, 2)}\n`, 'utf-8');
|
|
36
|
+
(0, fs_1.chmodSync)(filePath, 0o600);
|
|
41
37
|
}
|
|
42
38
|
function readJson(filePath) {
|
|
43
39
|
try {
|
|
@@ -47,46 +43,67 @@ function readJson(filePath) {
|
|
|
47
43
|
return null;
|
|
48
44
|
}
|
|
49
45
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Load credentials from the shared Solid auth store.
|
|
48
|
+
*
|
|
49
|
+
* This is the only credential source for Solid apps (LinX, xpod, etc.).
|
|
50
|
+
*
|
|
51
|
+
* Format:
|
|
52
|
+
* {
|
|
53
|
+
* url: "https://id.undefineds.co/",
|
|
54
|
+
* webId: "https://id.undefineds.co/user/profile/card#me",
|
|
55
|
+
* authType: "oidc_oauth",
|
|
56
|
+
* secrets: {
|
|
57
|
+
* oidcRefreshToken: "...",
|
|
58
|
+
* oidcAccessToken: "...",
|
|
59
|
+
* oidcExpiresAt: "2026-06-06T17:10:49.000Z",
|
|
60
|
+
* oidcClientId: "..."
|
|
61
|
+
* }
|
|
62
|
+
* }
|
|
63
|
+
*/
|
|
64
|
+
function loadCredentials() {
|
|
65
|
+
const data = readJson(getSolidCredentialsPath());
|
|
66
|
+
if (!data || typeof data.url !== 'string' || typeof data.webId !== 'string') {
|
|
67
|
+
return null;
|
|
55
68
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const data = readJson(getSecretsPath());
|
|
60
|
-
if (!data)
|
|
69
|
+
const authType = data.authType === 'oidc_oauth' ? 'oidc_oauth' : 'client_credentials';
|
|
70
|
+
const rawSecrets = data.secrets;
|
|
71
|
+
if (!rawSecrets || typeof rawSecrets !== 'object') {
|
|
61
72
|
return null;
|
|
62
|
-
// Try Client Credentials format
|
|
63
|
-
if (typeof data.clientId === 'string' && typeof data.clientSecret === 'string') {
|
|
64
|
-
return { clientId: data.clientId, clientSecret: data.clientSecret };
|
|
65
73
|
}
|
|
66
|
-
|
|
67
|
-
if (typeof
|
|
68
|
-
typeof data.oidcAccessToken === 'string' &&
|
|
69
|
-
typeof data.oidcExpiresAt === 'string') {
|
|
74
|
+
const secrets = rawSecrets;
|
|
75
|
+
if (typeof secrets.clientId === 'string' && typeof secrets.clientSecret === 'string') {
|
|
70
76
|
return {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
url: data.url,
|
|
78
|
+
webId: data.webId,
|
|
79
|
+
authType,
|
|
80
|
+
secrets: {
|
|
81
|
+
clientId: secrets.clientId,
|
|
82
|
+
clientSecret: secrets.clientSecret,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (typeof secrets.oidcRefreshToken === 'string' &&
|
|
87
|
+
typeof secrets.oidcAccessToken === 'string' &&
|
|
88
|
+
typeof secrets.oidcExpiresAt === 'string') {
|
|
89
|
+
return {
|
|
90
|
+
url: data.url,
|
|
91
|
+
webId: data.webId,
|
|
92
|
+
authType,
|
|
93
|
+
secrets: {
|
|
94
|
+
oidcRefreshToken: secrets.oidcRefreshToken,
|
|
95
|
+
oidcAccessToken: secrets.oidcAccessToken,
|
|
96
|
+
oidcExpiresAt: secrets.oidcExpiresAt,
|
|
97
|
+
oidcClientId: typeof secrets.oidcClientId === 'string' ? secrets.oidcClientId : undefined,
|
|
98
|
+
},
|
|
74
99
|
};
|
|
75
100
|
}
|
|
76
101
|
return null;
|
|
77
102
|
}
|
|
78
|
-
function loadCredentials() {
|
|
79
|
-
const config = loadConfig();
|
|
80
|
-
const secrets = loadSecrets();
|
|
81
|
-
if (!config || !secrets)
|
|
82
|
-
return null;
|
|
83
|
-
return { ...config, secrets };
|
|
84
|
-
}
|
|
85
103
|
function clearCredentials() {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
104
|
+
const p = getSolidCredentialsPath();
|
|
105
|
+
if ((0, fs_1.existsSync)(p))
|
|
106
|
+
(0, fs_1.unlinkSync)(p);
|
|
90
107
|
}
|
|
91
108
|
// ============================================================================
|
|
92
109
|
// Helper functions for type-safe access
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../../../src/cli/lib/credentials-store.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../../../src/cli/lib/credentials-store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared credential storage for all Solid tools (xpod, LinX, etc.).\n *\n * Single Solid auth source: $SOLID_HOME/auth/credentials.json (default: ~/.solid/auth/credentials.json)\n */\nimport { mkdirSync, writeFileSync, readFileSync, unlinkSync, chmodSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport type AuthType = 'client_credentials' | 'oidc_oauth';\n\nexport interface StoredConfig {\n url: string;\n webId: string;\n authType: AuthType;\n}\n\nexport interface ClientCredentialsSecrets {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface OidcOAuthSecrets {\n oidcRefreshToken: string;\n oidcAccessToken: string;\n oidcExpiresAt: string;\n oidcClientId?: string;\n}\n\nexport type StoredSecrets = ClientCredentialsSecrets | OidcOAuthSecrets;\n\nexport interface StoredCredentials extends StoredConfig {\n secrets: StoredSecrets;\n}\n\nexport function getSolidHomeDir(): string {\n const override = process.env.SOLID_HOME?.trim();\n return override ? override : join(homedir(), '.solid');\n}\n\nexport function getSolidAuthDir(): string {\n return join(getSolidHomeDir(), 'auth');\n}\n\nexport function getSolidCredentialsPath(): string {\n return join(getSolidAuthDir(), 'credentials.json');\n}\n\nexport function saveCredentials(creds: StoredCredentials): void {\n const dir = getSolidAuthDir();\n mkdirSync(dir, { recursive: true });\n\n const filePath = getSolidCredentialsPath();\n writeFileSync(filePath, `${JSON.stringify(creds, null, 2)}\\n`, 'utf-8');\n chmodSync(filePath, 0o600);\n}\n\nfunction readJson<T>(filePath: string): T | null {\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Load credentials from the shared Solid auth store.\n *\n * This is the only credential source for Solid apps (LinX, xpod, etc.).\n *\n * Format:\n * {\n * url: \"https://id.undefineds.co/\",\n * webId: \"https://id.undefineds.co/user/profile/card#me\",\n * authType: \"oidc_oauth\",\n * secrets: {\n * oidcRefreshToken: \"...\",\n * oidcAccessToken: \"...\",\n * oidcExpiresAt: \"2026-06-06T17:10:49.000Z\",\n * oidcClientId: \"...\"\n * }\n * }\n */\nexport function loadCredentials(): StoredCredentials | null {\n const data = readJson<Record<string, unknown>>(getSolidCredentialsPath());\n if (!data || typeof data.url !== 'string' || typeof data.webId !== 'string') {\n return null;\n }\n\n const authType = data.authType === 'oidc_oauth' ? 'oidc_oauth' : 'client_credentials';\n const rawSecrets = data.secrets;\n if (!rawSecrets || typeof rawSecrets !== 'object') {\n return null;\n }\n\n const secrets = rawSecrets as Record<string, unknown>;\n if (typeof secrets.clientId === 'string' && typeof secrets.clientSecret === 'string') {\n return {\n url: data.url,\n webId: data.webId,\n authType,\n secrets: {\n clientId: secrets.clientId,\n clientSecret: secrets.clientSecret,\n },\n };\n }\n\n if (\n typeof secrets.oidcRefreshToken === 'string' &&\n typeof secrets.oidcAccessToken === 'string' &&\n typeof secrets.oidcExpiresAt === 'string'\n ) {\n return {\n url: data.url,\n webId: data.webId,\n authType,\n secrets: {\n oidcRefreshToken: secrets.oidcRefreshToken,\n oidcAccessToken: secrets.oidcAccessToken,\n oidcExpiresAt: secrets.oidcExpiresAt,\n oidcClientId: typeof secrets.oidcClientId === 'string' ? secrets.oidcClientId : undefined,\n },\n };\n }\n\n return null;\n}\n\nexport function clearCredentials(): void {\n const p = getSolidCredentialsPath();\n if (existsSync(p)) unlinkSync(p);\n}\n\n// ============================================================================\n// Helper functions for type-safe access\n// ============================================================================\n\nexport function isClientCredentials(secrets: StoredSecrets): secrets is ClientCredentialsSecrets {\n return 'clientId' in secrets && 'clientSecret' in secrets;\n}\n\nexport function isOidcOAuth(secrets: StoredSecrets): secrets is OidcOAuthSecrets {\n return 'oidcRefreshToken' in secrets;\n}\n\n/**\n * Get client credentials from stored credentials.\n * Returns null if using OAuth instead of client credentials.\n */\nexport function getClientCredentials(creds: StoredCredentials): ClientCredentialsSecrets | null {\n if (isClientCredentials(creds.secrets)) {\n return creds.secrets;\n }\n return null;\n}\n\n/**\n * Get OAuth credentials from stored credentials.\n * Returns null if using client credentials instead of OAuth.\n */\nexport function getOAuthCredentials(creds: StoredCredentials): OidcOAuthSecrets | null {\n if (isOidcOAuth(creds.secrets)) {\n return creds.secrets;\n }\n return null;\n}\n"]}
|
|
@@ -95,6 +95,10 @@
|
|
|
95
95
|
"undefineds:dist/storage/locking/UrlAwareRedisLocker.jsonld",
|
|
96
96
|
"undefineds:dist/provision/ProvisionPodCreator.jsonld",
|
|
97
97
|
"undefineds:dist/provision/ProvisionCodeCodec.jsonld",
|
|
98
|
-
"undefineds:dist/provision/LocalPodProvisioningService.jsonld"
|
|
98
|
+
"undefineds:dist/provision/LocalPodProvisioningService.jsonld",
|
|
99
|
+
"undefineds:dist/api/reconciler/coordination.jsonld",
|
|
100
|
+
"undefineds:dist/api/reconciler/ClientReconcilerCoordinator.jsonld",
|
|
101
|
+
"undefineds:dist/api/reconciler/WakeAgentQueue.jsonld",
|
|
102
|
+
"undefineds:dist/api/reconciler/ServerGroupReconcilerService.jsonld"
|
|
99
103
|
]
|
|
100
104
|
}
|