@undefineds.co/xpod 0.3.69 → 0.3.71-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/config/cloud.json +3 -28
  2. package/config/local.json +3 -0
  3. package/config/resolver.json +7 -0
  4. package/config/xpod.base.json +20 -0
  5. package/dist/agents/ClaudeExecutor.js +1 -1
  6. package/dist/agents/ClaudeExecutor.js.map +1 -1
  7. package/dist/agents/types.d.ts +5 -5
  8. package/dist/agents/types.js.map +1 -1
  9. package/dist/api/ai-gateway/AiGatewayService.d.ts +5 -16
  10. package/dist/api/ai-gateway/AiGatewayService.js +13 -35
  11. package/dist/api/ai-gateway/AiGatewayService.js.map +1 -1
  12. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.d.ts +3 -2
  13. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js +37 -12
  14. package/dist/api/ai-gateway/auth/AiConnectionInvocationKeyIssuer.js.map +1 -1
  15. package/dist/api/ai-gateway/auth/GatewayPrincipal.d.ts +2 -16
  16. package/dist/api/ai-gateway/auth/GatewayPrincipal.js +3 -33
  17. package/dist/api/ai-gateway/auth/GatewayPrincipal.js.map +1 -1
  18. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.d.ts +23 -0
  19. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js +81 -0
  20. package/dist/api/ai-gateway/auth/InvocationTokenAuthenticator.js.map +1 -0
  21. package/dist/api/ai-gateway/auth/InvocationTokenCodec.d.ts +7 -4
  22. package/dist/api/ai-gateway/auth/InvocationTokenCodec.js.map +1 -1
  23. package/dist/api/ai-gateway/connect/index.d.ts +7 -26
  24. package/dist/api/ai-gateway/connect/index.js +40 -67
  25. package/dist/api/ai-gateway/connect/index.js.map +1 -1
  26. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.d.ts +17 -0
  27. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js +65 -0
  28. package/dist/api/ai-gateway/credentials/PlaintextCredentialPayload.js.map +1 -0
  29. package/dist/api/ai-gateway/pod/HostedPodDataAccess.d.ts +24 -0
  30. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js +149 -0
  31. package/dist/api/ai-gateway/pod/HostedPodDataAccess.js.map +1 -0
  32. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.d.ts +13 -5
  33. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js +16 -19
  34. package/dist/api/ai-gateway/quota/ProviderQuotaAdapter.js.map +1 -1
  35. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.d.ts +1 -1
  36. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js +0 -2
  37. package/dist/api/ai-gateway/service-access/AiConnectionServiceAccess.js.map +1 -1
  38. package/dist/api/auth/AuthContext.d.ts +1 -12
  39. package/dist/api/auth/AuthContext.js +0 -11
  40. package/dist/api/auth/AuthContext.js.map +1 -1
  41. package/dist/api/auth/ClientCredentialsAuthenticator.js +4 -11
  42. package/dist/api/auth/ClientCredentialsAuthenticator.js.map +1 -1
  43. package/dist/api/chatkit/default-agent.d.ts +2 -2
  44. package/dist/api/chatkit/default-agent.js +4 -4
  45. package/dist/api/chatkit/default-agent.js.map +1 -1
  46. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  47. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  48. package/dist/api/container/common.js +28 -69
  49. package/dist/api/container/common.js.map +1 -1
  50. package/dist/api/container/index.js +5 -6
  51. package/dist/api/container/index.js.map +1 -1
  52. package/dist/api/container/routes.js +2 -5
  53. package/dist/api/container/routes.js.map +1 -1
  54. package/dist/api/container/types.d.ts +8 -10
  55. package/dist/api/container/types.js.map +1 -1
  56. package/dist/api/handlers/AiClientConfigurationHandler.js +3 -3
  57. package/dist/api/handlers/AiClientConfigurationHandler.js.map +1 -1
  58. package/dist/api/handlers/AiGatewayHandler.js +2 -2
  59. package/dist/api/handlers/AiGatewayHandler.js.map +1 -1
  60. package/dist/api/handlers/AiGatewayManagementHandler.d.ts +2 -10
  61. package/dist/api/handlers/AiGatewayManagementHandler.js +4 -154
  62. package/dist/api/handlers/AiGatewayManagementHandler.js.map +1 -1
  63. package/dist/api/handlers/NetworkSettingsHandler.js +0 -3
  64. package/dist/api/handlers/NetworkSettingsHandler.js.map +1 -1
  65. package/dist/api/handlers/PodSettingsHandler.d.ts +5 -2
  66. package/dist/api/handlers/PodSettingsHandler.js +3 -3
  67. package/dist/api/handlers/PodSettingsHandler.js.map +1 -1
  68. package/dist/api/runs/AgentRuntimeTypes.d.ts +3 -3
  69. package/dist/api/runs/AgentRuntimeTypes.js +10 -10
  70. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  71. package/dist/api/runs/InngestRunExecutionBackend.d.ts +15 -9
  72. package/dist/api/runs/InngestRunExecutionBackend.js +25 -10
  73. package/dist/api/runs/InngestRunExecutionBackend.js.map +1 -1
  74. package/dist/api/runs/PiAgentRuntimeDriver.js +2 -2
  75. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  76. package/dist/api/runs/RunStateCenter.js +1 -1
  77. package/dist/api/runs/RunStateCenter.js.map +1 -1
  78. package/dist/api/service/AiClientConfigurationService.d.ts +2 -2
  79. package/dist/api/service/AiClientConfigurationService.js +11 -11
  80. package/dist/api/service/AiClientConfigurationService.js.map +1 -1
  81. package/dist/api/tasks/InngestTaskScheduler.d.ts +16 -10
  82. package/dist/api/tasks/InngestTaskScheduler.js +24 -12
  83. package/dist/api/tasks/InngestTaskScheduler.js.map +1 -1
  84. package/dist/cli/commands/start.js +7 -7
  85. package/dist/cli/commands/start.js.map +1 -1
  86. package/dist/components/components.jsonld +1 -0
  87. package/dist/components/context.jsonld +42 -0
  88. package/dist/http/InternalPodDataHttpHandler.d.ts +32 -0
  89. package/dist/http/InternalPodDataHttpHandler.js +258 -0
  90. package/dist/http/InternalPodDataHttpHandler.js.map +1 -0
  91. package/dist/http/InternalPodDataHttpHandler.jsonld +201 -0
  92. package/dist/index.d.ts +2 -1
  93. package/dist/index.js +4 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/main.js +13 -13
  96. package/dist/main.js.map +1 -1
  97. package/dist/runtime/GatewayAdminProxyAuth.d.ts +15 -1
  98. package/dist/runtime/GatewayAdminProxyAuth.js +57 -2
  99. package/dist/runtime/GatewayAdminProxyAuth.js.map +1 -1
  100. package/dist/runtime/bootstrap.js +3 -0
  101. package/dist/runtime/bootstrap.js.map +1 -1
  102. package/dist/runtime/css-process.d.ts +1 -1
  103. package/dist/runtime/css-process.js +4 -1
  104. package/dist/runtime/css-process.js.map +1 -1
  105. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.d.ts +2 -0
  106. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js +50 -0
  107. package/dist/runtime/runner/node/CommunitySolidServerCssRunner.js.map +1 -1
  108. package/dist/storage/rdf/PostgresRdfEngine.js +2 -0
  109. package/dist/storage/rdf/PostgresRdfEngine.js.map +1 -1
  110. package/dist/storage/rdf/PostgresRdfVectorIndex.d.ts +1 -0
  111. package/dist/storage/rdf/PostgresRdfVectorIndex.js +1 -1
  112. package/dist/storage/rdf/PostgresRdfVectorIndex.js.map +1 -1
  113. package/dist/storage/rdf/PostgresRdfVectorIndex.jsonld +29 -0
  114. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.d.ts +5 -5
  115. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.js +7 -7
  116. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMain.js +1 -1
  117. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.d.ts +3 -1
  118. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.js +74 -60
  119. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.d.ts +0 -21
  120. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.js +0 -41
  121. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.d.ts +1 -0
  122. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.js +7 -2
  123. package/node_modules/@undefineds.co/ai-connection/dist/client-config/codex.js +3 -3
  124. package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.cjs +15 -9
  125. package/node_modules/@undefineds.co/ai-connection/dist/client-config/json-env-adapter.js +4 -4
  126. package/node_modules/@undefineds.co/ai-connection/dist/client-config/pi.js +3 -3
  127. package/node_modules/@undefineds.co/ai-connection/dist/client-config/types.d.ts +1 -1
  128. package/node_modules/@undefineds.co/ai-connection/dist/controller.d.ts +2 -1
  129. package/node_modules/@undefineds.co/ai-connection/dist/controller.js +1 -0
  130. package/node_modules/@undefineds.co/ai-connection/dist/service-access.js +0 -1
  131. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +22 -1
  132. package/package.json +3 -3
  133. package/static/app/assets/main.js +7 -7
  134. package/static/dashboard/assets/NetworkPage-CXjiUMR1.js +2 -0
  135. package/static/dashboard/assets/{PaneListHeader-57nvMwH6.js → PaneListHeader-BSipfl0W.js} +1 -1
  136. package/static/dashboard/assets/PodPage-Bd3Xhmp-.js +2 -0
  137. package/static/dashboard/assets/ServicesPage-CI3jWZGe.js +1 -0
  138. package/static/dashboard/assets/{card-B9Zjf_2p.js → card-z5BV5hTo.js} +1 -1
  139. package/static/dashboard/assets/{dashboard-8C6o666W.js → dashboard-CSrqAv2L.js} +2 -2
  140. package/static/dashboard/assets/{database-DPh9wDY9.js → database-Ct5ZPe6L.js} +1 -1
  141. package/static/dashboard/assets/{external-link-VbMQvVMz.js → external-link-B7wD1hkm.js} +1 -1
  142. package/static/dashboard/assets/index-tOBaUnM1.js +44 -0
  143. package/static/dashboard/assets/{refresh-cw-BxVxNxNr.js → refresh-cw-CFDZPaE8.js} +1 -1
  144. package/static/dashboard/assets/{services-status-context-DKmJ7ISr.js → services-status-context-DN1Icg4A.js} +1 -1
  145. package/static/dashboard/dashboard.html +1 -1
  146. package/static/settings/assets/ModelsPage-D87RrLB0.js +1 -0
  147. package/static/settings/assets/{PaneListHeader-Bgaze006.js → PaneListHeader-BtON8Z5Q.js} +1 -1
  148. package/static/settings/assets/PodPage-9LGuOloQ.js +2 -0
  149. package/static/settings/assets/ServicesPage-ZoT9-B_0.js +1 -0
  150. package/static/settings/assets/SettingsPage-Bj4lB3mq.js +41 -0
  151. package/static/settings/assets/{card-B_bXSIn-.js → card-CCGngjas.js} +1 -1
  152. package/static/settings/assets/{services-status-context-DiX-AbrP.js → services-status-context-CBfImxL_.js} +1 -1
  153. package/static/settings/assets/{settings-B30oMfZq.js → settings-yUyFIJxi.js} +2 -2
  154. package/static/settings/assets/{workspace-layout-Dv1Yn9Ci.js → workspace-layout-B0wJpPze.js} +1 -1
  155. package/static/settings/settings.html +1 -1
  156. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.d.ts +0 -25
  157. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js +0 -91
  158. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js.map +0 -1
  159. package/dist/api/ai-gateway/auth/GatewayApiKey.d.ts +0 -28
  160. package/dist/api/ai-gateway/auth/GatewayApiKey.js +0 -162
  161. package/dist/api/ai-gateway/auth/GatewayApiKey.js.map +0 -1
  162. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +0 -56
  163. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +0 -143
  164. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js.map +0 -1
  165. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.d.ts +0 -26
  166. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js +0 -97
  167. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js.map +0 -1
  168. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +0 -54
  169. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +0 -152
  170. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js.map +0 -1
  171. package/static/dashboard/assets/NetworkPage-Brt79fuQ.js +0 -2
  172. package/static/dashboard/assets/PodPage-CM6do1vB.js +0 -2
  173. package/static/dashboard/assets/ServicesPage-BUNxGJRz.js +0 -1
  174. package/static/dashboard/assets/index-RfiFckzb.js +0 -51
  175. package/static/settings/assets/ModelsPage-D_IH7AH3.js +0 -1
  176. package/static/settings/assets/PodPage-Cy1VNObw.js +0 -2
  177. package/static/settings/assets/ServicesPage-BsFaxVWC.js +0 -1
  178. package/static/settings/assets/SettingsPage-UafNWE_p.js +0 -48
