@undefineds.co/xpod 0.3.48 → 0.3.50

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.
Files changed (128) hide show
  1. package/bin/xpod.js +0 -0
  2. package/dist/api/auth/MultiAuthenticator.js +2 -2
  3. package/dist/api/auth/MultiAuthenticator.js.map +1 -1
  4. package/dist/api/chatkit/pod-store.d.ts +16 -17
  5. package/dist/api/chatkit/pod-store.js +299 -231
  6. package/dist/api/chatkit/pod-store.js.map +1 -1
  7. package/dist/api/chatkit/schema.d.ts +1 -1
  8. package/dist/api/chatkit/service.js +13 -11
  9. package/dist/api/chatkit/service.js.map +1 -1
  10. package/dist/api/chatkit/store.d.ts +1 -0
  11. package/dist/api/chatkit/store.js +23 -11
  12. package/dist/api/chatkit/store.js.map +1 -1
  13. package/dist/api/chatkit/types.d.ts +17 -10
  14. package/dist/api/chatkit/types.js +97 -14
  15. package/dist/api/chatkit/types.js.map +1 -1
  16. package/dist/api/container/common.js +16 -2
  17. package/dist/api/container/common.js.map +1 -1
  18. package/dist/api/container/routes.js +3 -0
  19. package/dist/api/container/routes.js.map +1 -1
  20. package/dist/api/container/types.d.ts +3 -0
  21. package/dist/api/container/types.js.map +1 -1
  22. package/dist/api/handlers/ChatKitV1Handler.js +1 -2
  23. package/dist/api/handlers/ChatKitV1Handler.js.map +1 -1
  24. package/dist/api/handlers/CoordinationHandler.d.ts +6 -0
  25. package/dist/api/handlers/CoordinationHandler.js +115 -0
  26. package/dist/api/handlers/CoordinationHandler.js.map +1 -0
  27. package/dist/api/handlers/MatrixHandler.d.ts +11 -0
  28. package/dist/api/handlers/MatrixHandler.js +144 -2
  29. package/dist/api/handlers/MatrixHandler.js.map +1 -1
  30. package/dist/api/handlers/RunHandler.js +33 -15
  31. package/dist/api/handlers/RunHandler.js.map +1 -1
  32. package/dist/api/handlers/index.d.ts +1 -0
  33. package/dist/api/handlers/index.js +1 -0
  34. package/dist/api/handlers/index.js.map +1 -1
  35. package/dist/api/index.d.ts +1 -0
  36. package/dist/api/index.js +1 -0
  37. package/dist/api/index.js.map +1 -1
  38. package/dist/api/matrix/PodMatrixStore.d.ts +25 -1
  39. package/dist/api/matrix/PodMatrixStore.js +253 -41
  40. package/dist/api/matrix/PodMatrixStore.js.map +1 -1
  41. package/dist/api/matrix/index.d.ts +1 -1
  42. package/dist/api/matrix/index.js.map +1 -1
  43. package/dist/api/matrix/types.d.ts +25 -2
  44. package/dist/api/matrix/types.js.map +1 -1
  45. package/dist/api/middleware/AuthMiddleware.d.ts +1 -0
  46. package/dist/api/middleware/AuthMiddleware.js +13 -1
  47. package/dist/api/middleware/AuthMiddleware.js.map +1 -1
  48. package/dist/api/protocol-metadata.d.ts +4 -0
  49. package/dist/api/protocol-metadata.js +64 -0
  50. package/dist/api/protocol-metadata.js.map +1 -0
  51. package/dist/api/reconciler/ClientReconcilerCoordinator.d.ts +42 -0
  52. package/dist/api/reconciler/ClientReconcilerCoordinator.js +250 -0
  53. package/dist/api/reconciler/ClientReconcilerCoordinator.js.map +1 -0
  54. package/dist/api/reconciler/ClientReconcilerCoordinator.jsonld +186 -0
  55. package/dist/api/reconciler/ServerGroupReconcilerService.d.ts +39 -0
  56. package/dist/api/reconciler/ServerGroupReconcilerService.js +91 -0
  57. package/dist/api/reconciler/ServerGroupReconcilerService.js.map +1 -0
  58. package/dist/api/reconciler/ServerGroupReconcilerService.jsonld +146 -0
  59. package/dist/api/reconciler/WakeAgentQueue.d.ts +23 -0
  60. package/dist/api/reconciler/WakeAgentQueue.js +123 -0
  61. package/dist/api/reconciler/WakeAgentQueue.js.map +1 -0
  62. package/dist/api/reconciler/WakeAgentQueue.jsonld +91 -0
  63. package/dist/api/reconciler/coordination.d.ts +61 -0
  64. package/dist/api/reconciler/coordination.js +109 -0
  65. package/dist/api/reconciler/coordination.js.map +1 -0
  66. package/dist/api/reconciler/coordination.jsonld +186 -0
  67. package/dist/api/reconciler/index.d.ts +4 -0
  68. package/dist/api/reconciler/index.js +21 -0
  69. package/dist/api/reconciler/index.js.map +1 -0
  70. package/dist/api/runs/ManagedRunWorker.js +0 -5
  71. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  72. package/dist/api/runs/RunStateCenter.d.ts +1 -1
  73. package/dist/api/runs/RunStateCenter.js +12 -28
  74. package/dist/api/runs/RunStateCenter.js.map +1 -1
  75. package/dist/api/runs/store.d.ts +12 -15
  76. package/dist/api/runs/store.js +24 -15
  77. package/dist/api/runs/store.js.map +1 -1
  78. package/dist/api/tasks/TaskMaterializer.d.ts +1 -0
  79. package/dist/api/tasks/TaskMaterializer.js +10 -13
  80. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  81. package/dist/api/tasks/TaskService.d.ts +0 -2
  82. package/dist/api/tasks/TaskService.js +6 -16
  83. package/dist/api/tasks/TaskService.js.map +1 -1
  84. package/dist/api/tasks/store.d.ts +0 -2
  85. package/dist/api/tasks/store.js.map +1 -1
  86. package/dist/cli/commands/auth.d.ts +1 -1
  87. package/dist/cli/commands/auth.js +4 -5
  88. package/dist/cli/commands/auth.js.map +1 -1
  89. package/dist/cli/commands/backup.js +1 -1
  90. package/dist/cli/commands/backup.js.map +1 -1
  91. package/dist/cli/commands/login.js +1 -1
  92. package/dist/cli/commands/login.js.map +1 -1
  93. package/dist/cli/commands/pod.js +1 -1
  94. package/dist/cli/commands/pod.js.map +1 -1
  95. package/dist/cli/lib/auth-context.js +10 -7
  96. package/dist/cli/lib/auth-context.js.map +1 -1
  97. package/dist/cli/lib/auth-helper.d.ts +10 -6
  98. package/dist/cli/lib/auth-helper.js +10 -6
  99. package/dist/cli/lib/auth-helper.js.map +1 -1
  100. package/dist/cli/lib/credentials-store.d.ts +22 -4
  101. package/dist/cli/lib/credentials-store.js +68 -51
  102. package/dist/cli/lib/credentials-store.js.map +1 -1
  103. package/dist/cli/lib/oidc-auth.d.ts +4 -0
  104. package/dist/cli/lib/oidc-auth.js +90 -0
  105. package/dist/cli/lib/oidc-auth.js.map +1 -0
  106. package/dist/cli/lib/oidc-session-storage.d.ts +3 -0
  107. package/dist/cli/lib/oidc-session-storage.js +41 -0
  108. package/dist/cli/lib/oidc-session-storage.js.map +1 -0
  109. package/dist/components/components.jsonld +5 -1
  110. package/dist/components/context.jsonld +103 -0
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.js +15 -0
  113. package/dist/index.js.map +1 -1
  114. package/dist/provision/LocalPodProvisioningService.d.ts +1 -0
  115. package/dist/provision/LocalPodProvisioningService.js +9 -0
  116. package/dist/provision/LocalPodProvisioningService.js.map +1 -1
  117. package/dist/provision/LocalPodProvisioningService.jsonld +4 -0
  118. package/dist/runtime/Proxy.d.ts +1 -0
  119. package/dist/runtime/Proxy.js +8 -1
  120. package/dist/runtime/Proxy.js.map +1 -1
  121. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
  122. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -9
  123. package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
  124. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
  125. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -9
  126. package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
  127. package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
  128. package/package.json +5 -4