@@ -2,7 +2,9 @@ import type { IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http';
2
2
  export declare const GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = "x-xpod-admin-proxy-loopback";
3
3
  export declare const GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = "x-xpod-admin-proxy-timestamp";
4
4
  export declare const GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = "x-xpod-admin-proxy-signature";
5
- export declare const GATEWAY_ADMIN_PROXY_HEADERS: readonly ["x-xpod-admin-proxy-loopback", "x-xpod-admin-proxy-timestamp", "x-xpod-admin-proxy-signature"];
5
+ export declare const GATEWAY_ADMIN_PROXY_INTENT_HEADER = "x-xpod-admin-proxy-intent";
6
+ export declare const GATEWAY_ADMIN_PROXY_NONCE_HEADER = "x-xpod-admin-proxy-nonce";
7
+ export declare const GATEWAY_ADMIN_PROXY_HEADERS: readonly ["x-xpod-admin-proxy-loopback", "x-xpod-admin-proxy-timestamp", "x-xpod-admin-proxy-signature", "x-xpod-admin-proxy-intent", "x-xpod-admin-proxy-nonce"];
6
8
  export declare function createGatewayAdminProxyAuthSecret(): string;
7
9
  export interface GatewayAdminProxyMarkerInput {
8
10
  secret: string;
@@ -10,13 +12,24 @@ export interface GatewayAdminProxyMarkerInput {
10
12
  url: string | undefined;
11
13
  originalClientLoopback: boolean;
12
14
  issuedAt?: number;
15
+ nonce?: string;
16
+ intent?: GatewayAdminProxyIntent;
13
17
  }
14
18
  export interface GatewayAdminProxyMarkerVerification {
15
19
  present: boolean;
16
20
  valid: boolean;
17
21
  originalClientLoopback: boolean;
22
+ nonce?: string;
23
+ intent?: GatewayAdminProxyIntent;
18
24
  reason?: string;
19
25
  }
26
+ export interface GatewayAdminProxyIntent {
27
+ ownerWebId: string;
28
+ method: 'GET' | 'PUT' | 'PATCH' | 'DELETE';
29
+ resourceUrl: string;
30
+ principalKind: 'solid-user';
31
+ scopes: string[];
32
+ }
20
33
  export declare function createGatewayAdminProxyHeaders(input: GatewayAdminProxyMarkerInput): OutgoingHttpHeaders;
21
34
  export declare function stripGatewayAdminProxyHeaders(headers: IncomingHttpHeaders): void;
22
35
  export declare function isLoopbackRemoteAddress(remoteAddress: string | undefined): boolean;
@@ -27,3 +40,4 @@ export declare function verifyGatewayAdminProxyHeaders(input: {
27
40
  url: string | undefined;
28
41
  now?: number;
29
42
  }): GatewayAdminProxyMarkerVerification;
43
+ export declare function canonicalGatewayAdminProxyIntent(intent: GatewayAdminProxyIntent): string;
@@ -1,20 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GATEWAY_ADMIN_PROXY_HEADERS = exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = void 0;
3
+ exports.GATEWAY_ADMIN_PROXY_HEADERS = exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER = exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER = exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = void 0;
4
4
  exports.createGatewayAdminProxyAuthSecret = createGatewayAdminProxyAuthSecret;
5
5
  exports.createGatewayAdminProxyHeaders = createGatewayAdminProxyHeaders;
6
6
  exports.stripGatewayAdminProxyHeaders = stripGatewayAdminProxyHeaders;
7
7
  exports.isLoopbackRemoteAddress = isLoopbackRemoteAddress;
8
8
  exports.verifyGatewayAdminProxyHeaders = verifyGatewayAdminProxyHeaders;
9
+ exports.canonicalGatewayAdminProxyIntent = canonicalGatewayAdminProxyIntent;
9
10
  const node_crypto_1 = require("node:crypto");
10
11
  const node_net_1 = require("node:net");
11
12
  exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = 'x-xpod-admin-proxy-loopback';
12
13
  exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = 'x-xpod-admin-proxy-timestamp';
13
14
  exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = 'x-xpod-admin-proxy-signature';
15
+ exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER = 'x-xpod-admin-proxy-intent';
16
+ exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER = 'x-xpod-admin-proxy-nonce';
14
17
  exports.GATEWAY_ADMIN_PROXY_HEADERS = [
15
18
  exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER,
16
19
  exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER,
17
20
  exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER,
21
+ exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER,
22
+ exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER,
18
23
  ];
19
24
  const MAX_CLOCK_SKEW_MS = 60_000;
20
25
  function createGatewayAdminProxyAuthSecret() {
@@ -23,15 +28,20 @@ function createGatewayAdminProxyAuthSecret() {
23
28
  function createGatewayAdminProxyHeaders(input) {
24
29
  const issuedAt = input.issuedAt ?? Date.now();
25
30
  const loopback = input.originalClientLoopback ? '1' : '0';
31
+ const intent = input.intent ? canonicalGatewayAdminProxyIntent(input.intent) : undefined;
26
32
  return {
27
33
  [exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER]: loopback,
28
34
  [exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]: String(issuedAt),
35
+ ...(input.nonce ? { [exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER]: input.nonce } : {}),
36
+ ...(intent ? { [exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER]: intent } : {}),
29
37
  [exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]: signGatewayAdminProxyMarker({
30
38
  secret: input.secret,
31
39
  method: input.method,
32
40
  url: input.url,
33
41
  loopback,
34
42
  issuedAt,
43
+ nonce: input.nonce,
44
+ intent,
35
45
  }),
36
46
  };
37
47
  }
@@ -55,6 +65,8 @@ function verifyGatewayAdminProxyHeaders(input) {
55
65
  const loopback = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER]);
56
66
  const timestamp = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]);
57
67
  const signature = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]);
68
+ const nonce = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_NONCE_HEADER]);
69
+ const intentHeader = firstHeader(input.headers[exports.GATEWAY_ADMIN_PROXY_INTENT_HEADER]);
58
70
  const present = loopback !== undefined || timestamp !== undefined || signature !== undefined;
59
71
  if (!present) {
60
72
  return { present: false, valid: false, originalClientLoopback: false };
@@ -75,17 +87,23 @@ function verifyGatewayAdminProxyHeaders(input) {
75
87
  if (Math.abs((input.now ?? Date.now()) - issuedAt) > MAX_CLOCK_SKEW_MS) {
76
88
  return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'expired_marker' };
77
89
  }
90
+ const intent = parseGatewayAdminProxyIntent(intentHeader);
91
+ if (intentHeader !== undefined && !intent) {
92
+ return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'invalid_intent' };
93
+ }
78
94
  const expected = signGatewayAdminProxyMarker({
79
95
  secret: input.secret,
80
96
  method: input.method,
81
97
  url: input.url,
82
98
  loopback,
83
99
  issuedAt,
100
+ nonce,
101
+ intent: intentHeader,
84
102
  });
85
103
  if (!safeEqual(signature, expected)) {
86
104
  return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'bad_signature' };
87
105
  }
88
- return { present: true, valid: true, originalClientLoopback: loopback === '1' };
106
+ return { present: true, valid: true, originalClientLoopback: loopback === '1', nonce, intent };
89
107
  }