@@ -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":";;;AACA,2BAA+F;AAC/F,+BAA+C;AAC/C,oDAAwD;AACxD,gEAAiF;AACjF,kDAAmD;AAgBnD,SAAS,UAAU,CAAC,GAAY,EAAE,OAAgB;IAChD,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,uBAAuB,CAAC;IAClF,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAC9B,IAAgB;IAEhB,MAAM,KAAK,GAAG,IAAA,mCAAe,GAAE,CAAC;IAEhC,+BAA+B;IAC/B,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,WAAW,GAAG,IAAA,wCAAoB,EAAC,KAAK,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAc,EAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAClG,IAAI,WAAW,EAAE,CAAC;gBAChB,4BAA4B;gBAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC/D,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;gBACrD,OAAO,EAAE,UAAU,EAAE,UAAU,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAC;QAC7G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,MAAM,IAAA,yBAAW,EAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAK,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kCAAkC;IAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE;QAC7C,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,aAAa,EAAE,qBAAqB,KAAK,EAAE;SAC5C;KACF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsC,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,qBAAqB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAc,EAAE,YAAoB;IAC9D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAC;IAC3B,IAAI,KAA6B,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;YACxF,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACzG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,UAAU,GAAG,KAAK,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAQD,KAAK,UAAU,aAAa,CAC1B,GAAW,EACX,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE;SACvC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAAC;QAClF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,YAAoB,EACpB,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACpC,OAAO,EAAE;gBACP,MAAM,EAAE,aAAa;gBACrB,aAAa,EAAE,UAAU;aAC1B;SACF,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,YAAoB,EACpB,UAAkB,EAClB,MAAc,EACd,SAAiB,EACjB,KAA2C;IAE3C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAE3D,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE7E,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC9C,IAAA,cAAS,EAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,MAAM,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBAC/C,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,IAAA,kBAAa,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvC,KAAK,CAAC,SAAS,EAAE,CAAC;gBAClB,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,YAAY,MAAM,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACzH,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAA,kBAAa,EAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;IACzC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAe,EACf,MAAc,EACd,UAAkB,EAClB,QAAgB,EAChB,KAA2C;IAE3C,MAAM,OAAO,GAAG,IAAA,gBAAW,EAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,IAAA,eAAQ,EAAC,QAAQ,EAAE,IAAA,WAAI,EAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,YAAY,GAAG,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,YAAY,EAAE;oBACxB,MAAM,EAAE,KAAK;oBACb,OAAO,EAAE;wBACP,cAAc,EAAE,aAAa;wBAC7B,aAAa,EAAE,UAAU;qBAC1B;oBACD,IAAI,EAAE,EAAE;iBACT,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;YACD,MAAM,cAAc,CAAC,IAAA,WAAI,EAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAA,eAAQ,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,GAAG,MAAM,GAAG,YAAY,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,QAAQ,CAAC,CAAC;YAEpC,IAAI,WAAW,GAAG,0BAA0B,CAAC;YAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,aAAa,CAAC;iBACxD,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,WAAW,GAAG,qBAAqB,CAAC;iBACxG,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,aAAa,CAAC;iBAC7D,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,WAAW,GAAG,WAAW,CAAC;iBAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,YAAY,CAAC;iBAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,WAAW,CAAC;iBAC3D,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,WAAW,GAAG,YAAY,CAAC;YAEjG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,cAAc,EAAE,WAAW;oBAC3B,aAAa,EAAE,UAAU;iBAC1B;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,KAAK,CAAC,SAAS,EAAE,CAAC;gBAClB,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,eAAe,WAAW,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAA4C;IAC7D,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,mCAAmC;IAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;SAClG,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;SACxG,MAAM,CAAC,KAAK,EAAE;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;KAC/B,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,uBAAuB;KACrC,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAExC,IAAA,cAAS,EAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAEzC,MAAM,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEnE,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,SAAS,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxG,CAAC;CACF,CAAC;AAsCO,sCAAa;AApCtB,MAAM,cAAc,GAA4C;IAC9D,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,6CAA6C;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;SAClG,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;SACxG,MAAM,CAAC,KAAK,EAAE;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,iBAAiB;KAC/B,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,sBAAsB;KACpC,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAA,aAAQ,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE7D,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACzC,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAExE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,SAAS,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzG,CAAC;CACF,CAAC;AAEsB,wCAAc","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.getConfigPath)().replace('/config.json', '/')}`);
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":"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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, getConfigPath } 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 ${getConfigPath().replace('/config.json', '/')}`);\n } else {\n console.log('Credentials created.');\n }\n console.log(` client_id: ${credential.id}`);\n console.log(` webId: ${webId}`);\n },\n};\n"]}
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"]}
@@ -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 ~/.xpod/credentials.json.
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"]}
@@ -7,6 +7,7 @@ exports.requireAuthContext = requireAuthContext;
7
7
  exports.authFetch = authFetch;