90
108
  function signGatewayAdminProxyMarker(input) {
91
109
  const payload = [
@@ -94,9 +112,46 @@ function signGatewayAdminProxyMarker(input) {
94
112
  input.url ?? '/',
95
113
  input.loopback,
96
114
  String(input.issuedAt),
115
+ input.nonce ?? '',
116
+ input.intent ?? '',
97
117
  ].join('\n');
98
118
  return (0, node_crypto_1.createHmac)('sha256', input.secret).update(payload).digest('base64url');
99
119
  }
120
+ function canonicalGatewayAdminProxyIntent(intent) {
121
+ return JSON.stringify({
122
+ ownerWebId: intent.ownerWebId,
123
+ method: intent.method,
124
+ resourceUrl: intent.resourceUrl,
125
+ principalKind: intent.principalKind,
126
+ scopes: [...intent.scopes].sort(),
127
+ });
128
+ }
129
+ function parseGatewayAdminProxyIntent(value) {
130
+ if (!value) {
131
+ return undefined;
132
+ }
133
+ try {
134
+ const parsed = JSON.parse(value);
135
+ if (typeof parsed.ownerWebId !== 'string' ||
136
+ typeof parsed.resourceUrl !== 'string' ||
137
+ (parsed.method !== 'GET' && parsed.method !== 'PUT' && parsed.method !== 'PATCH' && parsed.method !== 'DELETE') ||
138
+ parsed.principalKind !== 'solid-user' ||
139
+ !Array.isArray(parsed.scopes) ||
140
+ !parsed.scopes.every((scope) => typeof scope === 'string')) {
141
+ return undefined;
142
+ }
143
+ return {
144
+ ownerWebId: parsed.ownerWebId,
145
+ method: parsed.method,
146
+ resourceUrl: parsed.resourceUrl,
147
+ principalKind: parsed.principalKind,
148
+ scopes: parsed.scopes,
149
+ };
150
+ }
151
+ catch {
152
+ return undefined;
153
+ }
154
+ }
100
155
  function safeEqual(actual, expected) {
101
156
  const actualBuffer = Buffer.from(actual);
102
157
  const expectedBuffer = Buffer.from(expected);
@@ -1 +1 @@
1
- {"version":3,"file":"GatewayAdminProxyAuth.js","sourceRoot":"","sources":["../../src/runtime/GatewayAdminProxyAuth.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';\nimport type { IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http';\nimport { isIP } from 'node:net';\n\nexport const GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = 'x-xpod-admin-proxy-loopback';\nexport const GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = 'x-xpod-admin-proxy-timestamp';\nexport const GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = 'x-xpod-admin-proxy-signature';\n\nexport const GATEWAY_ADMIN_PROXY_HEADERS = [\n GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER,\n GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER,\n GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER,\n] as const;\n\nconst MAX_CLOCK_SKEW_MS = 60_000;\n\nexport function createGatewayAdminProxyAuthSecret(): string {\n return randomBytes(32).toString('base64url');\n}\n\nexport interface GatewayAdminProxyMarkerInput {\n secret: string;\n method: string | undefined;\n url: string | undefined;\n originalClientLoopback: boolean;\n issuedAt?: number;\n}\n\nexport interface GatewayAdminProxyMarkerVerification {\n present: boolean;\n valid: boolean;\n originalClientLoopback: boolean;\n reason?: string;\n}\n\nexport function createGatewayAdminProxyHeaders(input: GatewayAdminProxyMarkerInput): OutgoingHttpHeaders {\n const issuedAt = input.issuedAt ?? Date.now();\n const loopback = input.originalClientLoopback ? '1' : '0';\n return {\n [GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER]: loopback,\n [GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]: String(issuedAt),\n [GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]: signGatewayAdminProxyMarker({\n secret: input.secret,\n method: input.method,\n url: input.url,\n loopback,\n issuedAt,\n }),\n };\n}\n\nexport function stripGatewayAdminProxyHeaders(headers: IncomingHttpHeaders): void {\n for (const header of GATEWAY_ADMIN_PROXY_HEADERS) {\n delete headers[header];\n }\n}\n\nexport function isLoopbackRemoteAddress(remoteAddress: string | undefined): boolean {\n if (!remoteAddress) return false;\n const normalized = remoteAddress.startsWith('::ffff:')\n ? remoteAddress.slice('::ffff:'.length)\n : remoteAddress;\n\n if (isIP(normalized) === 4) {\n return normalized.startsWith('127.');\n }\n return normalized === '::1';\n}\n\nexport function verifyGatewayAdminProxyHeaders(input: {\n headers: IncomingHttpHeaders;\n secret?: string;\n method: string | undefined;\n url: string | undefined;\n now?: number;\n}): GatewayAdminProxyMarkerVerification {\n const loopback = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER]);\n const timestamp = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]);\n const signature = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]);\n const present = loopback !== undefined || timestamp !== undefined || signature !== undefined;\n if (!present) {\n return { present: false, valid: false, originalClientLoopback: false };\n }\n if (!input.secret) {\n return { present: true, valid: false, originalClientLoopback: false, reason: 'missing_secret' };\n }\n if (loopback !== '0' && loopback !== '1') {\n return { present: true, valid: false, originalClientLoopback: false, reason: 'invalid_loopback' };\n }\n if (!timestamp || !signature) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'incomplete_marker' };\n }\n\n const issuedAt = Number.parseInt(timestamp, 10);\n if (!Number.isFinite(issuedAt)) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'invalid_timestamp' };\n }\n if (Math.abs((input.now ?? Date.now()) - issuedAt) > MAX_CLOCK_SKEW_MS) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'expired_marker' };\n }\n\n const expected = signGatewayAdminProxyMarker({\n secret: input.secret,\n method: input.method,\n url: input.url,\n loopback,\n issuedAt,\n });\n if (!safeEqual(signature, expected)) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'bad_signature' };\n }\n\n return { present: true, valid: true, originalClientLoopback: loopback === '1' };\n}\n\nfunction signGatewayAdminProxyMarker(input: {\n secret: string;\n method: string | undefined;\n url: string | undefined;\n loopback: '0' | '1';\n issuedAt: number;\n}): string {\n const payload = [\n 'v1',\n (input.method ?? 'GET').toUpperCase(),\n input.url ?? '/',\n input.loopback,\n String(input.issuedAt),\n ].join('\\n');\n return createHmac('sha256', input.secret).update(payload).digest('base64url');\n}\n\nfunction safeEqual(actual: string, expected: string): boolean {\n const actualBuffer = Buffer.from(actual);\n const expectedBuffer = Buffer.from(expected);\n return actualBuffer.length === expectedBuffer.length && timingSafeEqual(actualBuffer, expectedBuffer);\n}\n\nfunction firstHeader(value: string | string[] | undefined): string | undefined {\n return Array.isArray(value) ? value[0] : value;\n}\n"]}
1
+ {"version":3,"file":"GatewayAdminProxyAuth.js","sourceRoot":"","sources":["../../src/runtime/GatewayAdminProxyAuth.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';\nimport type { IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http';\nimport { isIP } from 'node:net';\n\nexport const GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER = 'x-xpod-admin-proxy-loopback';\nexport const GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER = 'x-xpod-admin-proxy-timestamp';\nexport const GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER = 'x-xpod-admin-proxy-signature';\nexport const GATEWAY_ADMIN_PROXY_INTENT_HEADER = 'x-xpod-admin-proxy-intent';\nexport const GATEWAY_ADMIN_PROXY_NONCE_HEADER = 'x-xpod-admin-proxy-nonce';\n\nexport const GATEWAY_ADMIN_PROXY_HEADERS = [\n GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER,\n GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER,\n GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER,\n GATEWAY_ADMIN_PROXY_INTENT_HEADER,\n GATEWAY_ADMIN_PROXY_NONCE_HEADER,\n] as const;\n\nconst MAX_CLOCK_SKEW_MS = 60_000;\n\nexport function createGatewayAdminProxyAuthSecret(): string {\n return randomBytes(32).toString('base64url');\n}\n\nexport interface GatewayAdminProxyMarkerInput {\n secret: string;\n method: string | undefined;\n url: string | undefined;\n originalClientLoopback: boolean;\n issuedAt?: number;\n nonce?: string;\n intent?: GatewayAdminProxyIntent;\n}\n\nexport interface GatewayAdminProxyMarkerVerification {\n present: boolean;\n valid: boolean;\n originalClientLoopback: boolean;\n nonce?: string;\n intent?: GatewayAdminProxyIntent;\n reason?: string;\n}\n\nexport interface GatewayAdminProxyIntent {\n ownerWebId: string;\n method: 'GET' | 'PUT' | 'PATCH' | 'DELETE';\n resourceUrl: string;\n principalKind: 'solid-user';\n scopes: string[];\n}\n\nexport function createGatewayAdminProxyHeaders(input: GatewayAdminProxyMarkerInput): OutgoingHttpHeaders {\n const issuedAt = input.issuedAt ?? Date.now();\n const loopback = input.originalClientLoopback ? '1' : '0';\n const intent = input.intent ? canonicalGatewayAdminProxyIntent(input.intent) : undefined;\n return {\n [GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER]: loopback,\n [GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]: String(issuedAt),\n ...(input.nonce ? { [GATEWAY_ADMIN_PROXY_NONCE_HEADER]: input.nonce } : {}),\n ...(intent ? { [GATEWAY_ADMIN_PROXY_INTENT_HEADER]: intent } : {}),\n [GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]: signGatewayAdminProxyMarker({\n secret: input.secret,\n method: input.method,\n url: input.url,\n loopback,\n issuedAt,\n nonce: input.nonce,\n intent,\n }),\n };\n}\n\nexport function stripGatewayAdminProxyHeaders(headers: IncomingHttpHeaders): void {\n for (const header of GATEWAY_ADMIN_PROXY_HEADERS) {\n delete headers[header];\n }\n}\n\nexport function isLoopbackRemoteAddress(remoteAddress: string | undefined): boolean {\n if (!remoteAddress) return false;\n const normalized = remoteAddress.startsWith('::ffff:')\n ? remoteAddress.slice('::ffff:'.length)\n : remoteAddress;\n\n if (isIP(normalized) === 4) {\n return normalized.startsWith('127.');\n }\n return normalized === '::1';\n}\n\nexport function verifyGatewayAdminProxyHeaders(input: {\n headers: IncomingHttpHeaders;\n secret?: string;\n method: string | undefined;\n url: string | undefined;\n now?: number;\n}): GatewayAdminProxyMarkerVerification {\n const loopback = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_LOOPBACK_HEADER]);\n const timestamp = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_TIMESTAMP_HEADER]);\n const signature = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_SIGNATURE_HEADER]);\n const nonce = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_NONCE_HEADER]);\n const intentHeader = firstHeader(input.headers[GATEWAY_ADMIN_PROXY_INTENT_HEADER]);\n const present = loopback !== undefined || timestamp !== undefined || signature !== undefined;\n if (!present) {\n return { present: false, valid: false, originalClientLoopback: false };\n }\n if (!input.secret) {\n return { present: true, valid: false, originalClientLoopback: false, reason: 'missing_secret' };\n }\n if (loopback !== '0' && loopback !== '1') {\n return { present: true, valid: false, originalClientLoopback: false, reason: 'invalid_loopback' };\n }\n if (!timestamp || !signature) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'incomplete_marker' };\n }\n\n const issuedAt = Number.parseInt(timestamp, 10);\n if (!Number.isFinite(issuedAt)) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'invalid_timestamp' };\n }\n if (Math.abs((input.now ?? Date.now()) - issuedAt) > MAX_CLOCK_SKEW_MS) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'expired_marker' };\n }\n\n const intent = parseGatewayAdminProxyIntent(intentHeader);\n if (intentHeader !== undefined && !intent) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'invalid_intent' };\n }\n\n const expected = signGatewayAdminProxyMarker({\n secret: input.secret,\n method: input.method,\n url: input.url,\n loopback,\n issuedAt,\n nonce,\n intent: intentHeader,\n });\n if (!safeEqual(signature, expected)) {\n return { present: true, valid: false, originalClientLoopback: loopback === '1', reason: 'bad_signature' };\n }\n\n return { present: true, valid: true, originalClientLoopback: loopback === '1', nonce, intent };\n}\n\nfunction signGatewayAdminProxyMarker(input: {\n secret: string;\n method: string | undefined;\n url: string | undefined;\n loopback: '0' | '1';\n issuedAt: number;\n nonce?: string;\n intent?: string;\n}): string {\n const payload = [\n 'v1',\n (input.method ?? 'GET').toUpperCase(),\n input.url ?? '/',\n input.loopback,\n String(input.issuedAt),\n input.nonce ?? '',\n input.intent ?? '',\n ].join('\\n');\n return createHmac('sha256', input.secret).update(payload).digest('base64url');\n}\n\nexport function canonicalGatewayAdminProxyIntent(intent: GatewayAdminProxyIntent): string {\n return JSON.stringify({\n ownerWebId: intent.ownerWebId,\n method: intent.method,\n resourceUrl: intent.resourceUrl,\n principalKind: intent.principalKind,\n scopes: [...intent.scopes].sort(),\n });\n}\n\nfunction parseGatewayAdminProxyIntent(value: string | undefined): GatewayAdminProxyIntent | undefined {\n if (!value) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(value) as Partial<GatewayAdminProxyIntent>;\n if (typeof parsed.ownerWebId !== 'string' ||\n typeof parsed.resourceUrl !== 'string' ||\n (parsed.method !== 'GET' && parsed.method !== 'PUT' && parsed.method !== 'PATCH' && parsed.method !== 'DELETE') ||\n parsed.principalKind !== 'solid-user' ||\n !Array.isArray(parsed.scopes) ||\n !parsed.scopes.every((scope) => typeof scope === 'string')) {\n return undefined;\n }\n return {\n ownerWebId: parsed.ownerWebId,\n method: parsed.method,\n resourceUrl: parsed.resourceUrl,\n principalKind: parsed.principalKind,\n scopes: parsed.scopes,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction safeEqual(actual: string, expected: string): boolean {\n const actualBuffer = Buffer.from(actual);\n const expectedBuffer = Buffer.from(expected);\n return actualBuffer.length === expectedBuffer.length && timingSafeEqual(actualBuffer, expectedBuffer);\n}\n\nfunction firstHeader(value: string | string[] | undefined): string | undefined {\n return Array.isArray(value) ? value[0] : value;\n}\n"]}
@@ -24,6 +24,7 @@ const GatewayAdminProxyAuth_1 = require("./GatewayAdminProxyAuth");
24
24
  const CSS_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/config/';
25
25
  const XPOD_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/config/';
26
26
  const CSS_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld';
27
+ const XPOD_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld';
27
28
  const ASYNC_HANDLERS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld';
28
29
  function ensureTrailingSlash(url) {
29
30
  return url.endsWith('/') ? url : `${url}/`;
@@ -263,6 +264,7 @@ function buildRuntimeShorthand(runtimeEnv, options, state, baseEnv = NodeRuntime
263
264
  ['acmePropagationDelayMs', envValue('XPOD_ACME_DNS_PROPAGATION_DELAY_MS')],
264
265
  ['acmePostDeployCommand', envValue('XPOD_ACME_POST_DEPLOY_COMMAND')],
265
266
  ['serviceToken', envValue('XPOD_SERVICE_TOKEN')],
267
+ ['gatewayAdminProxyAuthSecret', envValue('XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET')],
266
268
  ]),
267
269
  baseUrl: state.baseUrl,
268
270
  rootFilePath: state.rootFilePath,
@@ -293,6 +295,7 @@ function createCssRuntimeConfig(state, _open, platform = NodeRuntimePlatform_1.n
293
295
  platform.writeTextFile(runtimeConfigPath, JSON.stringify({
294
296
  '@context': [
295
297
  CSS_COMPONENTS_CONTEXT,
298
+ XPOD_COMPONENTS_CONTEXT,
296
299
  ASYNC_HANDLERS_CONTEXT,
297
300
  ],
298
301
  import: [
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { setGlobalLoggerFactory } from 'global-logger-factory';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { PACKAGE_ROOT } from './package-root';\nimport type { RuntimeHost } from './host/types';\nimport { oidcTokenEndpoint, resolveExternalOidcIssuer } from './oidc-issuer';\nimport { nodeRuntimePlatform } from './platform/node/NodeRuntimePlatform';\nimport type { RuntimePlatform } from './platform/types';\nimport { loadEnvFile } from './env-utils';\nimport type { XpodRuntimeOptions, XpodRuntimePorts, XpodRuntimeSockets } from './runtime-types';\nimport type { AuthMode } from '../authorization/AuthMode';\nimport { applyAuthModeEnv, resolveAuthModeInput } from '../authorization/AuthMode';\nimport { extractComponentParameterContext, normalizeComponentParameterKeys } from './component-parameter-keys';\nimport { rewriteConfigAssetPaths } from './config-asset-paths';\nimport { createGatewayAdminProxyAuthSecret } from './GatewayAdminProxyAuth';\n\nconst CSS_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/config/';\nconst XPOD_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/config/';\nconst CSS_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld';\nconst ASYNC_HANDLERS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld';\n\nexport interface RuntimeBootstrapState {\n id: string;\n host: RuntimeHost;\n mode: 'local' | 'cloud';\n transport: 'socket' | 'port';\n bindHost: string;\n runtimeRoot: string;\n rootFilePath: string;\n sparqlEndpoint: string;\n rdfIndexPath: string;\n identityDbUrl: string;\n usageDbUrl: string;\n cssAuthMode: AuthMode;\n apiOpen: boolean;\n gatewayAdminProxyAuthSecret: string;\n logLevel: string;\n baseUrl: string;\n envFilePath?: string;\n ports: XpodRuntimePorts;\n sockets: XpodRuntimeSockets;\n}\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction normalizeWindowsAbsolutePath(filePath: string): string {\n return filePath.replace(/^[\\\\/]+(?=[A-Za-z]:[\\\\/])/, '');\n}\n\nfunction isWindowsAbsolutePath(filePath: string): boolean {\n return /^[A-Za-z]:[\\\\/]/.test(normalizeWindowsAbsolutePath(filePath));\n}\n\nfunction getWindowsDriveRoot(filePath: string): string | undefined {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath);\n return isWindowsAbsolutePath(normalizedPath) ? path.win32.parse(normalizedPath).root.toLowerCase() : undefined;\n}\n\nfunction arePathsOnDifferentWindowsDrives(firstPath: string, secondPath: string): boolean {\n const firstRoot = getWindowsDriveRoot(firstPath);\n const secondRoot = getWindowsDriveRoot(secondPath);\n return Boolean(firstRoot && secondRoot && firstRoot !== secondRoot);\n}\n\nfunction toWindowsFileUrl(filePath: string): string {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath).replace(/\\\\/g, '/');\n return new URL(`file:///${normalizedPath}`).href;\n}\n\nfunction toConfigImportSpecifier(fromFilePath: string, toFilePath: string): string {\n const normalizedFromPath = normalizeWindowsAbsolutePath(fromFilePath);\n const normalizedToPath = normalizeWindowsAbsolutePath(toFilePath);\n if (!isWindowsAbsolutePath(normalizedFromPath) && (pathNeedsEscapedFileUrl(normalizedFromPath) || pathNeedsEscapedFileUrl(normalizedToPath))) {\n return pathToFileURL(normalizedToPath).href;\n }\n\n const useWindowsPaths = isWindowsAbsolutePath(normalizedFromPath) || isWindowsAbsolutePath(normalizedToPath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const fromDirectoryPath = pathApi.dirname(useWindowsPaths ? normalizedFromPath : fromFilePath);\n const targetPath = useWindowsPaths ? normalizedToPath : toFilePath;\n\n if (useWindowsPaths && arePathsOnDifferentWindowsDrives(fromDirectoryPath, targetPath)) {\n return toWindowsFileUrl(targetPath);\n }\n\n const relativePath = pathApi.relative(fromDirectoryPath, targetPath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction pathNeedsEscapedFileUrl(filePath: string): boolean {\n return /\\s/.test(filePath);\n}\n\nfunction withDefinedEntries(entries: Array<[string, string | number | boolean | undefined]>): Record<string, string | number | boolean> {\n const result: Record<string, string | number | boolean> = {};\n for (const [key, value] of entries) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction normalizeDatabaseUrl(\n value: string,\n platform: Pick<RuntimePlatform, 'resolvePath'> = nodeRuntimePlatform,\n): string {\n if (\n value.startsWith('sqlite:') ||\n value.startsWith('postgres://') ||\n value.startsWith('postgresql://') ||\n value.startsWith('mysql://')\n ) {\n return value;\n }\n return `sqlite:${platform.resolvePath(value)}`;\n}\n\nfunction readRuntimeEnvFile(\n envFilePath: string | undefined,\n platform: Pick<RuntimePlatform, 'fileExists' | 'readTextFile'>,\n): Record<string, string> {\n return envFilePath ? loadEnvFile(envFilePath, platform) : {};\n}\n\nexport function cssAuthModeConfigImports(authMode: AuthMode): string[] {\n switch (authMode) {\n case 'acl':\n return [\n 'css:config/ldp/authorization/webacl.json',\n 'css:config/util/auxiliary/acl.json',\n ];\n case 'allow-all':\n return [\n 'css:config/ldp/authorization/allow-all.json',\n 'css:config/util/auxiliary/empty.json',\n ];\n case 'acp':\n default:\n return [\n 'css:config/ldp/authorization/acp.json',\n 'css:config/util/auxiliary/acr.json',\n ];\n }\n}\n\nexport async function resolveRuntimeBootstrap(\n id: string,\n options: XpodRuntimeOptions,\n host: RuntimeHost,\n platform: RuntimePlatform = nodeRuntimePlatform,\n): Promise<RuntimeBootstrapState> {\n const mode = options.mode ?? 'local';\n const transport = host.resolveTransport(options.transport);\n const bindHost = options.bindHost ?? '127.0.0.1';\n const runtimeRoot = platform.resolvePath(options.runtimeRoot ?? platform.joinPath(platform.cwd(), '.test-data', 'xpod-runtime', id));\n const rootFilePath = platform.resolvePath(options.rootFilePath ?? platform.joinPath(runtimeRoot, 'data'));\n const sparqlEndpoint = normalizeDatabaseUrl(options.sparqlEndpoint ?? platform.joinPath(runtimeRoot, 'quadstore.sqlite'), platform);\n const rdfIndexPath = platform.resolvePath(options.rdfIndexPath ?? platform.joinPath(runtimeRoot, 'rdf-index.sqlite'));\n const identityDbUrl = normalizeDatabaseUrl(options.identityDbUrl ?? platform.joinPath(runtimeRoot, 'identity.sqlite'), platform);\n const usageDbUrl = normalizeDatabaseUrl(options.usageDbUrl ?? platform.joinPath(runtimeRoot, 'usage.sqlite'), platform);\n const envFilePath = options.envFile ? platform.resolvePath(options.envFile) : undefined;\n const authModeEnv = {\n ...platform.baseEnv,\n ...readRuntimeEnvFile(envFilePath, platform),\n ...options.env,\n };\n const cssAuthMode = options.open ? 'allow-all' : resolveAuthModeInput(options.authMode, authModeEnv);\n const apiOpen = options.apiOpen ?? options.open ?? false;\n const gatewayAdminProxyAuthSecret = createGatewayAdminProxyAuthSecret();\n const logLevel = options.logLevel ?? platform.getEnv('CSS_LOGGING_LEVEL') ?? 'warn';\n\n platform.ensureDir(runtimeRoot);\n platform.ensureDir(rootFilePath);\n\n const socketsRoot = platform.joinPath(runtimeRoot, 'sockets');\n if (transport === 'socket') {\n platform.ensureDir(socketsRoot);\n }\n const ports: XpodRuntimePorts = transport === 'port'\n ? await host.allocatePorts({\n gatewayPort: options.gatewayPort,\n cssPort: options.cssPort,\n apiPort: options.apiPort,\n basePort: 5600,\n })\n : {};\n const sockets: XpodRuntimeSockets = {};\n\n if (transport === 'socket') {\n sockets.gateway = platform.resolvePath(options.gatewaySocketPath ?? platform.joinPath(socketsRoot, 'gateway.sock'));\n sockets.css = platform.resolvePath(options.cssSocketPath ?? platform.joinPath(socketsRoot, 'css.sock'));\n sockets.api = platform.resolvePath(options.apiSocketPath ?? platform.joinPath(socketsRoot, 'api.sock'));\n }\n\n const baseUrl = ensureTrailingSlash(\n options.baseUrl ?? (transport === 'socket'\n ? 'http://localhost'\n : `http://${bindHost}:${ports.gateway}`),\n );\n\n return {\n id,\n host,\n mode,\n transport,\n bindHost,\n runtimeRoot,\n rootFilePath,\n sparqlEndpoint,\n rdfIndexPath,\n identityDbUrl,\n usageDbUrl,\n cssAuthMode,\n apiOpen,\n gatewayAdminProxyAuthSecret,\n logLevel,\n baseUrl,\n envFilePath,\n ports,\n sockets,\n };\n}\n\nexport function buildRuntimeEnv(\n state: RuntimeBootstrapState,\n options: XpodRuntimeOptions,\n envFromFile: Record<string, string | undefined> = {},\n): Record<string, string | undefined> {\n const mergedEnv = {\n ...envFromFile,\n ...options.env,\n };\n const externalOidcIssuer = resolveExternalOidcIssuer(mergedEnv);\n\n const runtimeEnv = {\n ...mergedEnv,\n XPOD_ENV_PATH: state.envFilePath,\n XPOD_EDITION: state.mode,\n CSS_BASE_URL: state.baseUrl,\n CSS_TOKEN_ENDPOINT: externalOidcIssuer\n ? oidcTokenEndpoint(externalOidcIssuer)\n : `${state.baseUrl}.oidc/token`,\n CSS_ROOT_FILE_PATH: state.rootFilePath,\n CSS_RDF_INDEX_PATH: state.rdfIndexPath,\n CSS_SPARQL_ENDPOINT: state.sparqlEndpoint,\n SPARQL_ENDPOINT: state.sparqlEndpoint,\n CSS_IDENTITY_DB_URL: state.identityDbUrl,\n DATABASE_URL: state.identityDbUrl,\n CSS_PORT: state.ports.css !== undefined ? String(state.ports.css) : undefined,\n API_PORT: state.ports.api !== undefined ? String(state.ports.api) : undefined,\n API_HOST: state.bindHost,\n API_SOCKET_PATH: state.sockets.api,\n XPOD_MAIN_PORT: state.ports.gateway !== undefined ? String(state.ports.gateway) : undefined,\n XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: state.gatewayAdminProxyAuthSecret,\n // Auto-provision may write these during API startup. Include them even when\n // undefined so RuntimeEnvironmentSession can restore/clear them afterwards.\n XPOD_NODE_ID: mergedEnv.XPOD_NODE_ID,\n XPOD_NODE_TOKEN: mergedEnv.XPOD_NODE_TOKEN,\n XPOD_SERVICE_TOKEN: mergedEnv.XPOD_SERVICE_TOKEN,\n XPOD_PROVISION_CODE: mergedEnv.XPOD_PROVISION_CODE,\n XPOD_PROVISION_URL: mergedEnv.XPOD_PROVISION_URL,\n XPOD_SP_DOMAIN: mergedEnv.XPOD_SP_DOMAIN,\n XPOD_PUBLIC_URL: mergedEnv.XPOD_PUBLIC_URL,\n XPOD_LOCAL_SETUP_PATH: mergedEnv.XPOD_LOCAL_SETUP_PATH,\n XPOD_PROVIDER_ID: mergedEnv.XPOD_PROVIDER_ID,\n XPOD_CLOUD_API_ENDPOINT: mergedEnv.XPOD_CLOUD_API_ENDPOINT,\n XPOD_LOCAL_AUTO_PROVISION: mergedEnv.XPOD_LOCAL_AUTO_PROVISION,\n XPOD_LOCAL_AUTO_PROVISION_TIMEOUT_MS: mergedEnv.XPOD_LOCAL_AUTO_PROVISION_TIMEOUT_MS,\n CORS_ORIGINS: new URL(state.baseUrl).origin,\n CSS_LOGGING_LEVEL: state.logLevel,\n };\n\n return applyAuthModeEnv(runtimeEnv, state.cssAuthMode);\n}\n\nexport function buildRuntimeShorthand(\n runtimeEnv: Record<string, string | undefined>,\n options: XpodRuntimeOptions,\n state: RuntimeBootstrapState,\n baseEnv: Record<string, string | undefined> = nodeRuntimePlatform.baseEnv,\n): Record<string, string | number | boolean> {\n const envValue = (key: string): string | undefined => runtimeEnv[key] ?? baseEnv[key];\n const externalOidcIssuer = resolveExternalOidcIssuer({\n oidcIssuer: envValue('oidcIssuer'),\n });\n\n return {\n ...withDefinedEntries([\n ['baseStorageDomain', envValue('CSS_BASE_STORAGE_DOMAIN')],\n ['minioAccessKey', envValue('CSS_MINIO_ACCESS_KEY')],\n ['minioSecretKey', envValue('CSS_MINIO_SECRET_KEY')],\n ['minioEndpoint', envValue('CSS_MINIO_ENDPOINT')],\n ['minioBucketName', envValue('CSS_MINIO_BUCKET_NAME')],\n ['redisClient', envValue('CSS_REDIS_CLIENT')],\n ['redisUsername', envValue('CSS_REDIS_USERNAME')],\n ['redisPassword', envValue('CSS_REDIS_PASSWORD')],\n ['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST') ?? ''],\n ['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT') ?? '587'],\n ['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER') ?? ''],\n ['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS') ?? ''],\n ['oidcIssuer', externalOidcIssuer],\n ['allowedHosts', envValue('CSS_ALLOWED_HOSTS')],\n ['edgeNodeAgentEnabled', envValue('XPOD_EDGE_NODE_AGENT_ENABLED')],\n ['signalEndpoint', envValue('XPOD_SIGNAL_ENDPOINT')],\n ['nodeId', envValue('XPOD_NODE_ID')],\n ['nodeToken', envValue('XPOD_NODE_TOKEN')],\n ['p2pEnabled', envValue('XPOD_P2P_ENABLED')],\n ['p2pTargetBaseUrl', envValue('XPOD_P2P_TARGET_BASE_URL')],\n ['p2pLabel', envValue('XPOD_P2P_LABEL')],\n ['p2pAcceptIntervalMs', envValue('XPOD_P2P_ACCEPT_INTERVAL_MS')],\n ['p2pConnectTimeoutMs', envValue('XPOD_P2P_CONNECT_TIMEOUT_MS')],\n ['p2pWinnerSelectionWindowMs', envValue('XPOD_P2P_WINNER_SELECTION_WINDOW_MS')],\n ['acmeMode', envValue('XPOD_ACME_MODE')],\n ['acmeEmail', envValue('XPOD_ACME_EMAIL')],\n ['acmeDomains', envValue('XPOD_ACME_DOMAINS')],\n ['acmeDirectoryUrl', envValue('XPOD_ACME_DIRECTORY_URL')],\n ['acmeAccountKeyPath', envValue('XPOD_ACME_ACCOUNT_KEY_PATH')],\n ['acmeCertificateKeyPath', envValue('XPOD_ACME_CERTIFICATE_KEY_PATH')],\n ['acmeCertificatePath', envValue('XPOD_ACME_CERTIFICATE_PATH')],\n ['acmeFullChainPath', envValue('XPOD_ACME_FULL_CHAIN_PATH')],\n ['acmeRenewBeforeDays', envValue('XPOD_ACME_RENEW_BEFORE_DAYS')],\n ['acmePropagationDelayMs', envValue('XPOD_ACME_DNS_PROPAGATION_DELAY_MS')],\n ['acmePostDeployCommand', envValue('XPOD_ACME_POST_DEPLOY_COMMAND')],\n ['serviceToken', envValue('XPOD_SERVICE_TOKEN')],\n ]),\n baseUrl: state.baseUrl,\n rootFilePath: state.rootFilePath,\n sparqlEndpoint: state.sparqlEndpoint,\n rdfIndexPath: state.rdfIndexPath,\n identityDbUrl: state.identityDbUrl,\n usageDbUrl: state.usageDbUrl,\n logLevel: state.logLevel,\n authMode: state.cssAuthMode,\n edition: state.mode === 'cloud' ? 'server' : 'local',\n edgeNodesEnabled: options.edgeNodesEnabled ?? false,\n centerRegistrationEnabled: options.centerRegistrationEnabled ?? false,\n ...(options.shorthand ?? {}),\n };\n}\n\nexport function createCssRuntimeConfig(\n state: RuntimeBootstrapState,\n _open?: boolean,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'> = nodeRuntimePlatform,\n): string {\n const configPath = normalizeWindowsAbsolutePath(platform.joinPath(PACKAGE_ROOT, `config/${state.mode}.json`));\n const runtimeRoot = normalizeWindowsAbsolutePath(state.runtimeRoot);\n const runtimeConfigPath = arePathsOnDifferentWindowsDrives(runtimeRoot, configPath)\n ? (() => {\n const runtimeConfigDir = normalizeWindowsAbsolutePath(platform.joinPath(\n platform.dirname(configPath),\n '..',\n '.xpod-runtime',\n state.id,\n ));\n platform.ensureDir(runtimeConfigDir);\n return normalizeWindowsAbsolutePath(platform.joinPath(runtimeConfigDir, 'css-runtime.config.json'));\n })()\n : normalizeWindowsAbsolutePath(platform.joinPath(runtimeRoot, 'css-runtime.config.json'));\n const runtimeConfigDir = platform.dirname(runtimeConfigPath);\n const runtimeConfigImportPath = rewriteConfigForFileUrlImportsIfNeeded(\n configPath,\n platform.joinPath(runtimeConfigDir, 'config'),\n platform,\n );\n platform.writeTextFile(runtimeConfigPath, JSON.stringify({\n '@context': [\n CSS_COMPONENTS_CONTEXT,\n ASYNC_HANDLERS_CONTEXT,\n ],\n import: [\n toConfigImportSpecifier(runtimeConfigPath, runtimeConfigImportPath),\n ...cssAuthModeConfigImports(state.cssAuthMode),\n ],\n }, null, 2));\n\n return runtimeConfigPath;\n}\n\nfunction rewriteConfigForFileUrlImportsIfNeeded(\n configPath: string,\n outputDir: string,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'>,\n rewritten = new Map<string, string>(),\n): string {\n const normalizedConfigPath = normalizeWindowsAbsolutePath(configPath);\n const componentContext = readPackageComponentContext(normalizedConfigPath, platform);\n if (\n isWindowsAbsolutePath(normalizedConfigPath) ||\n (!pathNeedsEscapedFileUrl(normalizedConfigPath) && !componentContext)\n ) {\n return normalizedConfigPath;\n }\n\n const existing = rewritten.get(normalizedConfigPath);\n if (existing) {\n return existing;\n }\n\n platform.ensureDir(outputDir);\n const outputPath = normalizeWindowsAbsolutePath(platform.joinPath(outputDir, path.posix.basename(normalizedConfigPath)));\n rewritten.set(normalizedConfigPath, outputPath);\n\n const parsed = JSON.parse(platform.readTextFile(normalizedConfigPath)) as Record<string, unknown>;\n preserveConfigBase(parsed, normalizedConfigPath);\n normalizeComponentParameterKeys(parsed, componentContext);\n rewriteConfigAssetPaths(parsed, normalizedConfigPath, resolveConfigAssetPath);\n parsed.import = rewriteConfigImports(\n normalizedConfigPath,\n parsed.import,\n outputDir,\n platform,\n rewritten,\n );\n platform.writeTextFile(outputPath, `${JSON.stringify(parsed, null, 2)}\\n`);\n return outputPath;\n}\n\nfunction readPackageComponentContext(\n configPath: string,\n platform: Pick<RuntimePlatform, 'readTextFile'>,\n): ReturnType<typeof extractComponentParameterContext> {\n const normalizedConfigPath = normalizeWindowsAbsolutePath(configPath);\n const useWindowsPaths = isWindowsAbsolutePath(normalizedConfigPath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const contextPath = normalizeWindowsAbsolutePath(pathApi.join(\n resolveConfigAssetBase(normalizedConfigPath),\n 'dist',\n 'components',\n 'context.jsonld',\n ));\n try {\n return extractComponentParameterContext(JSON.parse(platform.readTextFile(contextPath)));\n } catch {\n return undefined;\n }\n}\n\nfunction resolveConfigAssetPath(sourceConfigPath: string, assetPath: string): string {\n const normalizedSourcePath = normalizeWindowsAbsolutePath(sourceConfigPath);\n const useWindowsPaths = isWindowsAbsolutePath(normalizedSourcePath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n return normalizeWindowsAbsolutePath(pathApi.resolve(resolveConfigAssetBase(normalizedSourcePath), assetPath));\n}\n\nfunction resolveConfigAssetBase(sourceConfigPath: string): string {\n const normalized = normalizeWindowsAbsolutePath(sourceConfigPath);\n const useWindowsPaths = isWindowsAbsolutePath(normalized);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const normalizedForSearch = normalized.replace(/\\\\/g, '/');\n const markerIndex = normalizedForSearch.lastIndexOf('/config/');\n if (markerIndex >= 0) {\n const packageRoot = normalizedForSearch.slice(0, markerIndex);\n return useWindowsPaths ? packageRoot.replace(/\\//g, '\\\\') : packageRoot;\n }\n return pathApi.dirname(normalized);\n}\n\nfunction preserveConfigBase(parsed: Record<string, unknown>, configPath: string): void {\n const context = parsed['@context'];\n const contexts = Array.isArray(context)\n ? [...context]\n : context === undefined\n ? []\n : [context];\n const withoutExistingBase = contexts.filter((entry) => (\n !entry || typeof entry !== 'object' || !('@base' in entry)\n ));\n withoutExistingBase.push({ '@base': resolveConfigBase(configPath) });\n parsed['@context'] = withoutExistingBase;\n delete parsed['@base'];\n}\n\nfunction resolveConfigBase(configPath: string): string {\n const normalized = normalizeWindowsAbsolutePath(configPath).replace(/\\\\/g, '/');\n if (normalized.includes('/node_modules/@solid/community-server/config/')) {\n return CSS_CONFIG_BASE;\n }\n if (normalized.includes('/node_modules/@undefineds.co/xpod/config/')) {\n return XPOD_CONFIG_BASE;\n }\n return pathToFileURL(path.posix.dirname(normalized) + '/').href;\n}\n\nfunction rewriteConfigImports(\n sourceConfigPath: string,\n imports: unknown,\n outputDir: string,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'>,\n rewritten: Map<string, string>,\n): unknown {\n if (typeof imports === 'string') {\n return rewriteConfigImport(sourceConfigPath, imports, outputDir, platform, rewritten);\n }\n\n if (Array.isArray(imports)) {\n return imports.map((value) => typeof value === 'string'\n ? rewriteConfigImport(sourceConfigPath, value, outputDir, platform, rewritten)\n : value);\n }\n\n return imports;\n}\n\nfunction rewriteConfigImport(\n sourceConfigPath: string,\n importValue: string,\n outputDir: string,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'>,\n rewritten: Map<string, string>,\n): string {\n if (!importValue.startsWith('./') && !importValue.startsWith('../')) {\n return importValue;\n }\n\n const targetPath = normalizeWindowsAbsolutePath(\n path.posix.resolve(platform.dirname(sourceConfigPath), importValue),\n );\n const rewrittenTargetPath = rewriteConfigForFileUrlImportsIfNeeded(targetPath, outputDir, platform, rewritten);\n return pathToFileURL(rewrittenTargetPath).href;\n}\n\nexport function initRuntimeLogger(\n level: string,\n platform: Pick<RuntimePlatform, 'cwd' | 'joinPath'> = nodeRuntimePlatform,\n): void {\n const loggerFactory = new ConfigurableLoggerFactory(level, {\n fileName: platform.joinPath(platform.cwd(), 'logs/xpod-%DATE%.log'),\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n"]}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { setGlobalLoggerFactory } from 'global-logger-factory';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { ConfigurableLoggerFactory } from '../logging/ConfigurableLoggerFactory';\nimport { PACKAGE_ROOT } from './package-root';\nimport type { RuntimeHost } from './host/types';\nimport { oidcTokenEndpoint, resolveExternalOidcIssuer } from './oidc-issuer';\nimport { nodeRuntimePlatform } from './platform/node/NodeRuntimePlatform';\nimport type { RuntimePlatform } from './platform/types';\nimport { loadEnvFile } from './env-utils';\nimport type { XpodRuntimeOptions, XpodRuntimePorts, XpodRuntimeSockets } from './runtime-types';\nimport type { AuthMode } from '../authorization/AuthMode';\nimport { applyAuthModeEnv, resolveAuthModeInput } from '../authorization/AuthMode';\nimport { extractComponentParameterContext, normalizeComponentParameterKeys } from './component-parameter-keys';\nimport { rewriteConfigAssetPaths } from './config-asset-paths';\nimport { createGatewayAdminProxyAuthSecret } from './GatewayAdminProxyAuth';\n\nconst CSS_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/config/';\nconst XPOD_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/config/';\nconst CSS_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld';\nconst XPOD_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld';\nconst ASYNC_HANDLERS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld';\n\nexport interface RuntimeBootstrapState {\n id: string;\n host: RuntimeHost;\n mode: 'local' | 'cloud';\n transport: 'socket' | 'port';\n bindHost: string;\n runtimeRoot: string;\n rootFilePath: string;\n sparqlEndpoint: string;\n rdfIndexPath: string;\n identityDbUrl: string;\n usageDbUrl: string;\n cssAuthMode: AuthMode;\n apiOpen: boolean;\n gatewayAdminProxyAuthSecret: string;\n logLevel: string;\n baseUrl: string;\n envFilePath?: string;\n ports: XpodRuntimePorts;\n sockets: XpodRuntimeSockets;\n}\n\nfunction ensureTrailingSlash(url: string): string {\n return url.endsWith('/') ? url : `${url}/`;\n}\n\nfunction normalizeWindowsAbsolutePath(filePath: string): string {\n return filePath.replace(/^[\\\\/]+(?=[A-Za-z]:[\\\\/])/, '');\n}\n\nfunction isWindowsAbsolutePath(filePath: string): boolean {\n return /^[A-Za-z]:[\\\\/]/.test(normalizeWindowsAbsolutePath(filePath));\n}\n\nfunction getWindowsDriveRoot(filePath: string): string | undefined {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath);\n return isWindowsAbsolutePath(normalizedPath) ? path.win32.parse(normalizedPath).root.toLowerCase() : undefined;\n}\n\nfunction arePathsOnDifferentWindowsDrives(firstPath: string, secondPath: string): boolean {\n const firstRoot = getWindowsDriveRoot(firstPath);\n const secondRoot = getWindowsDriveRoot(secondPath);\n return Boolean(firstRoot && secondRoot && firstRoot !== secondRoot);\n}\n\nfunction toWindowsFileUrl(filePath: string): string {\n const normalizedPath = normalizeWindowsAbsolutePath(filePath).replace(/\\\\/g, '/');\n return new URL(`file:///${normalizedPath}`).href;\n}\n\nfunction toConfigImportSpecifier(fromFilePath: string, toFilePath: string): string {\n const normalizedFromPath = normalizeWindowsAbsolutePath(fromFilePath);\n const normalizedToPath = normalizeWindowsAbsolutePath(toFilePath);\n if (!isWindowsAbsolutePath(normalizedFromPath) && (pathNeedsEscapedFileUrl(normalizedFromPath) || pathNeedsEscapedFileUrl(normalizedToPath))) {\n return pathToFileURL(normalizedToPath).href;\n }\n\n const useWindowsPaths = isWindowsAbsolutePath(normalizedFromPath) || isWindowsAbsolutePath(normalizedToPath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const fromDirectoryPath = pathApi.dirname(useWindowsPaths ? normalizedFromPath : fromFilePath);\n const targetPath = useWindowsPaths ? normalizedToPath : toFilePath;\n\n if (useWindowsPaths && arePathsOnDifferentWindowsDrives(fromDirectoryPath, targetPath)) {\n return toWindowsFileUrl(targetPath);\n }\n\n const relativePath = pathApi.relative(fromDirectoryPath, targetPath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction pathNeedsEscapedFileUrl(filePath: string): boolean {\n return /\\s/.test(filePath);\n}\n\nfunction withDefinedEntries(entries: Array<[string, string | number | boolean | undefined]>): Record<string, string | number | boolean> {\n const result: Record<string, string | number | boolean> = {};\n for (const [key, value] of entries) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction normalizeDatabaseUrl(\n value: string,\n platform: Pick<RuntimePlatform, 'resolvePath'> = nodeRuntimePlatform,\n): string {\n if (\n value.startsWith('sqlite:') ||\n value.startsWith('postgres://') ||\n value.startsWith('postgresql://') ||\n value.startsWith('mysql://')\n ) {\n return value;\n }\n return `sqlite:${platform.resolvePath(value)}`;\n}\n\nfunction readRuntimeEnvFile(\n envFilePath: string | undefined,\n platform: Pick<RuntimePlatform, 'fileExists' | 'readTextFile'>,\n): Record<string, string> {\n return envFilePath ? loadEnvFile(envFilePath, platform) : {};\n}\n\nexport function cssAuthModeConfigImports(authMode: AuthMode): string[] {\n switch (authMode) {\n case 'acl':\n return [\n 'css:config/ldp/authorization/webacl.json',\n 'css:config/util/auxiliary/acl.json',\n ];\n case 'allow-all':\n return [\n 'css:config/ldp/authorization/allow-all.json',\n 'css:config/util/auxiliary/empty.json',\n ];\n case 'acp':\n default:\n return [\n 'css:config/ldp/authorization/acp.json',\n 'css:config/util/auxiliary/acr.json',\n ];\n }\n}\n\nexport async function resolveRuntimeBootstrap(\n id: string,\n options: XpodRuntimeOptions,\n host: RuntimeHost,\n platform: RuntimePlatform = nodeRuntimePlatform,\n): Promise<RuntimeBootstrapState> {\n const mode = options.mode ?? 'local';\n const transport = host.resolveTransport(options.transport);\n const bindHost = options.bindHost ?? '127.0.0.1';\n const runtimeRoot = platform.resolvePath(options.runtimeRoot ?? platform.joinPath(platform.cwd(), '.test-data', 'xpod-runtime', id));\n const rootFilePath = platform.resolvePath(options.rootFilePath ?? platform.joinPath(runtimeRoot, 'data'));\n const sparqlEndpoint = normalizeDatabaseUrl(options.sparqlEndpoint ?? platform.joinPath(runtimeRoot, 'quadstore.sqlite'), platform);\n const rdfIndexPath = platform.resolvePath(options.rdfIndexPath ?? platform.joinPath(runtimeRoot, 'rdf-index.sqlite'));\n const identityDbUrl = normalizeDatabaseUrl(options.identityDbUrl ?? platform.joinPath(runtimeRoot, 'identity.sqlite'), platform);\n const usageDbUrl = normalizeDatabaseUrl(options.usageDbUrl ?? platform.joinPath(runtimeRoot, 'usage.sqlite'), platform);\n const envFilePath = options.envFile ? platform.resolvePath(options.envFile) : undefined;\n const authModeEnv = {\n ...platform.baseEnv,\n ...readRuntimeEnvFile(envFilePath, platform),\n ...options.env,\n };\n const cssAuthMode = options.open ? 'allow-all' : resolveAuthModeInput(options.authMode, authModeEnv);\n const apiOpen = options.apiOpen ?? options.open ?? false;\n const gatewayAdminProxyAuthSecret = createGatewayAdminProxyAuthSecret();\n const logLevel = options.logLevel ?? platform.getEnv('CSS_LOGGING_LEVEL') ?? 'warn';\n\n platform.ensureDir(runtimeRoot);\n platform.ensureDir(rootFilePath);\n\n const socketsRoot = platform.joinPath(runtimeRoot, 'sockets');\n if (transport === 'socket') {\n platform.ensureDir(socketsRoot);\n }\n const ports: XpodRuntimePorts = transport === 'port'\n ? await host.allocatePorts({\n gatewayPort: options.gatewayPort,\n cssPort: options.cssPort,\n apiPort: options.apiPort,\n basePort: 5600,\n })\n : {};\n const sockets: XpodRuntimeSockets = {};\n\n if (transport === 'socket') {\n sockets.gateway = platform.resolvePath(options.gatewaySocketPath ?? platform.joinPath(socketsRoot, 'gateway.sock'));\n sockets.css = platform.resolvePath(options.cssSocketPath ?? platform.joinPath(socketsRoot, 'css.sock'));\n sockets.api = platform.resolvePath(options.apiSocketPath ?? platform.joinPath(socketsRoot, 'api.sock'));\n }\n\n const baseUrl = ensureTrailingSlash(\n options.baseUrl ?? (transport === 'socket'\n ? 'http://localhost'\n : `http://${bindHost}:${ports.gateway}`),\n );\n\n return {\n id,\n host,\n mode,\n transport,\n bindHost,\n runtimeRoot,\n rootFilePath,\n sparqlEndpoint,\n rdfIndexPath,\n identityDbUrl,\n usageDbUrl,\n cssAuthMode,\n apiOpen,\n gatewayAdminProxyAuthSecret,\n logLevel,\n baseUrl,\n envFilePath,\n ports,\n sockets,\n };\n}\n\nexport function buildRuntimeEnv(\n state: RuntimeBootstrapState,\n options: XpodRuntimeOptions,\n envFromFile: Record<string, string | undefined> = {},\n): Record<string, string | undefined> {\n const mergedEnv = {\n ...envFromFile,\n ...options.env,\n };\n const externalOidcIssuer = resolveExternalOidcIssuer(mergedEnv);\n\n const runtimeEnv = {\n ...mergedEnv,\n XPOD_ENV_PATH: state.envFilePath,\n XPOD_EDITION: state.mode,\n CSS_BASE_URL: state.baseUrl,\n CSS_TOKEN_ENDPOINT: externalOidcIssuer\n ? oidcTokenEndpoint(externalOidcIssuer)\n : `${state.baseUrl}.oidc/token`,\n CSS_ROOT_FILE_PATH: state.rootFilePath,\n CSS_RDF_INDEX_PATH: state.rdfIndexPath,\n CSS_SPARQL_ENDPOINT: state.sparqlEndpoint,\n SPARQL_ENDPOINT: state.sparqlEndpoint,\n CSS_IDENTITY_DB_URL: state.identityDbUrl,\n DATABASE_URL: state.identityDbUrl,\n CSS_PORT: state.ports.css !== undefined ? String(state.ports.css) : undefined,\n API_PORT: state.ports.api !== undefined ? String(state.ports.api) : undefined,\n API_HOST: state.bindHost,\n API_SOCKET_PATH: state.sockets.api,\n XPOD_MAIN_PORT: state.ports.gateway !== undefined ? String(state.ports.gateway) : undefined,\n XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: state.gatewayAdminProxyAuthSecret,\n // Auto-provision may write these during API startup. Include them even when\n // undefined so RuntimeEnvironmentSession can restore/clear them afterwards.\n XPOD_NODE_ID: mergedEnv.XPOD_NODE_ID,\n XPOD_NODE_TOKEN: mergedEnv.XPOD_NODE_TOKEN,\n XPOD_SERVICE_TOKEN: mergedEnv.XPOD_SERVICE_TOKEN,\n XPOD_PROVISION_CODE: mergedEnv.XPOD_PROVISION_CODE,\n XPOD_PROVISION_URL: mergedEnv.XPOD_PROVISION_URL,\n XPOD_SP_DOMAIN: mergedEnv.XPOD_SP_DOMAIN,\n XPOD_PUBLIC_URL: mergedEnv.XPOD_PUBLIC_URL,\n XPOD_LOCAL_SETUP_PATH: mergedEnv.XPOD_LOCAL_SETUP_PATH,\n XPOD_PROVIDER_ID: mergedEnv.XPOD_PROVIDER_ID,\n XPOD_CLOUD_API_ENDPOINT: mergedEnv.XPOD_CLOUD_API_ENDPOINT,\n XPOD_LOCAL_AUTO_PROVISION: mergedEnv.XPOD_LOCAL_AUTO_PROVISION,\n XPOD_LOCAL_AUTO_PROVISION_TIMEOUT_MS: mergedEnv.XPOD_LOCAL_AUTO_PROVISION_TIMEOUT_MS,\n CORS_ORIGINS: new URL(state.baseUrl).origin,\n CSS_LOGGING_LEVEL: state.logLevel,\n };\n\n return applyAuthModeEnv(runtimeEnv, state.cssAuthMode);\n}\n\nexport function buildRuntimeShorthand(\n runtimeEnv: Record<string, string | undefined>,\n options: XpodRuntimeOptions,\n state: RuntimeBootstrapState,\n baseEnv: Record<string, string | undefined> = nodeRuntimePlatform.baseEnv,\n): Record<string, string | number | boolean> {\n const envValue = (key: string): string | undefined => runtimeEnv[key] ?? baseEnv[key];\n const externalOidcIssuer = resolveExternalOidcIssuer({\n oidcIssuer: envValue('oidcIssuer'),\n });\n\n return {\n ...withDefinedEntries([\n ['baseStorageDomain', envValue('CSS_BASE_STORAGE_DOMAIN')],\n ['minioAccessKey', envValue('CSS_MINIO_ACCESS_KEY')],\n ['minioSecretKey', envValue('CSS_MINIO_SECRET_KEY')],\n ['minioEndpoint', envValue('CSS_MINIO_ENDPOINT')],\n ['minioBucketName', envValue('CSS_MINIO_BUCKET_NAME')],\n ['redisClient', envValue('CSS_REDIS_CLIENT')],\n ['redisUsername', envValue('CSS_REDIS_USERNAME')],\n ['redisPassword', envValue('CSS_REDIS_PASSWORD')],\n ['emailConfigHost', envValue('CSS_EMAIL_CONFIG_HOST') ?? ''],\n ['emailConfigPort', envValue('CSS_EMAIL_CONFIG_PORT') ?? '587'],\n ['emailConfigAuthUser', envValue('CSS_EMAIL_CONFIG_AUTH_USER') ?? ''],\n ['emailConfigAuthPass', envValue('CSS_EMAIL_CONFIG_AUTH_PASS') ?? ''],\n ['oidcIssuer', externalOidcIssuer],\n ['allowedHosts', envValue('CSS_ALLOWED_HOSTS')],\n ['edgeNodeAgentEnabled', envValue('XPOD_EDGE_NODE_AGENT_ENABLED')],\n ['signalEndpoint', envValue('XPOD_SIGNAL_ENDPOINT')],\n ['nodeId', envValue('XPOD_NODE_ID')],\n ['nodeToken', envValue('XPOD_NODE_TOKEN')],\n ['p2pEnabled', envValue('XPOD_P2P_ENABLED')],\n ['p2pTargetBaseUrl', envValue('XPOD_P2P_TARGET_BASE_URL')],\n ['p2pLabel', envValue('XPOD_P2P_LABEL')],\n ['p2pAcceptIntervalMs', envValue('XPOD_P2P_ACCEPT_INTERVAL_MS')],\n ['p2pConnectTimeoutMs', envValue('XPOD_P2P_CONNECT_TIMEOUT_MS')],\n ['p2pWinnerSelectionWindowMs', envValue('XPOD_P2P_WINNER_SELECTION_WINDOW_MS')],\n ['acmeMode', envValue('XPOD_ACME_MODE')],\n ['acmeEmail', envValue('XPOD_ACME_EMAIL')],\n ['acmeDomains', envValue('XPOD_ACME_DOMAINS')],\n ['acmeDirectoryUrl', envValue('XPOD_ACME_DIRECTORY_URL')],\n ['acmeAccountKeyPath', envValue('XPOD_ACME_ACCOUNT_KEY_PATH')],\n ['acmeCertificateKeyPath', envValue('XPOD_ACME_CERTIFICATE_KEY_PATH')],\n ['acmeCertificatePath', envValue('XPOD_ACME_CERTIFICATE_PATH')],\n ['acmeFullChainPath', envValue('XPOD_ACME_FULL_CHAIN_PATH')],\n ['acmeRenewBeforeDays', envValue('XPOD_ACME_RENEW_BEFORE_DAYS')],\n ['acmePropagationDelayMs', envValue('XPOD_ACME_DNS_PROPAGATION_DELAY_MS')],\n ['acmePostDeployCommand', envValue('XPOD_ACME_POST_DEPLOY_COMMAND')],\n ['serviceToken', envValue('XPOD_SERVICE_TOKEN')],\n ['gatewayAdminProxyAuthSecret', envValue('XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET')],\n ]),\n baseUrl: state.baseUrl,\n rootFilePath: state.rootFilePath,\n sparqlEndpoint: state.sparqlEndpoint,\n rdfIndexPath: state.rdfIndexPath,\n identityDbUrl: state.identityDbUrl,\n usageDbUrl: state.usageDbUrl,\n logLevel: state.logLevel,\n authMode: state.cssAuthMode,\n edition: state.mode === 'cloud' ? 'server' : 'local',\n edgeNodesEnabled: options.edgeNodesEnabled ?? false,\n centerRegistrationEnabled: options.centerRegistrationEnabled ?? false,\n ...(options.shorthand ?? {}),\n };\n}\n\nexport function createCssRuntimeConfig(\n state: RuntimeBootstrapState,\n _open?: boolean,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'> = nodeRuntimePlatform,\n): string {\n const configPath = normalizeWindowsAbsolutePath(platform.joinPath(PACKAGE_ROOT, `config/${state.mode}.json`));\n const runtimeRoot = normalizeWindowsAbsolutePath(state.runtimeRoot);\n const runtimeConfigPath = arePathsOnDifferentWindowsDrives(runtimeRoot, configPath)\n ? (() => {\n const runtimeConfigDir = normalizeWindowsAbsolutePath(platform.joinPath(\n platform.dirname(configPath),\n '..',\n '.xpod-runtime',\n state.id,\n ));\n platform.ensureDir(runtimeConfigDir);\n return normalizeWindowsAbsolutePath(platform.joinPath(runtimeConfigDir, 'css-runtime.config.json'));\n })()\n : normalizeWindowsAbsolutePath(platform.joinPath(runtimeRoot, 'css-runtime.config.json'));\n const runtimeConfigDir = platform.dirname(runtimeConfigPath);\n const runtimeConfigImportPath = rewriteConfigForFileUrlImportsIfNeeded(\n configPath,\n platform.joinPath(runtimeConfigDir, 'config'),\n platform,\n );\n platform.writeTextFile(runtimeConfigPath, JSON.stringify({\n '@context': [\n CSS_COMPONENTS_CONTEXT,\n XPOD_COMPONENTS_CONTEXT,\n ASYNC_HANDLERS_CONTEXT,\n ],\n import: [\n toConfigImportSpecifier(runtimeConfigPath, runtimeConfigImportPath),\n ...cssAuthModeConfigImports(state.cssAuthMode),\n ],\n }, null, 2));\n\n return runtimeConfigPath;\n}\n\nfunction rewriteConfigForFileUrlImportsIfNeeded(\n configPath: string,\n outputDir: string,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'>,\n rewritten = new Map<string, string>(),\n): string {\n const normalizedConfigPath = normalizeWindowsAbsolutePath(configPath);\n const componentContext = readPackageComponentContext(normalizedConfigPath, platform);\n if (\n isWindowsAbsolutePath(normalizedConfigPath) ||\n (!pathNeedsEscapedFileUrl(normalizedConfigPath) && !componentContext)\n ) {\n return normalizedConfigPath;\n }\n\n const existing = rewritten.get(normalizedConfigPath);\n if (existing) {\n return existing;\n }\n\n platform.ensureDir(outputDir);\n const outputPath = normalizeWindowsAbsolutePath(platform.joinPath(outputDir, path.posix.basename(normalizedConfigPath)));\n rewritten.set(normalizedConfigPath, outputPath);\n\n const parsed = JSON.parse(platform.readTextFile(normalizedConfigPath)) as Record<string, unknown>;\n preserveConfigBase(parsed, normalizedConfigPath);\n normalizeComponentParameterKeys(parsed, componentContext);\n rewriteConfigAssetPaths(parsed, normalizedConfigPath, resolveConfigAssetPath);\n parsed.import = rewriteConfigImports(\n normalizedConfigPath,\n parsed.import,\n outputDir,\n platform,\n rewritten,\n );\n platform.writeTextFile(outputPath, `${JSON.stringify(parsed, null, 2)}\\n`);\n return outputPath;\n}\n\nfunction readPackageComponentContext(\n configPath: string,\n platform: Pick<RuntimePlatform, 'readTextFile'>,\n): ReturnType<typeof extractComponentParameterContext> {\n const normalizedConfigPath = normalizeWindowsAbsolutePath(configPath);\n const useWindowsPaths = isWindowsAbsolutePath(normalizedConfigPath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const contextPath = normalizeWindowsAbsolutePath(pathApi.join(\n resolveConfigAssetBase(normalizedConfigPath),\n 'dist',\n 'components',\n 'context.jsonld',\n ));\n try {\n return extractComponentParameterContext(JSON.parse(platform.readTextFile(contextPath)));\n } catch {\n return undefined;\n }\n}\n\nfunction resolveConfigAssetPath(sourceConfigPath: string, assetPath: string): string {\n const normalizedSourcePath = normalizeWindowsAbsolutePath(sourceConfigPath);\n const useWindowsPaths = isWindowsAbsolutePath(normalizedSourcePath);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n return normalizeWindowsAbsolutePath(pathApi.resolve(resolveConfigAssetBase(normalizedSourcePath), assetPath));\n}\n\nfunction resolveConfigAssetBase(sourceConfigPath: string): string {\n const normalized = normalizeWindowsAbsolutePath(sourceConfigPath);\n const useWindowsPaths = isWindowsAbsolutePath(normalized);\n const pathApi = useWindowsPaths ? path.win32 : path.posix;\n const normalizedForSearch = normalized.replace(/\\\\/g, '/');\n const markerIndex = normalizedForSearch.lastIndexOf('/config/');\n if (markerIndex >= 0) {\n const packageRoot = normalizedForSearch.slice(0, markerIndex);\n return useWindowsPaths ? packageRoot.replace(/\\//g, '\\\\') : packageRoot;\n }\n return pathApi.dirname(normalized);\n}\n\nfunction preserveConfigBase(parsed: Record<string, unknown>, configPath: string): void {\n const context = parsed['@context'];\n const contexts = Array.isArray(context)\n ? [...context]\n : context === undefined\n ? []\n : [context];\n const withoutExistingBase = contexts.filter((entry) => (\n !entry || typeof entry !== 'object' || !('@base' in entry)\n ));\n withoutExistingBase.push({ '@base': resolveConfigBase(configPath) });\n parsed['@context'] = withoutExistingBase;\n delete parsed['@base'];\n}\n\nfunction resolveConfigBase(configPath: string): string {\n const normalized = normalizeWindowsAbsolutePath(configPath).replace(/\\\\/g, '/');\n if (normalized.includes('/node_modules/@solid/community-server/config/')) {\n return CSS_CONFIG_BASE;\n }\n if (normalized.includes('/node_modules/@undefineds.co/xpod/config/')) {\n return XPOD_CONFIG_BASE;\n }\n return pathToFileURL(path.posix.dirname(normalized) + '/').href;\n}\n\nfunction rewriteConfigImports(\n sourceConfigPath: string,\n imports: unknown,\n outputDir: string,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'>,\n rewritten: Map<string, string>,\n): unknown {\n if (typeof imports === 'string') {\n return rewriteConfigImport(sourceConfigPath, imports, outputDir, platform, rewritten);\n }\n\n if (Array.isArray(imports)) {\n return imports.map((value) => typeof value === 'string'\n ? rewriteConfigImport(sourceConfigPath, value, outputDir, platform, rewritten)\n : value);\n }\n\n return imports;\n}\n\nfunction rewriteConfigImport(\n sourceConfigPath: string,\n importValue: string,\n outputDir: string,\n platform: Pick<RuntimePlatform, 'dirname' | 'ensureDir' | 'joinPath' | 'readTextFile' | 'writeTextFile'>,\n rewritten: Map<string, string>,\n): string {\n if (!importValue.startsWith('./') && !importValue.startsWith('../')) {\n return importValue;\n }\n\n const targetPath = normalizeWindowsAbsolutePath(\n path.posix.resolve(platform.dirname(sourceConfigPath), importValue),\n );\n const rewrittenTargetPath = rewriteConfigForFileUrlImportsIfNeeded(targetPath, outputDir, platform, rewritten);\n return pathToFileURL(rewrittenTargetPath).href;\n}\n\nexport function initRuntimeLogger(\n level: string,\n platform: Pick<RuntimePlatform, 'cwd' | 'joinPath'> = nodeRuntimePlatform,\n): void {\n const loggerFactory = new ConfigurableLoggerFactory(level, {\n fileName: platform.joinPath(platform.cwd(), 'logs/xpod-%DATE%.log'),\n showLocation: true,\n });\n setGlobalLoggerFactory(loggerFactory);\n}\n"]}
@@ -6,7 +6,7 @@ import type { AuthMode } from '../authorization/AuthMode';
6
6
  * The legacy CSS child process path injects it through a generated
7
7
  * Components.js config instead of CSS_* env aliases.
8
8
  */
9
- export declare function buildCssChildEnv(baseUrl: string, cssPort: number, oidcIssuer?: string, authModeInput?: AuthMode | string, baseEnv?: NodeJS.ProcessEnv): Record<string, string>;
9
+ export declare function buildCssChildEnv(baseUrl: string, cssPort: number, oidcIssuer?: string, authModeInput?: AuthMode | string, baseEnv?: NodeJS.ProcessEnv, gatewayAdminProxyAuthSecret?: string): Record<string, string>;
10
10
  export declare function createCssChildRuntimeConfig(options: {
11
11
  configPath: string;
12
12
  runtimeRoot: string;
@@ -27,12 +27,15 @@ const ASYNC_HANDLERS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/n
27
27
  * The legacy CSS child process path injects it through a generated
28
28
  * Components.js config instead of CSS_* env aliases.
29
29
  */
30
- function buildCssChildEnv(baseUrl, cssPort, oidcIssuer, authModeInput, baseEnv = process.env) {
30
+ function buildCssChildEnv(baseUrl, cssPort, oidcIssuer, authModeInput, baseEnv = process.env, gatewayAdminProxyAuthSecret) {
31
31
  const authMode = (0, AuthMode_1.resolveAuthModeInput)(authModeInput, baseEnv);
32
32
  const env = {
33
33
  ...baseEnv,
34
34
  CSS_PORT: cssPort.toString(),
35
35
  CSS_BASE_URL: baseUrl,
36
+ ...((gatewayAdminProxyAuthSecret ?? baseEnv.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET)
37
+ ? { XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: gatewayAdminProxyAuthSecret ?? baseEnv.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET }
38
+ : {}),
36
39
  };
37
40
  (0, AuthMode_1.applyAuthModeEnv)(env, authMode);
38
41
  for (const key of Object.keys(env)) {
@@ -1 +1 @@
1
- {"version":3,"file":"css-process.js","sourceRoot":"","sources":["../../src/runtime/css-process.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { extractComponentParameterContext, normalizeComponentParameterKeys } from './component-parameter-keys';\nimport { rewriteConfigAssetPaths } from './config-asset-paths';\nimport { oidcTokenEndpoint } from './oidc-issuer';\nimport type { AuthMode } from '../authorization/AuthMode';\nimport { applyAuthModeEnv, isAuthModeEnvKey, resolveAuthModeInput } from '../authorization/AuthMode';\nimport { cssAuthModeConfigImports } from './bootstrap';\n\nconst CSS_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/config/';\nconst XPOD_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/config/';\nconst CSS_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld';\nconst XPOD_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld';\nconst ASYNC_HANDLERS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld';\n\n/**\n * Build the environment for the CSS child process.\n *\n * `oidcIssuer` is an xpod shorthand value, not a CSS CLI argument.\n * The legacy CSS child process path injects it through a generated\n * Components.js config instead of CSS_* env aliases.\n */\nexport function buildCssChildEnv(\n baseUrl: string,\n cssPort: number,\n oidcIssuer?: string,\n authModeInput?: AuthMode | string,\n baseEnv: NodeJS.ProcessEnv = process.env,\n): Record<string, string> {\n const authMode = resolveAuthModeInput(authModeInput, baseEnv);\n const env: Record<string, string> = {\n ...baseEnv,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n } as Record<string, string>;\n applyAuthModeEnv(env, authMode);\n\n for (const key of Object.keys(env)) {\n if (key === 'oidcIssuer' || (isExternalOidcPollutionKey(key) && !isAuthModeEnvKey(key))) {\n delete env[key];\n }\n }\n\n return env;\n}\n\nfunction isExternalOidcPollutionKey(key: string): boolean {\n const normalized = key.toUpperCase().replace(/[^A-Z0-9]/g, '');\n return normalized.includes('OIDCISSUER') ||\n normalized.includes('IDPURL') ||\n normalized.includes('IDPJWKSURL') ||\n normalized.includes('IDENTITYPROVIDERURL') ||\n normalized.includes('IDENTITYPROVIDERJWKSURL');\n}\n\nfunction toImportSpecifier(fromFilePath: string, toFilePath: string): string {\n if (pathNeedsEscapedFileUrl(fromFilePath) || pathNeedsEscapedFileUrl(toFilePath)) {\n return pathToFileURL(toFilePath).href;\n }\n\n const fromDirectory = path.dirname(fromFilePath);\n const relativePath = path.relative(fromDirectory, toFilePath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction pathNeedsEscapedFileUrl(filePath: string): boolean {\n return /\\s/.test(filePath);\n}\n\nexport function createCssChildRuntimeConfig(options: {\n configPath: string\n runtimeRoot: string\n authMode?: AuthMode | string\n externalOidcIssuer?: string\n baseEnv?: NodeJS.ProcessEnv\n}): { configPath: string; cwd?: string } {\n fs.mkdirSync(options.runtimeRoot, { recursive: true });\n const runtimeConfigPath = path.join(options.runtimeRoot, 'css-child-runtime.config.json');\n const configImportPath = rewriteConfigForFileUrlImportsIfNeeded(\n path.resolve(options.configPath),\n path.join(options.runtimeRoot, 'config'),\n Boolean(options.externalOidcIssuer),\n );\n const authMode = resolveAuthModeInput(options.authMode, options.baseEnv);\n\n fs.writeFileSync(runtimeConfigPath, JSON.stringify({\n '@context': [\n CSS_COMPONENTS_CONTEXT,\n XPOD_COMPONENTS_CONTEXT,\n ASYNC_HANDLERS_CONTEXT,\n ],\n import: [\n toImportSpecifier(runtimeConfigPath, configImportPath),\n ...cssAuthModeConfigImports(authMode),\n ],\n '@graph': [],\n }, null, 2), 'utf-8');\n\n if (options.externalOidcIssuer) {\n // CSS only reads package settings when the child cwd contains package.json.\n fs.writeFileSync(path.join(options.runtimeRoot, 'package.json'), JSON.stringify({\n private: true,\n name: 'xpod-css-runtime',\n }, null, 2), 'utf-8');\n fs.writeFileSync(path.join(options.runtimeRoot, '.community-solid-server.config.json'), JSON.stringify({\n oidcIssuer: options.externalOidcIssuer,\n }, null, 2), 'utf-8');\n }\n\n return {\n configPath: runtimeConfigPath,\n cwd: options.externalOidcIssuer ? options.runtimeRoot : undefined,\n };\n}\n\nfunction rewriteConfigForFileUrlImportsIfNeeded(\n configPath: string,\n outputDir: string,\n forceCopy = false,\n rewritten = new Map<string, string>(),\n): string {\n const componentContext = readPackageComponentContext(configPath);\n if (!forceCopy && !pathNeedsEscapedFileUrl(configPath) && !componentContext) {\n return configPath;\n }\n\n const existing = rewritten.get(configPath);\n if (existing) {\n return existing;\n }\n\n fs.mkdirSync(outputDir, { recursive: true });\n const outputPath = path.join(outputDir, path.basename(configPath));\n rewritten.set(configPath, outputPath);\n\n const parsed = JSON.parse(fs.readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n preserveConfigBase(parsed, configPath);\n normalizeComponentParameterKeys(parsed, componentContext);\n rewriteConfigAssetPaths(parsed, configPath, resolveConfigAssetPath);\n parsed.import = rewriteConfigImports(configPath, parsed.import, outputDir, rewritten);\n fs.writeFileSync(outputPath, `${JSON.stringify(parsed, null, 2)}\\n`, 'utf-8');\n\n return outputPath;\n}\n\nfunction readPackageComponentContext(configPath: string): ReturnType<typeof extractComponentParameterContext> {\n const contextPath = path.join(resolveConfigAssetBase(configPath), 'dist', 'components', 'context.jsonld');\n try {\n return extractComponentParameterContext(JSON.parse(fs.readFileSync(contextPath, 'utf-8')));\n } catch {\n return undefined;\n }\n}\n\nfunction resolveConfigAssetPath(sourceConfigPath: string, assetPath: string): string {\n return path.resolve(resolveConfigAssetBase(sourceConfigPath), assetPath);\n}\n\nfunction resolveConfigAssetBase(sourceConfigPath: string): string {\n const normalized = sourceConfigPath.replace(/\\\\/g, '/');\n const configMarker = '/config/';\n const markerIndex = normalized.lastIndexOf(configMarker);\n if (markerIndex >= 0) {\n return normalized.slice(0, markerIndex);\n }\n return path.dirname(sourceConfigPath);\n}\n\nfunction preserveConfigBase(parsed: Record<string, unknown>, configPath: string): void {\n const context = parsed['@context'];\n const contexts = Array.isArray(context)\n ? [...context]\n : context === undefined\n ? []\n : [context];\n const withoutExistingBase = contexts.filter((entry) => (\n !entry || typeof entry !== 'object' || !('@base' in entry)\n ));\n withoutExistingBase.push({ '@base': resolveConfigBase(configPath) });\n parsed['@context'] = withoutExistingBase;\n delete parsed['@base'];\n}\n\nfunction resolveConfigBase(configPath: string): string {\n const normalized = configPath.replace(/\\\\/g, '/');\n if (normalized.includes('/node_modules/@solid/community-server/config/')) {\n return CSS_CONFIG_BASE;\n }\n if (normalized.includes('/node_modules/@undefineds.co/xpod/config/')) {\n return XPOD_CONFIG_BASE;\n }\n return pathToFileURL(path.dirname(configPath) + path.sep).href;\n}\n\nfunction rewriteConfigImports(\n sourceConfigPath: string,\n imports: unknown,\n outputDir: string,\n rewritten: Map<string, string>,\n): unknown {\n if (typeof imports === 'string') {\n return rewriteConfigImport(sourceConfigPath, imports, outputDir, rewritten);\n }\n\n if (Array.isArray(imports)) {\n return imports.map((value) => typeof value === 'string'\n ? rewriteConfigImport(sourceConfigPath, value, outputDir, rewritten)\n : value);\n }\n\n return imports;\n}\n\nfunction rewriteConfigImport(\n sourceConfigPath: string,\n importValue: string,\n outputDir: string,\n rewritten: Map<string, string>,\n): string {\n if (!importValue.startsWith('./') && !importValue.startsWith('../')) {\n return importValue;\n }\n\n const targetPath = path.resolve(path.dirname(sourceConfigPath), importValue);\n const rewrittenTargetPath = rewriteConfigForFileUrlImportsIfNeeded(targetPath, outputDir, true, rewritten);\n return pathToFileURL(rewrittenTargetPath).href;\n}\n\nexport function buildCssArgs(options: {\n cssBinary: string\n configPath: string\n cssModuleRoot: string\n cssPort: number\n baseUrl: string\n externalOidcIssuer?: string\n}): string[] {\n return [\n options.cssBinary,\n '-c', options.configPath,\n '-m', options.cssModuleRoot,\n '-p', options.cssPort.toString(),\n '-b', options.baseUrl,\n ];\n}\n\nexport function buildApiChildEnv(options: {\n apiPort: number\n mainPort: number\n cssPort: number\n baseUrl: string\n rdfIndexPath?: string\n authMode?: AuthMode | string\n externalOidcIssuer?: string\n gatewayAdminProxyAuthSecret?: string\n baseEnv?: NodeJS.ProcessEnv\n}): Record<string, string> {\n const authMode = resolveAuthModeInput(options.authMode, options.baseEnv);\n const env = {\n ...(options.baseEnv ?? process.env),\n ...(options.externalOidcIssuer ? { oidcIssuer: options.externalOidcIssuer } : {}),\n API_PORT: options.apiPort.toString(),\n XPOD_MAIN_PORT: options.mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${options.cssPort}`,\n CSS_BASE_URL: options.baseUrl,\n ...(options.gatewayAdminProxyAuthSecret ? { XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: options.gatewayAdminProxyAuthSecret } : {}),\n ...(options.rdfIndexPath ? { CSS_RDF_INDEX_PATH: options.rdfIndexPath } : {}),\n CSS_TOKEN_ENDPOINT: options.externalOidcIssuer\n ? oidcTokenEndpoint(options.externalOidcIssuer)\n : `${options.baseUrl}.oidc/token`,\n } as Record<string, string>;\n\n return applyAuthModeEnv(env, authMode);\n}\n"]}
1
+ {"version":3,"file":"css-process.js","sourceRoot":"","sources":["../../src/runtime/css-process.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { extractComponentParameterContext, normalizeComponentParameterKeys } from './component-parameter-keys';\nimport { rewriteConfigAssetPaths } from './config-asset-paths';\nimport { oidcTokenEndpoint } from './oidc-issuer';\nimport type { AuthMode } from '../authorization/AuthMode';\nimport { applyAuthModeEnv, isAuthModeEnvKey, resolveAuthModeInput } from '../authorization/AuthMode';\nimport { cssAuthModeConfigImports } from './bootstrap';\n\nconst CSS_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/config/';\nconst XPOD_CONFIG_BASE = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/config/';\nconst CSS_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^8.0.0/components/context.jsonld';\nconst XPOD_COMPONENTS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/@undefineds.co/xpod/^0.0.0/components/context.jsonld';\nconst ASYNC_HANDLERS_CONTEXT = 'https://linkedsoftwaredependencies.org/bundles/npm/asynchronous-handlers/^1.0.0/components/context.jsonld';\n\n/**\n * Build the environment for the CSS child process.\n *\n * `oidcIssuer` is an xpod shorthand value, not a CSS CLI argument.\n * The legacy CSS child process path injects it through a generated\n * Components.js config instead of CSS_* env aliases.\n */\nexport function buildCssChildEnv(\n baseUrl: string,\n cssPort: number,\n oidcIssuer?: string,\n authModeInput?: AuthMode | string,\n baseEnv: NodeJS.ProcessEnv = process.env,\n gatewayAdminProxyAuthSecret?: string,\n): Record<string, string> {\n const authMode = resolveAuthModeInput(authModeInput, baseEnv);\n const env: Record<string, string> = {\n ...baseEnv,\n CSS_PORT: cssPort.toString(),\n CSS_BASE_URL: baseUrl,\n ...((gatewayAdminProxyAuthSecret ?? baseEnv.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET)\n ? { XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: gatewayAdminProxyAuthSecret ?? baseEnv.XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET }\n : {}),\n } as Record<string, string>;\n applyAuthModeEnv(env, authMode);\n\n for (const key of Object.keys(env)) {\n if (key === 'oidcIssuer' || (isExternalOidcPollutionKey(key) && !isAuthModeEnvKey(key))) {\n delete env[key];\n }\n }\n\n return env;\n}\n\nfunction isExternalOidcPollutionKey(key: string): boolean {\n const normalized = key.toUpperCase().replace(/[^A-Z0-9]/g, '');\n return normalized.includes('OIDCISSUER') ||\n normalized.includes('IDPURL') ||\n normalized.includes('IDPJWKSURL') ||\n normalized.includes('IDENTITYPROVIDERURL') ||\n normalized.includes('IDENTITYPROVIDERJWKSURL');\n}\n\nfunction toImportSpecifier(fromFilePath: string, toFilePath: string): string {\n if (pathNeedsEscapedFileUrl(fromFilePath) || pathNeedsEscapedFileUrl(toFilePath)) {\n return pathToFileURL(toFilePath).href;\n }\n\n const fromDirectory = path.dirname(fromFilePath);\n const relativePath = path.relative(fromDirectory, toFilePath).replace(/\\\\/g, '/');\n if (relativePath.startsWith('./') || relativePath.startsWith('../')) {\n return relativePath;\n }\n return `./${relativePath}`;\n}\n\nfunction pathNeedsEscapedFileUrl(filePath: string): boolean {\n return /\\s/.test(filePath);\n}\n\nexport function createCssChildRuntimeConfig(options: {\n configPath: string\n runtimeRoot: string\n authMode?: AuthMode | string\n externalOidcIssuer?: string\n baseEnv?: NodeJS.ProcessEnv\n}): { configPath: string; cwd?: string } {\n fs.mkdirSync(options.runtimeRoot, { recursive: true });\n const runtimeConfigPath = path.join(options.runtimeRoot, 'css-child-runtime.config.json');\n const configImportPath = rewriteConfigForFileUrlImportsIfNeeded(\n path.resolve(options.configPath),\n path.join(options.runtimeRoot, 'config'),\n Boolean(options.externalOidcIssuer),\n );\n const authMode = resolveAuthModeInput(options.authMode, options.baseEnv);\n\n fs.writeFileSync(runtimeConfigPath, JSON.stringify({\n '@context': [\n CSS_COMPONENTS_CONTEXT,\n XPOD_COMPONENTS_CONTEXT,\n ASYNC_HANDLERS_CONTEXT,\n ],\n import: [\n toImportSpecifier(runtimeConfigPath, configImportPath),\n ...cssAuthModeConfigImports(authMode),\n ],\n '@graph': [],\n }, null, 2), 'utf-8');\n\n if (options.externalOidcIssuer) {\n // CSS only reads package settings when the child cwd contains package.json.\n fs.writeFileSync(path.join(options.runtimeRoot, 'package.json'), JSON.stringify({\n private: true,\n name: 'xpod-css-runtime',\n }, null, 2), 'utf-8');\n fs.writeFileSync(path.join(options.runtimeRoot, '.community-solid-server.config.json'), JSON.stringify({\n oidcIssuer: options.externalOidcIssuer,\n }, null, 2), 'utf-8');\n }\n\n return {\n configPath: runtimeConfigPath,\n cwd: options.externalOidcIssuer ? options.runtimeRoot : undefined,\n };\n}\n\nfunction rewriteConfigForFileUrlImportsIfNeeded(\n configPath: string,\n outputDir: string,\n forceCopy = false,\n rewritten = new Map<string, string>(),\n): string {\n const componentContext = readPackageComponentContext(configPath);\n if (!forceCopy && !pathNeedsEscapedFileUrl(configPath) && !componentContext) {\n return configPath;\n }\n\n const existing = rewritten.get(configPath);\n if (existing) {\n return existing;\n }\n\n fs.mkdirSync(outputDir, { recursive: true });\n const outputPath = path.join(outputDir, path.basename(configPath));\n rewritten.set(configPath, outputPath);\n\n const parsed = JSON.parse(fs.readFileSync(configPath, 'utf-8')) as Record<string, unknown>;\n preserveConfigBase(parsed, configPath);\n normalizeComponentParameterKeys(parsed, componentContext);\n rewriteConfigAssetPaths(parsed, configPath, resolveConfigAssetPath);\n parsed.import = rewriteConfigImports(configPath, parsed.import, outputDir, rewritten);\n fs.writeFileSync(outputPath, `${JSON.stringify(parsed, null, 2)}\\n`, 'utf-8');\n\n return outputPath;\n}\n\nfunction readPackageComponentContext(configPath: string): ReturnType<typeof extractComponentParameterContext> {\n const contextPath = path.join(resolveConfigAssetBase(configPath), 'dist', 'components', 'context.jsonld');\n try {\n return extractComponentParameterContext(JSON.parse(fs.readFileSync(contextPath, 'utf-8')));\n } catch {\n return undefined;\n }\n}\n\nfunction resolveConfigAssetPath(sourceConfigPath: string, assetPath: string): string {\n return path.resolve(resolveConfigAssetBase(sourceConfigPath), assetPath);\n}\n\nfunction resolveConfigAssetBase(sourceConfigPath: string): string {\n const normalized = sourceConfigPath.replace(/\\\\/g, '/');\n const configMarker = '/config/';\n const markerIndex = normalized.lastIndexOf(configMarker);\n if (markerIndex >= 0) {\n return normalized.slice(0, markerIndex);\n }\n return path.dirname(sourceConfigPath);\n}\n\nfunction preserveConfigBase(parsed: Record<string, unknown>, configPath: string): void {\n const context = parsed['@context'];\n const contexts = Array.isArray(context)\n ? [...context]\n : context === undefined\n ? []\n : [context];\n const withoutExistingBase = contexts.filter((entry) => (\n !entry || typeof entry !== 'object' || !('@base' in entry)\n ));\n withoutExistingBase.push({ '@base': resolveConfigBase(configPath) });\n parsed['@context'] = withoutExistingBase;\n delete parsed['@base'];\n}\n\nfunction resolveConfigBase(configPath: string): string {\n const normalized = configPath.replace(/\\\\/g, '/');\n if (normalized.includes('/node_modules/@solid/community-server/config/')) {\n return CSS_CONFIG_BASE;\n }\n if (normalized.includes('/node_modules/@undefineds.co/xpod/config/')) {\n return XPOD_CONFIG_BASE;\n }\n return pathToFileURL(path.dirname(configPath) + path.sep).href;\n}\n\nfunction rewriteConfigImports(\n sourceConfigPath: string,\n imports: unknown,\n outputDir: string,\n rewritten: Map<string, string>,\n): unknown {\n if (typeof imports === 'string') {\n return rewriteConfigImport(sourceConfigPath, imports, outputDir, rewritten);\n }\n\n if (Array.isArray(imports)) {\n return imports.map((value) => typeof value === 'string'\n ? rewriteConfigImport(sourceConfigPath, value, outputDir, rewritten)\n : value);\n }\n\n return imports;\n}\n\nfunction rewriteConfigImport(\n sourceConfigPath: string,\n importValue: string,\n outputDir: string,\n rewritten: Map<string, string>,\n): string {\n if (!importValue.startsWith('./') && !importValue.startsWith('../')) {\n return importValue;\n }\n\n const targetPath = path.resolve(path.dirname(sourceConfigPath), importValue);\n const rewrittenTargetPath = rewriteConfigForFileUrlImportsIfNeeded(targetPath, outputDir, true, rewritten);\n return pathToFileURL(rewrittenTargetPath).href;\n}\n\nexport function buildCssArgs(options: {\n cssBinary: string\n configPath: string\n cssModuleRoot: string\n cssPort: number\n baseUrl: string\n externalOidcIssuer?: string\n}): string[] {\n return [\n options.cssBinary,\n '-c', options.configPath,\n '-m', options.cssModuleRoot,\n '-p', options.cssPort.toString(),\n '-b', options.baseUrl,\n ];\n}\n\nexport function buildApiChildEnv(options: {\n apiPort: number\n mainPort: number\n cssPort: number\n baseUrl: string\n rdfIndexPath?: string\n authMode?: AuthMode | string\n externalOidcIssuer?: string\n gatewayAdminProxyAuthSecret?: string\n baseEnv?: NodeJS.ProcessEnv\n}): Record<string, string> {\n const authMode = resolveAuthModeInput(options.authMode, options.baseEnv);\n const env = {\n ...(options.baseEnv ?? process.env),\n ...(options.externalOidcIssuer ? { oidcIssuer: options.externalOidcIssuer } : {}),\n API_PORT: options.apiPort.toString(),\n XPOD_MAIN_PORT: options.mainPort.toString(),\n CSS_INTERNAL_URL: `http://localhost:${options.cssPort}`,\n CSS_BASE_URL: options.baseUrl,\n ...(options.gatewayAdminProxyAuthSecret ? { XPOD_GATEWAY_ADMIN_PROXY_AUTH_SECRET: options.gatewayAdminProxyAuthSecret } : {}),\n ...(options.rdfIndexPath ? { CSS_RDF_INDEX_PATH: options.rdfIndexPath } : {}),\n CSS_TOKEN_ENDPOINT: options.externalOidcIssuer\n ? oidcTokenEndpoint(options.externalOidcIssuer)\n : `${options.baseUrl}.oidc/token`,\n } as Record<string, string>;\n\n return applyAuthModeEnv(env, authMode);\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import type { App } from '@solid/community-server';
2
+ import { type IModuleState } from 'componentsjs';
2
3
  import type { CssRuntimeRunner, CssRuntimeRunnerStartOptions } from '../types';
4
+ export declare function createPackageRootPreferredModuleState(packageRoot: string): Promise<IModuleState>;
3
5
  export declare class CommunitySolidServerCssRunner implements CssRuntimeRunner {
4
6
  readonly name = "community-solid-server";
5
7
  start(options: CssRuntimeRunnerStartOptions): Promise<App>;