8
8
  const solid_auth_1 = require("./solid-auth");
9
9
  const credentials_store_1 = require("./credentials-store");
10
+ const oidc_auth_1 = require("./oidc-auth");
10
11
  const output_1 = require("./output");
11
12
  function normalizeBaseUrl(url) {
12
13
  return url.endsWith('/') ? url : `${url}/`;
@@ -45,13 +46,15 @@ async function requireAuthContext(options = {}) {
45
46
  if (!credentials) {
46
47
  throw new output_1.CliCommandError('auth_required', 'No credentials found. Run `xpod auth login` first.', 2);
47
48
  }
48
- const clientCredentials = (0, credentials_store_1.getClientCredentials)(credentials);
49
- if (!clientCredentials) {
50
- throw new output_1.CliCommandError('auth_unsupported', 'Stored OAuth credentials are not supported for CLI resource operations yet. Run `xpod auth login` to create client credentials.', 2);
51
- }
52
49
  const baseUrl = normalizeBaseUrl(options.url ?? credentials.url);
53
- const tokenResult = await (0, solid_auth_1.getAccessToken)(clientCredentials.clientId, clientCredentials.clientSecret, baseUrl);
54
- if (!tokenResult) {
50
+ const clientCredentials = (0, credentials_store_1.getClientCredentials)(credentials);
51
+ const oauthCredentials = (0, credentials_store_1.getOAuthCredentials)(credentials);
52
+ const accessToken = clientCredentials
53
+ ? (await (0, solid_auth_1.getAccessToken)(clientCredentials.clientId, clientCredentials.clientSecret, baseUrl))?.accessToken
54
+ : oauthCredentials
55
+ ? await (0, oidc_auth_1.getOidcAccessToken)(credentials)
56
+ : null;
57
+ if (!accessToken) {
55
58
  throw new output_1.CliCommandError('auth_failed', 'Failed to obtain an access token. Run `xpod auth login` again.', 2);
56
59
  }
57
60
  const podRoot = resolvePodRootFromWebId(credentials.webId);
@@ -60,7 +63,7 @@ async function requireAuthContext(options = {}) {
60
63
  webId: credentials.webId,
61
64
  podRoot,
62
65
  baseIri: podRoot,
63
- accessToken: tokenResult.accessToken,
66
+ accessToken,
64
67
  credentials,
65
68
  };
66
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auth-context.js","sourceRoot":"","sources":["../../../src/cli/lib/auth-context.ts"],"names":[],"mappings":";;AAyBA,4CAEC;AAED,0DAcC;AAED,kDAeC;AAED,gDA6CC;AAED,8BAMC;AAnHD,6CAAkE;AAClE,2DAI6B;AAC7B,qCAA2C;AAmB3C,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC;AAC7C,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAAa;IACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC/B,MAAM,aAAa,GAAG,eAAe,CAAC;IACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;IAChF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC/B,CAAC;AAED,SAAgB,mBAAmB,CAAC,WAAoB;IACtD,MAAM,WAAW,GAAG,IAAA,mCAAe,GAAE,CAAC;IACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,OAAO;QACP,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,OAAO;KACR,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,UAGrC,EAAE;IACJ,MAAM,WAAW,GAAG,IAAA,mCAAe,GAAE,CAAC;IACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,wBAAe,CACvB,eAAe,EACf,oDAAoD,EACpD,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAA,wCAAoB,EAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,wBAAe,CACvB,kBAAkB,EAClB,iIAAiI,EACjI,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAc,EACtC,iBAAiB,CAAC,QAAQ,EAC1B,iBAAiB,CAAC,YAAY,EAC9B,OAAO,CACR,CAAC;IACF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,wBAAe,CACvB,aAAa,EACb,gEAAgE,EAChE,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO;QACL,OAAO;QACP,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,OAAO;QACP,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,WAAW;KACZ,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,SAAS,CAC7B,OAAuB,EACvB,GAAW,EACX,IAAkB;IAElB,OAAO,IAAA,+BAAkB,EAAC,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import { getAccessToken, authenticatedFetch } from './solid-auth';\nimport {\n getClientCredentials,\n loadCredentials,\n type StoredCredentials,\n} from './credentials-store';\nimport { CliCommandError } from './output';\n\nexport interface CliAuthContext {\n baseUrl: string;\n webId: string;\n podRoot: string;\n baseIri: string;\n accessToken: string;\n credentials: StoredCredentials;\n}\n\nexport interface AuthStatus {\n authenticated: boolean;\n authType?: string;\n baseUrl?: string;\n webId?: string;\n podRoot?: string;\n}\n\nexport function normalizeBaseUrl(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nexport function resolvePodRootFromWebId(webId: string): string {\n const webIdUrl = new URL(webId);\n const path = webIdUrl.pathname;\n const profileSuffix = '/profile/card';\n if (path.endsWith(profileSuffix)) {\n const podPath = path.slice(0, -profileSuffix.length);\n return `${webIdUrl.origin}${podPath.endsWith('/') ? podPath : `${podPath}/`}`;\n }\n\n const pathParts = path.split('/').filter(Boolean);\n if (pathParts.length > 0) {\n return `${webIdUrl.origin}/${pathParts[0]}/`;\n }\n return `${webIdUrl.origin}/`;\n}\n\nexport function getStoredAuthStatus(urlOverride?: string): AuthStatus {\n const credentials = loadCredentials();\n if (!credentials) {\n return { authenticated: false };\n }\n\n const baseUrl = normalizeBaseUrl(urlOverride ?? credentials.url);\n const podRoot = resolvePodRootFromWebId(credentials.webId);\n return {\n authenticated: true,\n authType: credentials.authType,\n baseUrl,\n webId: credentials.webId,\n podRoot,\n };\n}\n\nexport async function requireAuthContext(options: {\n url?: string;\n json?: boolean;\n} = {}): Promise<CliAuthContext> {\n const credentials = loadCredentials();\n if (!credentials) {\n throw new CliCommandError(\n 'auth_required',\n 'No credentials found. Run `xpod auth login` first.',\n 2,\n );\n }\n\n const clientCredentials = getClientCredentials(credentials);\n if (!clientCredentials) {\n throw new CliCommandError(\n 'auth_unsupported',\n 'Stored OAuth credentials are not supported for CLI resource operations yet. Run `xpod auth login` to create client credentials.',\n 2,\n );\n }\n\n const baseUrl = normalizeBaseUrl(options.url ?? credentials.url);\n const tokenResult = await getAccessToken(\n clientCredentials.clientId,\n clientCredentials.clientSecret,\n baseUrl,\n );\n if (!tokenResult) {\n throw new CliCommandError(\n 'auth_failed',\n 'Failed to obtain an access token. Run `xpod auth login` again.',\n 2,\n );\n }\n\n const podRoot = resolvePodRootFromWebId(credentials.webId);\n return {\n baseUrl,\n webId: credentials.webId,\n podRoot,\n baseIri: podRoot,\n accessToken: tokenResult.accessToken,\n credentials,\n };\n}\n\nexport async function authFetch(\n context: CliAuthContext,\n url: string,\n init?: RequestInit,\n): Promise<Response> {\n return authenticatedFetch(url, context.accessToken, init);\n}\n"]}
1
+ {"version":3,"file":"auth-context.js","sourceRoot":"","sources":["../../../src/cli/lib/auth-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAccessToken, authenticatedFetch } from './solid-auth';\nimport {\n getClientCredentials,\n getOAuthCredentials,\n loadCredentials,\n type StoredCredentials,\n} from './credentials-store';\nimport { getOidcAccessToken } from './oidc-auth';\nimport { CliCommandError } from './output';\n\nexport interface CliAuthContext {\n baseUrl: string;\n webId: string;\n podRoot: string;\n baseIri: string;\n accessToken: string;\n credentials: StoredCredentials;\n}\n\nexport interface AuthStatus {\n authenticated: boolean;\n authType?: string;\n baseUrl?: string;\n webId?: string;\n podRoot?: string;\n}\n\nexport function normalizeBaseUrl(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nexport function resolvePodRootFromWebId(webId: string): string {\n const webIdUrl = new URL(webId);\n const path = webIdUrl.pathname;\n const profileSuffix = '/profile/card';\n if (path.endsWith(profileSuffix)) {\n const podPath = path.slice(0, -profileSuffix.length);\n return `${webIdUrl.origin}${podPath.endsWith('/') ? podPath : `${podPath}/`}`;\n }\n\n const pathParts = path.split('/').filter(Boolean);\n if (pathParts.length > 0) {\n return `${webIdUrl.origin}/${pathParts[0]}/`;\n }\n return `${webIdUrl.origin}/`;\n}\n\nexport function getStoredAuthStatus(urlOverride?: string): AuthStatus {\n const credentials = loadCredentials();\n if (!credentials) {\n return { authenticated: false };\n }\n\n const baseUrl = normalizeBaseUrl(urlOverride ?? credentials.url);\n const podRoot = resolvePodRootFromWebId(credentials.webId);\n return {\n authenticated: true,\n authType: credentials.authType,\n baseUrl,\n webId: credentials.webId,\n podRoot,\n };\n}\n\nexport async function requireAuthContext(options: {\n url?: string;\n json?: boolean;\n} = {}): Promise<CliAuthContext> {\n const credentials = loadCredentials();\n if (!credentials) {\n throw new CliCommandError(\n 'auth_required',\n 'No credentials found. Run `xpod auth login` first.',\n 2,\n );\n }\n\n const baseUrl = normalizeBaseUrl(options.url ?? credentials.url);\n const clientCredentials = getClientCredentials(credentials);\n const oauthCredentials = getOAuthCredentials(credentials);\n const accessToken = clientCredentials\n ? (await getAccessToken(\n clientCredentials.clientId,\n clientCredentials.clientSecret,\n baseUrl,\n ))?.accessToken\n : oauthCredentials\n ? await getOidcAccessToken(credentials)\n : null;\n\n if (!accessToken) {\n throw new CliCommandError(\n 'auth_failed',\n 'Failed to obtain an access token. Run `xpod auth login` again.',\n 2,\n );\n }\n\n const podRoot = resolvePodRootFromWebId(credentials.webId);\n return {\n baseUrl,\n webId: credentials.webId,\n podRoot,\n baseIri: podRoot,\n accessToken,\n credentials,\n };\n}\n\nexport async function authFetch(\n context: CliAuthContext,\n url: string,\n init?: RequestInit,\n): Promise<Response> {\n return authenticatedFetch(url, context.accessToken, init);\n}\n"]}
@@ -1,15 +1,19 @@
1
1
  /**
2
- * CLI Authentication Helper
2
+ * Legacy client-credentials authentication helper.
3
3
  *
4
- * 统一的认证入口,优先使用保存的 client credentials。
4
+ * Descriptor/resource/rdf/secret CLI commands use `auth-context.ts`, which
5
+ * supports both shared Solid OAuth sessions and client credentials. Keep this
6
+ * helper only for legacy callers that explicitly need a Solid Node Session from
7
+ * client credentials.
5
8
  */
6
9
  import { type PodAuth } from './solid-auth';
7
10
  /**
8
- * 获取认证信息
11
+ * 获取 client-credentials 认证信息。
9
12
  *
10
- * 优先级:
11
- * 1. 使用保存的 client credentials (~/.xpod/secrets.json)
12
- * 2. 如果没有,提示用户先运行 `xpod auth create-credentials`
13
+ * 规则:
14
+ * 1. 只读取 shared Solid auth source:$SOLID_HOME/auth/credentials.json
15
+ * 2. OAuth credentials intentionally return null here; use auth-context for
16
+ * resource operations.
13
17
  *
14
18
  * @returns PodAuth 或 null(如果没有保存的 credentials)
15
19
  */
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  /**
3
- * CLI Authentication Helper
3
+ * Legacy client-credentials authentication helper.
4
4
  *
5
- * 统一的认证入口,优先使用保存的 client credentials。
5
+ * Descriptor/resource/rdf/secret CLI commands use `auth-context.ts`, which
6
+ * supports both shared Solid OAuth sessions and client credentials. Keep this
7
+ * helper only for legacy callers that explicitly need a Solid Node Session from
8
+ * client credentials.
6
9
  */
7
10
  Object.defineProperty(exports, "__esModule", { value: true });
8
11
  exports.getAuth = getAuth;
@@ -10,11 +13,12 @@ exports.requireAuth = requireAuth;
10
13
  const solid_auth_1 = require("./solid-auth");
11
14
  const credentials_store_1 = require("./credentials-store");
12
15
  /**
13
- * 获取认证信息
16
+ * 获取 client-credentials 认证信息。
14
17
  *
15
- * 优先级:
16
- * 1. 使用保存的 client credentials (~/.xpod/secrets.json)
17
- * 2. 如果没有,提示用户先运行 `xpod auth create-credentials`
18
+ * 规则:
19
+ * 1. 只读取 shared Solid auth source:$SOLID_HOME/auth/credentials.json
20
+ * 2. OAuth credentials intentionally return null here; use auth-context for
21
+ * resource operations.
18
22
  *
19
23
  * @returns PodAuth 或 null(如果没有保存的 credentials)
20
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"auth-helper.js","sourceRoot":"","sources":["../../../src/cli/lib/auth-helper.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;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 * 统一的认证入口,优先使用保存的 client credentials。\n */\n\nimport { authenticate, type PodAuth } from './solid-auth';\nimport { loadCredentials, isClientCredentials } from './credentials-store';\n\n/**\n * 获取认证信息\n *\n * 优先级:\n * 1. 使用保存的 client credentials (~/.xpod/secrets.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"]}
1
+ {"version":3,"file":"auth-helper.js","sourceRoot":"","sources":["../../../src/cli/lib/auth-helper.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAeH,0BA8BC;AAOD,kCAUC;AA5DD,6CAA0D;AAC1D,2DAA2E;AAE3E;;;;;;;;;GASG;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 * Legacy client-credentials authentication helper.\n *\n * Descriptor/resource/rdf/secret CLI commands use `auth-context.ts`, which\n * supports both shared Solid OAuth sessions and client credentials. Keep this\n * helper only for legacy callers that explicitly need a Solid Node Session from\n * client credentials.\n */\n\nimport { authenticate, type PodAuth } from './solid-auth';\nimport { loadCredentials, isClientCredentials } from './credentials-store';\n\n/**\n * 获取 client-credentials 认证信息。\n *\n * 规则:\n * 1. 只读取 shared Solid auth source:$SOLID_HOME/auth/credentials.json\n * 2. OAuth credentials intentionally return null here; use auth-context for\n * resource operations.\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 getConfigPath(): string;
21
- export declare function getSecretsPath(): string;
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
- export declare function loadConfig(): StoredConfig | null;
24
- export declare function loadSecrets(): StoredSecrets | null;
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.getConfigPath = getConfigPath;
4
- exports.getSecretsPath = getSecretsPath;
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
- * CLI credential storage split into two files:
14
+ * Shared credential storage for all Solid tools (xpod, LinX, etc.).
16
15
  *
17
- * ~/.xpod/config.json base config (url, webId), chmod 644
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 xpodDir() {
24
- return (0, path_1.join)((0, os_1.homedir)(), '.xpod');
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 getConfigPath() {
27
- return (0, path_1.join)(xpodDir(), 'config.json');
25
+ function getSolidAuthDir() {
26
+ return (0, path_1.join)(getSolidHomeDir(), 'auth');
28
27
  }
29
- function getSecretsPath() {
30
- return (0, path_1.join)(xpodDir(), 'secrets.json');
28
+ function getSolidCredentialsPath() {
29
+ return (0, path_1.join)(getSolidAuthDir(), 'credentials.json');
31
30
  }
32
31
  function saveCredentials(creds) {
33
- const dir = xpodDir();
32
+ const dir = getSolidAuthDir();
34
33
  (0, fs_1.mkdirSync)(dir, { recursive: true });
35
- const configPath = getConfigPath();
36
- (0, fs_1.writeFileSync)(configPath, JSON.stringify({ url: creds.url, webId: creds.webId, authType: creds.authType }, null, 2) + '\n', 'utf-8');
37
- (0, fs_1.chmodSync)(configPath, 0o644);
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
- function loadConfig() {
51
- const data = readJson(getConfigPath());
52
- if (data && typeof data.url === 'string' && typeof data.webId === 'string') {
53
- const authType = data.authType || 'client_credentials';
54
- return { url: data.url, webId: data.webId, authType };
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
- return null;
57
- }
58
- function loadSecrets() {
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
- // Try OIDC OAuth format
67
- if (typeof data.oidcRefreshToken === 'string' &&
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
- oidcRefreshToken: data.oidcRefreshToken,
72
- oidcAccessToken: data.oidcAccessToken,
73
- oidcExpiresAt: data.oidcExpiresAt,
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
- for (const p of [getConfigPath(), getSecretsPath()]) {
87
- if ((0, fs_1.existsSync)(p))
88
- (0, fs_1.unlinkSync)(p);
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