@undefineds.co/xpod 0.3.70 → 0.3.71-rc.13

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 (172) hide show
  1. package/config/cloud.json +3 -0
  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 +36 -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/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.d.ts +5 -5
  109. package/node_modules/@undefineds.co/ai-connection/dist/AiClientConfigurationSection.js +7 -7
  110. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionMain.js +1 -1
  111. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.d.ts +3 -1
  112. package/node_modules/@undefineds.co/ai-connection/dist/AiConnectionPanel.js +74 -60
  113. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.d.ts +0 -21
  114. package/node_modules/@undefineds.co/ai-connection/dist/ai-connection-client.js +0 -41
  115. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.d.ts +1 -0
  116. package/node_modules/@undefineds.co/ai-connection/dist/client-config/base-adapter.js +7 -2
  117. package/node_modules/@undefineds.co/ai-connection/dist/client-config/codex.js +3 -3
  118. package/node_modules/@undefineds.co/ai-connection/dist/client-config/index.cjs +15 -9
  119. package/node_modules/@undefineds.co/ai-connection/dist/client-config/json-env-adapter.js +4 -4
  120. package/node_modules/@undefineds.co/ai-connection/dist/client-config/pi.js +3 -3
  121. package/node_modules/@undefineds.co/ai-connection/dist/client-config/types.d.ts +1 -1
  122. package/node_modules/@undefineds.co/ai-connection/dist/controller.d.ts +2 -1
  123. package/node_modules/@undefineds.co/ai-connection/dist/controller.js +1 -0
  124. package/node_modules/@undefineds.co/ai-connection/dist/service-access.js +0 -1
  125. package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +22 -1
  126. package/package.json +3 -3
  127. package/static/app/assets/main.js +7 -7
  128. package/static/dashboard/assets/NetworkPage-CXjiUMR1.js +2 -0
  129. package/static/dashboard/assets/{PaneListHeader-57nvMwH6.js → PaneListHeader-BSipfl0W.js} +1 -1
  130. package/static/dashboard/assets/PodPage-Bd3Xhmp-.js +2 -0
  131. package/static/dashboard/assets/ServicesPage-CI3jWZGe.js +1 -0
  132. package/static/dashboard/assets/{card-B9Zjf_2p.js → card-z5BV5hTo.js} +1 -1
  133. package/static/dashboard/assets/{dashboard-8C6o666W.js → dashboard-CSrqAv2L.js} +2 -2
  134. package/static/dashboard/assets/{database-DPh9wDY9.js → database-Ct5ZPe6L.js} +1 -1
  135. package/static/dashboard/assets/{external-link-VbMQvVMz.js → external-link-B7wD1hkm.js} +1 -1
  136. package/static/dashboard/assets/index-tOBaUnM1.js +44 -0
  137. package/static/dashboard/assets/{refresh-cw-BxVxNxNr.js → refresh-cw-CFDZPaE8.js} +1 -1
  138. package/static/dashboard/assets/{services-status-context-DKmJ7ISr.js → services-status-context-DN1Icg4A.js} +1 -1
  139. package/static/dashboard/dashboard.html +1 -1
  140. package/static/settings/assets/ModelsPage-03NPWzoX.js +1 -0
  141. package/static/settings/assets/{PaneListHeader-Bgaze006.js → PaneListHeader-DMD8OJef.js} +1 -1
  142. package/static/settings/assets/PodPage-DT4EMYhL.js +2 -0
  143. package/static/settings/assets/ServicesPage-CJ0ub6IH.js +1 -0
  144. package/static/settings/assets/SettingsPage-BkR7ZK18.js +41 -0
  145. package/static/settings/assets/{card-B_bXSIn-.js → card-Cjsia0_V.js} +1 -1
  146. package/static/settings/assets/{services-status-context-DiX-AbrP.js → services-status-context-CkuKmH5h.js} +1 -1
  147. package/static/settings/assets/{settings-B30oMfZq.js → settings-Cyyv6-SD.js} +2 -2
  148. package/static/settings/assets/{workspace-layout-Dv1Yn9Ci.js → workspace-layout-B47luv6r.js} +1 -1
  149. package/static/settings/settings.html +1 -1
  150. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.d.ts +0 -25
  151. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js +0 -91
  152. package/dist/api/ai-gateway/auth/ClientCredentialsInternalPodAccessTokenProvider.js.map +0 -1
  153. package/dist/api/ai-gateway/auth/GatewayApiKey.d.ts +0 -28
  154. package/dist/api/ai-gateway/auth/GatewayApiKey.js +0 -162
  155. package/dist/api/ai-gateway/auth/GatewayApiKey.js.map +0 -1
  156. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +0 -56
  157. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +0 -143
  158. package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js.map +0 -1
  159. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.d.ts +0 -26
  160. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js +0 -97
  161. package/dist/api/ai-gateway/auth/GatewayKeyLocatorCodec.js.map +0 -1
  162. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +0 -54
  163. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +0 -152
  164. package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js.map +0 -1
  165. package/static/dashboard/assets/NetworkPage-Brt79fuQ.js +0 -2
  166. package/static/dashboard/assets/PodPage-CM6do1vB.js +0 -2
  167. package/static/dashboard/assets/ServicesPage-BUNxGJRz.js +0 -1
  168. package/static/dashboard/assets/index-RfiFckzb.js +0 -51
  169. package/static/settings/assets/ModelsPage-D_IH7AH3.js +0 -1
  170. package/static/settings/assets/PodPage-Cy1VNObw.js +0 -2
  171. package/static/settings/assets/ServicesPage-BsFaxVWC.js +0 -1
  172. package/static/settings/assets/SettingsPage-UafNWE_p.js +0 -48
@@ -2,30 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerAiGatewayManagementRoutes = registerAiGatewayManagementRoutes;
4
4
  const readBoundedJsonBody_1 = require("../http/readBoundedJsonBody");
5
- const GatewayPrincipal_1 = require("../ai-gateway/auth/GatewayPrincipal");
6
- const GatewayApiKey_1 = require("../ai-gateway/auth/GatewayApiKey");
7
- const GatewayApiKeyAuthenticator_1 = require("../ai-gateway/auth/GatewayApiKeyAuthenticator");
8
5
  const AiConnectionServiceAccess_1 = require("../ai-gateway/service-access/AiConnectionServiceAccess");
9
6
  const AiClientConfigurationService_1 = require("../service/AiClientConfigurationService");
10
7
  function registerAiGatewayManagementRoutes(server, options) {
11
- const now = options.now ?? (() => new Date());
12
- const createKeyId = options.keyId ?? ((owner) => (options.repository.createKeyId?.(owner, options.deployment) ?? (0, GatewayApiKey_1.createGatewayKeyId)()));
13
8
  const jsonBodyLimitBytes = options.jsonBodyLimitBytes ?? 64 * 1024;
14
9
  server.get('/api/applets/service-access/ai-connection', async (request, response) => {
15
10
  if (!authorizeProviderConnect(request, response)) {
16
11
  return;
17
12
  }
18
- if (!options.servicePrincipal) {
19
- sendJson(response, 503, { error: 'AI Connection service identity is unavailable' });
20
- return;
21
- }
22
- const service = await options.servicePrincipal.getServicePrincipal();
23
13
  const descriptor = (0, AiConnectionServiceAccess_1.createAiConnectionServiceAccess)({
24
14
  ownerWebId: request.auth.webId,
25
- serviceWebId: service.webId,
15
+ serviceWebId: request.auth.webId,
26
16
  });
27
17
  const invocation = options.aiConnectionInvocationKeyIssuer
28
- ? await options.aiConnectionInvocationKeyIssuer.issue({ auth: request.auth })
18
+ ? await options.aiConnectionInvocationKeyIssuer.issueClientConfiguration({ auth: request.auth })
29
19
  : undefined;
30
20
  sendJson(response, 200, {
31
21
  ...descriptor,
@@ -33,88 +23,6 @@ function registerAiGatewayManagementRoutes(server, options) {
33
23
  ...(invocation ? { invocation } : {}),
34
24
  });
35
25
  });
36
- server.post('/api/ai/gateway/keys', async (request, response) => {
37
- if (!authorizeGatewayKeyManagement(request, response)) {
38
- return;
39
- }
40
- const bodyResult = await (0, readBoundedJsonBody_1.readBoundedJsonBody)(request, { limitBytes: jsonBodyLimitBytes });
41
- if (!bodyResult.ok) {
42
- sendJson(response, bodyResult.status, { error: bodyResult.error });
43
- return;
44
- }
45
- const body = bodyResult.value;
46
- if (!body || typeof body !== 'object' || Array.isArray(body)) {
47
- sendJson(response, 400, { error: 'Request body must be a JSON object' });
48
- return;
49
- }
50
- const payload = body;
51
- const owner = (0, GatewayPrincipal_1.ownerWebIdForGatewayKeyManagement)(request.auth, payload.owner);
52
- if (!owner) {
53
- sendJson(response, 400, { error: 'Gateway key owner WebID is required' });
54
- return;
55
- }
56
- const scopes = normalizeScopes(payload.scopes);
57
- if (!scopes) {
58
- sendJson(response, 400, { error: 'scopes must be a non-empty string array' });
59
- return;
60
- }
61
- const expiresAt = normalizeOptionalDate(payload.expiresAt);
62
- if (payload.expiresAt !== undefined && !expiresAt) {
63
- sendJson(response, 400, { error: 'expiresAt must be an ISO date string' });
64
- return;
65
- }
66
- const issued = await (0, GatewayApiKey_1.createGatewayApiKey)({
67
- deployment: options.deployment,
68
- keyId: createKeyId(owner),
69
- });
70
- const createdAt = now();
71
- const record = await options.repository.create({
72
- ...issued.record,
73
- owner,
74
- scopes,
75
- createdAt,
76
- expiresAt,
77
- name: normalizeOptionalString(payload.name),
78
- }, { auth: request.auth });
79
- sendJson(response, 201, {
80
- key: issued.plaintext,
81
- record: publicRecord(record),
82
- });
83
- });
84
- server.get('/api/ai/gateway/keys', async (request, response) => {
85
- if (!authorizeGatewayKeyManagement(request, response)) {
86
- return;
87
- }
88
- const owner = ownerForList(request);
89
- if (!owner) {
90
- sendJson(response, 400, { error: 'Gateway key owner WebID is required' });
91
- return;
92
- }
93
- const records = await options.repository.listByOwner(owner, { auth: request.auth });
94
- sendJson(response, 200, {
95
- data: records.map(publicRecord),
96
- });
97
- });
98
- server.delete('/api/ai/gateway/keys/:keyId', async (request, response, params) => {
99
- if (!authorizeGatewayKeyManagement(request, response)) {
100
- return;
101
- }
102
- const keyId = decodeURIComponent(params.keyId);
103
- const existing = await options.repository.findById(keyId);
104
- if (!existing) {
105
- sendJson(response, 404, { error: 'Gateway key not found' });
106
- return;
107
- }
108
- const owner = ownerForList(request);
109
- if (!owner || existing.owner !== owner) {
110
- sendJson(response, 403, { error: 'Cannot revoke a gateway key owned by another WebID' });
111
- return;
112
- }
113
- const revoked = await options.repository.revoke(keyId, now(), { auth: request.auth });
114
- sendJson(response, 200, {
115
- record: revoked ? publicRecord(revoked) : undefined,
116
- });
117
- });
118
26
  server.get('/api/ai/connections/providers', async (request, response) => {
119
27
  if (!authorizeProviderConnect(request, response)) {
120
28
  return;
@@ -294,6 +202,7 @@ function registerAiGatewayManagementRoutes(server, options) {
294
202
  provider: params.provider,
295
203
  credentialIri: normalizeOptionalString(url.searchParams.get('credentialIri')),
296
204
  refresh: false,
205
+ auth: request.auth,
297
206
  });
298
207
  sendJson(response, 200, result);
299
208
  }
@@ -320,6 +229,7 @@ function registerAiGatewayManagementRoutes(server, options) {
320
229
  provider: params.provider,
321
230
  credentialIri: normalizeOptionalString(body.credentialIri),
322
231
  refresh: true,
232
+ auth: request.auth,
323
233
  });
324
234
  sendJson(response, 200, result);
325
235
  }
@@ -328,13 +238,6 @@ function registerAiGatewayManagementRoutes(server, options) {
328
238
  }
329
239
  });
330
240
  }
331
- function authorizeGatewayKeyManagement(request, response) {
332
- return authorizeManagementCaller(request, response, {
333
- gatewayKeyPrincipalError: 'Gateway API keys cannot manage gateway keys',
334
- nonSolidPrincipalError: 'Insufficient permissions',
335
- allowServiceGatewayKeyManagement: true,
336
- });
337
- }
338
241
  function authorizeManagementCaller(request, response, options) {
339
242
  const auth = request.auth;
340
243
  if (!auth) {
@@ -342,13 +245,6 @@ function authorizeManagementCaller(request, response, options) {
342
245
  return false;
343
246
  }
344
247
  if (auth.type === 'solid' && auth.webId) {
345
- if ((0, GatewayPrincipal_1.isGatewayApiKeyPrincipal)(auth) && !(0, GatewayPrincipal_1.isInternalGatewayInvocationPrincipal)(auth)) {
346
- sendJson(response, 403, { error: options.gatewayKeyPrincipalError });
347
- return false;
348
- }
349
- return true;
350
- }
351
- if (options.allowServiceGatewayKeyManagement && (0, GatewayPrincipal_1.canManageGatewayKeys)(auth)) {
352
248
  return true;
353
249
  }
354
250
  sendJson(response, 403, { error: options.nonSolidPrincipalError });
@@ -367,13 +263,11 @@ function authorizeCurrentSolidManagement(request, response, options) {
367
263
  }
368
264
  function authorizeProviderConnect(request, response) {
369
265
  return authorizeCurrentSolidManagement(request, response, {
370
- gatewayKeyPrincipalError: 'Gateway API keys cannot manage provider Connect state',
371
266
  nonSolidPrincipalError: 'Provider Connect requires the current Solid identity',
372
267
  });
373
268
  }
374
269
  function authorizeProviderQuota(request, response) {
375
270
  return authorizeCurrentSolidManagement(request, response, {
376
- gatewayKeyPrincipalError: 'Gateway API keys cannot manage provider quota state',
377
271
  nonSolidPrincipalError: 'Provider quota requires the current Solid identity',
378
272
  });
379
273
  }
@@ -416,56 +310,12 @@ async function readJsonObject(request, response, limitBytes) {
416
310
  }
417
311
  return body;
418
312
  }
419
- function ownerForList(request) {
420
- if (request.auth?.type === 'solid') {
421
- return request.auth.webId;
422
- }
423
- const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);
424
- return url.searchParams.get('owner') ?? undefined;
425
- }
426
- function normalizeScopes(value) {
427
- if (value === undefined) {
428
- return [...GatewayApiKeyAuthenticator_1.DEFAULT_GATEWAY_API_KEY_SCOPES];
429
- }
430
- if (!Array.isArray(value) || value.length === 0) {
431
- return undefined;
432
- }
433
- const scopes = value
434
- .map((item) => typeof item === 'string' ? item.trim() : '')
435
- .filter(Boolean);
436
- if (scopes.length !== value.length) {
437
- return undefined;
438
- }
439
- return [...new Set(scopes)];
440
- }
441
- function normalizeOptionalDate(value) {
442
- if (value === undefined || value === null || value === '') {
443
- return undefined;
444
- }
445
- if (typeof value !== 'string') {
446
- return undefined;
447
- }
448
- const parsed = new Date(value);
449
- return Number.isNaN(parsed.getTime()) ? undefined : parsed;
450
- }
451
313
  function normalizeOptionalString(value) {
452
314
  return typeof value === 'string' && value.trim() ? value.trim() : undefined;
453
315
  }
454
316
  function stringBody(value) {
455
317
  return typeof value === 'string' ? value : '';
456
318
  }
457
- function publicRecord(record) {
458
- return {
459
- id: record.id,
460
- owner: record.owner,
461
- scopes: record.scopes,
462
- createdAt: record.createdAt.toISOString(),
463
- expiresAt: record.expiresAt?.toISOString(),
464
- lastUsedAt: record.lastUsedAt?.toISOString(),
465
- revokedAt: record.revokedAt?.toISOString(),
466
- name: record.name,
467
- };
468
- }
469
319
  function publicCredentialRecord(record) {
470
320
  return {
471
321
  id: record.id,
@@ -1 +1 @@
1
- {"version":3,"file":"AiGatewayManagementHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/AiGatewayManagementHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport type { ApiServer } from '../ApiServer';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\nimport { readBoundedJsonBody } from '../http/readBoundedJsonBody';\nimport {\n canManageGatewayKeys,\n isInternalGatewayInvocationPrincipal,\n isGatewayApiKeyPrincipal,\n ownerWebIdForGatewayKeyManagement,\n} from '../ai-gateway/auth/GatewayPrincipal';\nimport type { SolidAuthContext } from '../auth/AuthContext';\nimport {\n createGatewayApiKey,\n createGatewayKeyId,\n type GatewayDeployment,\n} from '../ai-gateway/auth/GatewayApiKey';\nimport type {\n GatewayAccessKeyRecord,\n GatewayAccessKeyRepository,\n} from '../ai-gateway/auth/GatewayApiKeyAuthenticator';\nimport { DEFAULT_GATEWAY_API_KEY_SCOPES } from '../ai-gateway/auth/GatewayApiKeyAuthenticator';\nimport type {\n CompleteApiKeyInput,\n ConnectBeginInput,\n ProviderConnectService,\n} from '../ai-gateway/connect';\nimport type { ProviderQuotaService } from '../ai-gateway/quota';\nimport { createAiConnectionServiceAccess } from '../ai-gateway/service-access/AiConnectionServiceAccess';\nimport type { AiConnectionInvocationKeyIssuer } from '../ai-gateway/auth/AiConnectionInvocationKeyIssuer';\nimport {\n type AiClientConfigurationCapabilityDescriptor,\n unavailableAiClientConfigurationCapability,\n} from '../service/AiClientConfigurationService';\n\nexport interface AiGatewayManagementHandlerOptions {\n repository: GatewayAccessKeyRepository;\n deployment: GatewayDeployment;\n connectService?: ProviderConnectService;\n quotaService?: ProviderQuotaService;\n servicePrincipal?: {\n getServicePrincipal(): Promise<{ webId: string }>;\n };\n aiClientConfiguration?: AiClientConfigurationCapabilityDescriptor;\n aiConnectionInvocationKeyIssuer?: Pick<AiConnectionInvocationKeyIssuer, 'issue'>;\n now?: () => Date;\n keyId?: (owner: string) => string;\n jsonBodyLimitBytes?: number;\n}\n\nexport function registerAiGatewayManagementRoutes(\n server: ApiServer,\n options: AiGatewayManagementHandlerOptions,\n): void {\n const now = options.now ?? (() => new Date());\n const createKeyId = options.keyId ?? ((owner: string) => (\n options.repository.createKeyId?.(owner, options.deployment) ?? createGatewayKeyId()\n ));\n const jsonBodyLimitBytes = options.jsonBodyLimitBytes ?? 64 * 1024;\n\n server.get('/api/applets/service-access/ai-connection', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n if (!options.servicePrincipal) {\n sendJson(response, 503, { error: 'AI Connection service identity is unavailable' });\n return;\n }\n const service = await options.servicePrincipal.getServicePrincipal();\n const descriptor = createAiConnectionServiceAccess({\n ownerWebId: request.auth.webId,\n serviceWebId: service.webId,\n });\n const invocation = options.aiConnectionInvocationKeyIssuer\n ? await options.aiConnectionInvocationKeyIssuer.issue({ auth: request.auth })\n : undefined;\n sendJson(response, 200, {\n ...descriptor,\n aiClientConfiguration: options.aiClientConfiguration ?? unavailableAiClientConfigurationCapability(),\n ...(invocation ? { invocation } : {}),\n });\n });\n\n server.post('/api/ai/gateway/keys', async (request, response) => {\n if (!authorizeGatewayKeyManagement(request, response)) {\n return;\n }\n\n const bodyResult = await readBoundedJsonBody(request, { limitBytes: jsonBodyLimitBytes });\n if (!bodyResult.ok) {\n sendJson(response, bodyResult.status, { error: bodyResult.error });\n return;\n }\n const body = bodyResult.value;\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n sendJson(response, 400, { error: 'Request body must be a JSON object' });\n return;\n }\n const payload = body as Record<string, unknown>;\n const owner = ownerWebIdForGatewayKeyManagement(request.auth!, payload.owner);\n if (!owner) {\n sendJson(response, 400, { error: 'Gateway key owner WebID is required' });\n return;\n }\n const scopes = normalizeScopes(payload.scopes);\n if (!scopes) {\n sendJson(response, 400, { error: 'scopes must be a non-empty string array' });\n return;\n }\n const expiresAt = normalizeOptionalDate(payload.expiresAt);\n if (payload.expiresAt !== undefined && !expiresAt) {\n sendJson(response, 400, { error: 'expiresAt must be an ISO date string' });\n return;\n }\n\n const issued = await createGatewayApiKey({\n deployment: options.deployment,\n keyId: createKeyId(owner),\n });\n const createdAt = now();\n const record = await options.repository.create({\n ...issued.record,\n owner,\n scopes,\n createdAt,\n expiresAt,\n name: normalizeOptionalString(payload.name),\n }, { auth: request.auth });\n\n sendJson(response, 201, {\n key: issued.plaintext,\n record: publicRecord(record),\n });\n });\n\n server.get('/api/ai/gateway/keys', async (request, response) => {\n if (!authorizeGatewayKeyManagement(request, response)) {\n return;\n }\n\n const owner = ownerForList(request);\n if (!owner) {\n sendJson(response, 400, { error: 'Gateway key owner WebID is required' });\n return;\n }\n const records = await options.repository.listByOwner(owner, { auth: request.auth });\n sendJson(response, 200, {\n data: records.map(publicRecord),\n });\n });\n\n server.delete('/api/ai/gateway/keys/:keyId', async (request, response, params) => {\n if (!authorizeGatewayKeyManagement(request, response)) {\n return;\n }\n\n const keyId = decodeURIComponent(params.keyId);\n const existing = await options.repository.findById(keyId);\n if (!existing) {\n sendJson(response, 404, { error: 'Gateway key not found' });\n return;\n }\n const owner = ownerForList(request);\n if (!owner || existing.owner !== owner) {\n sendJson(response, 403, { error: 'Cannot revoke a gateway key owned by another WebID' });\n return;\n }\n const revoked = await options.repository.revoke(keyId, now(), { auth: request.auth });\n sendJson(response, 200, {\n record: revoked ? publicRecord(revoked) : undefined,\n });\n });\n\n server.get('/api/ai/connections/providers', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const providers = await connectService.listProviders({\n webId: request.auth!.webId,\n deployment: options.deployment,\n auth: request.auth,\n });\n sendJson(response, 200, {\n data: publicConnectResult(providers),\n });\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/begin', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const mode = typeof body.mode === 'string' ? body.mode : undefined;\n if (mode !== 'browserAssistedApiKey' && mode !== 'deviceCodeOAuth' && mode !== 'connectUnsupported') {\n sendJson(response, 400, { error: 'mode must be a supported Connect mode' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.begin({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n requestedMode: mode,\n expectedCredentialVersion: typeof body.expectedCredentialVersion === 'number'\n ? body.expectedCredentialVersion\n : undefined,\n auth: request.auth,\n } satisfies ConnectBeginInput);\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/status/:attemptId', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.status({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: decodeURIComponent(params.attemptId),\n state: url.searchParams.get('state') ?? '',\n signature: url.searchParams.get('signature') ?? '',\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/complete-api-key', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const apiKey = normalizeOptionalString(body.apiKey);\n if (!apiKey) {\n sendJson(response, 400, { error: 'apiKey is required' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.completeApiKey({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n apiKey,\n accountLabel: normalizeOptionalString(body.accountLabel),\n auth: request.auth,\n } satisfies CompleteApiKeyInput);\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/poll', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.pollDevice({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/refresh', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.refresh({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.delete('/api/ai/gateway/providers/:provider/connect', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.disconnect({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/callback', async (_request, response) => {\n // This endpoint is intentionally public only for signed one-time OAuth callbacks.\n // Browser-assisted API key completion is never accepted here because API keys\n // must be submitted through the authenticated management API.\n sendJson(response, 405, {\n error: 'Public Connect callback is unsupported for current provider Connect modes',\n });\n }, { public: true });\n\n server.get('/api/ai/gateway/providers/:provider/quota/status', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(url.searchParams.get('credentialIri')),\n refresh: false,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n\n server.post('/api/ai/gateway/providers/:provider/quota/refresh', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(body.credentialIri),\n refresh: true,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n}\n\nfunction authorizeGatewayKeyManagement(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): boolean {\n return authorizeManagementCaller(request, response, {\n gatewayKeyPrincipalError: 'Gateway API keys cannot manage gateway keys',\n nonSolidPrincipalError: 'Insufficient permissions',\n allowServiceGatewayKeyManagement: true,\n });\n}\n\nfunction authorizeManagementCaller(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n gatewayKeyPrincipalError: string;\n nonSolidPrincipalError: string;\n allowServiceGatewayKeyManagement?: boolean;\n },\n): boolean {\n const auth = request.auth;\n if (!auth) {\n sendJson(response, 401, { error: 'Authentication required' });\n return false;\n }\n if (auth.type === 'solid' && auth.webId) {\n if (isGatewayApiKeyPrincipal(auth) && !isInternalGatewayInvocationPrincipal(auth)) {\n sendJson(response, 403, { error: options.gatewayKeyPrincipalError });\n return false;\n }\n return true;\n }\n if (options.allowServiceGatewayKeyManagement && canManageGatewayKeys(auth)) {\n return true;\n }\n sendJson(response, 403, { error: options.nonSolidPrincipalError });\n return false;\n}\n\nfunction authorizeCurrentSolidManagement(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n gatewayKeyPrincipalError: string;\n nonSolidPrincipalError: string;\n },\n): request is AuthenticatedRequest & { auth: SolidAuthContext } {\n if (!authorizeManagementCaller(request, response, options)) {\n return false;\n }\n const auth = request.auth;\n if (!auth || auth.type !== 'solid' || !auth.webId) {\n sendJson(response, 403, { error: 'Insufficient permissions' });\n return false;\n }\n return true;\n}\n\nfunction authorizeProviderConnect(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n gatewayKeyPrincipalError: 'Gateway API keys cannot manage provider Connect state',\n nonSolidPrincipalError: 'Provider Connect requires the current Solid identity',\n });\n}\n\nfunction authorizeProviderQuota(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n gatewayKeyPrincipalError: 'Gateway API keys cannot manage provider quota state',\n nonSolidPrincipalError: 'Provider quota requires the current Solid identity',\n });\n}\n\nfunction requireConnectService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderConnectService | undefined {\n if (!options.connectService) {\n sendJson(response, 503, { error: 'AI provider Connect service is not configured' });\n return undefined;\n }\n return options.connectService;\n}\n\nfunction requireQuotaService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderQuotaService | undefined {\n if (!options.quotaService) {\n sendJson(response, 503, { error: 'AI provider quota service is not configured' });\n return undefined;\n }\n return options.quotaService;\n}\n\nfunction sendQuotaError(response: ServerResponse, error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n if (message === 'quota_credential_not_found') {\n sendJson(response, 404, { error: 'Provider credential not found for current identity' });\n return;\n }\n if (message.startsWith('quota_adapter_not_found:')) {\n sendJson(response, 404, { error: 'Provider quota adapter not found' });\n return;\n }\n sendJson(response, 500, { error: 'Provider quota lookup failed' });\n}\n\nasync function readJsonObject(\n request: AuthenticatedRequest,\n response: ServerResponse,\n limitBytes: number,\n): Promise<Record<string, unknown> | undefined> {\n const bodyResult = await readBoundedJsonBody(request, { limitBytes });\n if (!bodyResult.ok) {\n sendJson(response, bodyResult.status, { error: bodyResult.error });\n return undefined;\n }\n const body = bodyResult.value;\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n sendJson(response, 400, { error: 'Request body must be a JSON object' });\n return undefined;\n }\n return body as Record<string, unknown>;\n}\n\nfunction ownerForList(request: AuthenticatedRequest): string | undefined {\n if (request.auth?.type === 'solid') {\n return request.auth.webId;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n return url.searchParams.get('owner') ?? undefined;\n}\n\nfunction normalizeScopes(value: unknown): string[] | undefined {\n if (value === undefined) {\n return [...DEFAULT_GATEWAY_API_KEY_SCOPES];\n }\n if (!Array.isArray(value) || value.length === 0) {\n return undefined;\n }\n const scopes = value\n .map((item) => typeof item === 'string' ? item.trim() : '')\n .filter(Boolean);\n if (scopes.length !== value.length) {\n return undefined;\n }\n return [...new Set(scopes)];\n}\n\nfunction normalizeOptionalDate(value: unknown): Date | undefined {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n if (typeof value !== 'string') {\n return undefined;\n }\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction stringBody(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction publicRecord(record: GatewayAccessKeyRecord): Record<string, unknown> {\n return {\n id: record.id,\n owner: record.owner,\n scopes: record.scopes,\n createdAt: record.createdAt.toISOString(),\n expiresAt: record.expiresAt?.toISOString(),\n lastUsedAt: record.lastUsedAt?.toISOString(),\n revokedAt: record.revokedAt?.toISOString(),\n name: record.name,\n };\n}\n\nfunction publicCredentialRecord(record: {\n id: string;\n credentialIri: string;\n webId: string;\n provider: string;\n deployment: string;\n authMode: string;\n status: string;\n accountLabel?: string;\n expiresAt?: Date;\n version?: number;\n reauthRequired?: boolean;\n metadata?: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n id: record.id,\n credentialIri: record.credentialIri,\n provider: record.provider,\n authMode: record.authMode,\n status: record.status,\n accountLabel: record.accountLabel,\n expiresAt: record.expiresAt?.toISOString(),\n version: record.version,\n reauthRequired: record.reauthRequired,\n };\n}\n\nfunction publicConnectResult(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(publicConnectResult);\n }\n if (!value || typeof value !== 'object' || value instanceof Date) {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => ![\n 'deployment',\n 'webId',\n 'encryptedSecret',\n 'metadata',\n ].includes(key))\n .map(([key, item]) => [key, publicConnectResult(item)]),\n );\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n"]}
1
+ {"version":3,"file":"AiGatewayManagementHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/AiGatewayManagementHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport type { ApiServer } from '../ApiServer';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\nimport { readBoundedJsonBody } from '../http/readBoundedJsonBody';\nimport type { SolidAuthContext } from '../auth/AuthContext';\nimport type { GatewayDeployment } from '../ai-gateway/auth/InvocationTokenCodec';\nimport type {\n CompleteApiKeyInput,\n ConnectBeginInput,\n ProviderConnectService,\n} from '../ai-gateway/connect';\nimport type { ProviderQuotaService } from '../ai-gateway/quota';\nimport { createAiConnectionServiceAccess } from '../ai-gateway/service-access/AiConnectionServiceAccess';\nimport type { AiConnectionInvocationKeyIssuer } from '../ai-gateway/auth/AiConnectionInvocationKeyIssuer';\nimport {\n type AiClientConfigurationCapabilityDescriptor,\n unavailableAiClientConfigurationCapability,\n} from '../service/AiClientConfigurationService';\n\nexport interface AiGatewayManagementHandlerOptions {\n deployment: GatewayDeployment;\n connectService?: ProviderConnectService;\n quotaService?: ProviderQuotaService;\n aiClientConfiguration?: AiClientConfigurationCapabilityDescriptor;\n aiConnectionInvocationKeyIssuer?: Pick<AiConnectionInvocationKeyIssuer, 'issueClientConfiguration'>;\n now?: () => Date;\n jsonBodyLimitBytes?: number;\n}\n\nexport function registerAiGatewayManagementRoutes(\n server: ApiServer,\n options: AiGatewayManagementHandlerOptions,\n): void {\n const jsonBodyLimitBytes = options.jsonBodyLimitBytes ?? 64 * 1024;\n\n server.get('/api/applets/service-access/ai-connection', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const descriptor = createAiConnectionServiceAccess({\n ownerWebId: request.auth.webId,\n serviceWebId: request.auth.webId,\n });\n const invocation = options.aiConnectionInvocationKeyIssuer\n ? await options.aiConnectionInvocationKeyIssuer.issueClientConfiguration({ auth: request.auth })\n : undefined;\n sendJson(response, 200, {\n ...descriptor,\n aiClientConfiguration: options.aiClientConfiguration ?? unavailableAiClientConfigurationCapability(),\n ...(invocation ? { invocation } : {}),\n });\n });\n\n server.get('/api/ai/connections/providers', async (request, response) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const providers = await connectService.listProviders({\n webId: request.auth!.webId,\n deployment: options.deployment,\n auth: request.auth,\n });\n sendJson(response, 200, {\n data: publicConnectResult(providers),\n });\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/begin', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const mode = typeof body.mode === 'string' ? body.mode : undefined;\n if (mode !== 'browserAssistedApiKey' && mode !== 'deviceCodeOAuth' && mode !== 'connectUnsupported') {\n sendJson(response, 400, { error: 'mode must be a supported Connect mode' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.begin({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n requestedMode: mode,\n expectedCredentialVersion: typeof body.expectedCredentialVersion === 'number'\n ? body.expectedCredentialVersion\n : undefined,\n auth: request.auth,\n } satisfies ConnectBeginInput);\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/status/:attemptId', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.status({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: decodeURIComponent(params.attemptId),\n state: url.searchParams.get('state') ?? '',\n signature: url.searchParams.get('signature') ?? '',\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/complete-api-key', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const apiKey = normalizeOptionalString(body.apiKey);\n if (!apiKey) {\n sendJson(response, 400, { error: 'apiKey is required' });\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.completeApiKey({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n apiKey,\n accountLabel: normalizeOptionalString(body.accountLabel),\n auth: request.auth,\n } satisfies CompleteApiKeyInput);\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/poll', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const result = await connectService.pollDevice({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n attemptId: stringBody(body.attemptId),\n state: stringBody(body.state),\n signature: stringBody(body.signature),\n auth: request.auth,\n });\n sendJson(response, 200, publicConnectResult(result));\n });\n\n server.post('/api/ai/gateway/providers/:provider/connect/refresh', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.refresh({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.delete('/api/ai/gateway/providers/:provider/connect', async (request, response, params) => {\n if (!authorizeProviderConnect(request, response)) {\n return;\n }\n const connectService = requireConnectService(options, response);\n if (!connectService) {\n return;\n }\n const record = await connectService.disconnect({\n webId: request.auth!.webId,\n deployment: options.deployment,\n provider: params.provider,\n auth: request.auth,\n });\n sendJson(response, 200, { record: record ? publicCredentialRecord(record) : undefined });\n });\n\n server.get('/api/ai/gateway/providers/:provider/connect/callback', async (_request, response) => {\n // This endpoint is intentionally public only for signed one-time OAuth callbacks.\n // Browser-assisted API key completion is never accepted here because API keys\n // must be submitted through the authenticated management API.\n sendJson(response, 405, {\n error: 'Public Connect callback is unsupported for current provider Connect modes',\n });\n }, { public: true });\n\n server.get('/api/ai/gateway/providers/:provider/quota/status', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n const url = new URL(request.url ?? '/', `http://${request.headers.host ?? 'localhost'}`);\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(url.searchParams.get('credentialIri')),\n refresh: false,\n auth: request.auth,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n\n server.post('/api/ai/gateway/providers/:provider/quota/refresh', async (request, response, params) => {\n if (!authorizeProviderQuota(request, response)) {\n return;\n }\n const body = await readJsonObject(request, response, jsonBodyLimitBytes);\n if (!body) {\n return;\n }\n const quotaService = requireQuotaService(options, response);\n if (!quotaService) {\n return;\n }\n try {\n const result = await quotaService.status({\n webId: request.auth.webId,\n deployment: options.deployment,\n provider: params.provider,\n credentialIri: normalizeOptionalString(body.credentialIri),\n refresh: true,\n auth: request.auth,\n });\n sendJson(response, 200, result);\n } catch (error) {\n sendQuotaError(response, error);\n }\n });\n}\n\nfunction authorizeManagementCaller(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n nonSolidPrincipalError: string;\n },\n): boolean {\n const auth = request.auth;\n if (!auth) {\n sendJson(response, 401, { error: 'Authentication required' });\n return false;\n }\n if (auth.type === 'solid' && auth.webId) {\n return true;\n }\n sendJson(response, 403, { error: options.nonSolidPrincipalError });\n return false;\n}\n\nfunction authorizeCurrentSolidManagement(\n request: AuthenticatedRequest,\n response: ServerResponse,\n options: {\n nonSolidPrincipalError: string;\n },\n): request is AuthenticatedRequest & { auth: SolidAuthContext } {\n if (!authorizeManagementCaller(request, response, options)) {\n return false;\n }\n const auth = request.auth;\n if (!auth || auth.type !== 'solid' || !auth.webId) {\n sendJson(response, 403, { error: 'Insufficient permissions' });\n return false;\n }\n return true;\n}\n\nfunction authorizeProviderConnect(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n nonSolidPrincipalError: 'Provider Connect requires the current Solid identity',\n });\n}\n\nfunction authorizeProviderQuota(\n request: AuthenticatedRequest,\n response: ServerResponse,\n): request is AuthenticatedRequest & { auth: Extract<NonNullable<AuthenticatedRequest['auth']>, { type: 'solid' }> } {\n return authorizeCurrentSolidManagement(request, response, {\n nonSolidPrincipalError: 'Provider quota requires the current Solid identity',\n });\n}\n\nfunction requireConnectService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderConnectService | undefined {\n if (!options.connectService) {\n sendJson(response, 503, { error: 'AI provider Connect service is not configured' });\n return undefined;\n }\n return options.connectService;\n}\n\nfunction requireQuotaService(\n options: AiGatewayManagementHandlerOptions,\n response: ServerResponse,\n): ProviderQuotaService | undefined {\n if (!options.quotaService) {\n sendJson(response, 503, { error: 'AI provider quota service is not configured' });\n return undefined;\n }\n return options.quotaService;\n}\n\nfunction sendQuotaError(response: ServerResponse, error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n if (message === 'quota_credential_not_found') {\n sendJson(response, 404, { error: 'Provider credential not found for current identity' });\n return;\n }\n if (message.startsWith('quota_adapter_not_found:')) {\n sendJson(response, 404, { error: 'Provider quota adapter not found' });\n return;\n }\n sendJson(response, 500, { error: 'Provider quota lookup failed' });\n}\n\nasync function readJsonObject(\n request: AuthenticatedRequest,\n response: ServerResponse,\n limitBytes: number,\n): Promise<Record<string, unknown> | undefined> {\n const bodyResult = await readBoundedJsonBody(request, { limitBytes });\n if (!bodyResult.ok) {\n sendJson(response, bodyResult.status, { error: bodyResult.error });\n return undefined;\n }\n const body = bodyResult.value;\n if (!body || typeof body !== 'object' || Array.isArray(body)) {\n sendJson(response, 400, { error: 'Request body must be a JSON object' });\n return undefined;\n }\n return body as Record<string, unknown>;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction stringBody(value: unknown): string {\n return typeof value === 'string' ? value : '';\n}\n\nfunction publicCredentialRecord(record: {\n id: string;\n credentialIri: string;\n webId: string;\n provider: string;\n deployment: string;\n authMode: string;\n status: string;\n accountLabel?: string;\n expiresAt?: Date;\n version?: number;\n reauthRequired?: boolean;\n metadata?: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n id: record.id,\n credentialIri: record.credentialIri,\n provider: record.provider,\n authMode: record.authMode,\n status: record.status,\n accountLabel: record.accountLabel,\n expiresAt: record.expiresAt?.toISOString(),\n version: record.version,\n reauthRequired: record.reauthRequired,\n };\n}\n\nfunction publicConnectResult(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(publicConnectResult);\n }\n if (!value || typeof value !== 'object' || value instanceof Date) {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([key]) => ![\n 'deployment',\n 'webId',\n 'encryptedSecret',\n 'metadata',\n ].includes(key))\n .map(([key, item]) => [key, publicConnectResult(item)]),\n );\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n"]}
@@ -301,9 +301,6 @@ function readAuthScopes(auth) {
301
301
  if (auth.type === 'service') {
302
302
  return auth.scopes;
303
303
  }
304
- if (auth.type === 'solid' && auth.viaGatewayApiKey === true) {
305
- return auth.scopes ?? [];
306
- }
307
304
  return [];
308
305
  }
309
306
  async function isDeploymentOwnerOrAdmin(auth, options) {
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkSettingsHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/NetworkSettingsHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport { networkInterfaces } from 'node:os';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ApiServer } from '../ApiServer';\nimport type { AuthContext } from '../auth/AuthContext';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\n\nexport interface NetworkSettingsStatus {\n endpoint: string;\n addresses: {\n local: string[];\n lan: string[];\n public: string[];\n };\n tls: CapabilityStatus & { expiresAt?: string };\n dns: CapabilityStatus;\n tunnel: CapabilityStatus;\n actions: {\n diagnose: true;\n renewCertificate: boolean;\n };\n}\n\nexport interface CapabilityStatus {\n supported: boolean;\n status: string;\n}\n\nexport type DiagnosticStatus = 'ok' | 'warning' | 'error' | 'unsupported';\n\nexport interface NetworkDiagnosticCheckResult {\n id: string;\n label: string;\n status: DiagnosticStatus;\n detail?: string;\n}\n\nexport interface NetworkDiagnosticCheck {\n id: string;\n label: string;\n run(): Promise<Omit<NetworkDiagnosticCheckResult, 'id' | 'label'> | DiagnosticStatus>;\n}\n\nexport interface NetworkCapabilityReader<T extends CapabilityStatus = CapabilityStatus> {\n read(): Promise<T>;\n}\n\nexport interface CertificateRenewer {\n renew(): Promise<CertificateRenewalResult | void>;\n isAvailable?(): boolean | Promise<boolean>;\n}\n\nexport interface CertificateRenewalResult {\n status: 'renewed' | 'unchanged';\n}\n\nexport interface NetworkSettingsAuthorizer {\n canRead(auth: AuthContext): boolean | Promise<boolean>;\n canWrite(auth: AuthContext): boolean | Promise<boolean>;\n}\n\nexport interface NetworkSettingsIdentityAuthorizerOptions {\n deployment: 'cloud' | 'local';\n accountRoleRepository?: {\n findByWebId(webId: string): Promise<{ roles?: string[] } | undefined>;\n };\n}\n\nexport interface CertificateCapability {\n tlsStatusReader?: NetworkCapabilityReader<NetworkSettingsStatus['tls']>;\n certificateRenewer?: CertificateRenewer;\n}\n\nexport interface NetworkPublicAddressReaderOptions {\n configuredUrls?: Array<string | undefined>;\n ddnsManager?: unknown;\n tunnelProvider?: unknown;\n}\n\nexport interface NetworkSettingsHandlerOptions {\n endpoint: string | (() => string | undefined);\n localAddresses?: () => string[];\n lanAddresses?: () => string[];\n publicAddresses?: () => string[];\n tlsStatusReader?: NetworkCapabilityReader<NetworkSettingsStatus['tls']>;\n dnsStatusReader?: NetworkCapabilityReader;\n tunnelStatusReader?: NetworkCapabilityReader;\n certificateRenewer?: CertificateRenewer;\n diagnostics?: NetworkDiagnosticCheck[];\n authorizer?: NetworkSettingsAuthorizer;\n logger?: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>;\n}\n\nexport function registerNetworkSettingsRoutes(server: ApiServer, options: NetworkSettingsHandlerOptions): void {\n const logger = options.logger ?? getLoggerFor('NetworkSettingsHandler');\n const authorizer = options.authorizer ?? createDeploymentNetworkSettingsAuthorizer();\n\n server.get('/api/network/settings/status', async (request, response) => {\n if (!await requireNetworkPermission(request, response, authorizer, 'read')) {\n return;\n }\n\n try {\n sendJson(response, 200, await readNetworkStatus(options, logger));\n } catch (error) {\n logger.error(`Failed to read network settings status: ${redactSecretText(error)}`);\n sendJson(response, 500, { error: 'Failed to read network settings status' });\n }\n });\n\n server.post('/api/network/settings/diagnose', async (request, response) => {\n if (!await requireNetworkPermission(request, response, authorizer, 'read')) {\n return;\n }\n\n try {\n const diagnostics = options.diagnostics ?? buildDefaultDiagnostics(options, logger);\n const checks = await Promise.all(diagnostics.map((check) => runDiagnostic(check, logger)));\n sendJson(response, 200, { checks });\n } catch (error) {\n logger.error(`Failed to run network diagnostics: ${redactSecretText(error)}`);\n sendJson(response, 500, { error: 'Failed to run network diagnostics' });\n }\n });\n\n if (options.certificateRenewer) {\n server.post('/api/network/settings/certificate/renew', async (request, response) => {\n if (!await requireNetworkPermission(request, response, authorizer, 'write')) {\n return;\n }\n\n try {\n if (!await isCertificateRenewalAvailable(options.certificateRenewer, logger)) {\n sendJson(response, 503, {\n error: 'Certificate renewal is unavailable',\n code: 'certificate_renewal_unavailable',\n });\n return;\n }\n const result = await options.certificateRenewer!.renew();\n sendJson(response, 200, { success: true, status: result?.status ?? 'renewed' });\n } catch (error) {\n logger.warn(`Failed to renew network certificate: ${redactSecretText(error)}`);\n const renewalError = normalizeRenewalError(error);\n sendJson(response, renewalError.statusCode, {\n error: renewalError.message,\n code: renewalError.code,\n });\n }\n });\n }\n}\n\nexport function createDeploymentNetworkSettingsAuthorizer(\n options?: NetworkSettingsIdentityAuthorizerOptions,\n): NetworkSettingsAuthorizer {\n return {\n canRead: async (auth) => hasDeploymentNetworkScope(auth, 'network:read')\n || hasDeploymentNetworkScope(auth, 'network:write')\n || await isDeploymentOwnerOrAdmin(auth, options),\n canWrite: async (auth) => hasDeploymentNetworkScope(auth, 'network:write')\n || await isDeploymentOwnerOrAdmin(auth, options),\n };\n}\n\nexport function createAddressReaders(input: {\n endpoint: string | (() => string | undefined);\n port?: number;\n publicUrls?: Array<string | undefined>;\n}): Pick<NetworkSettingsHandlerOptions, 'localAddresses' | 'lanAddresses' | 'publicAddresses'> {\n const endpoint = () => normalizeEndpoint(resolveValue(input.endpoint)) ?? '';\n return {\n localAddresses: () => uniqueUrls([\n endpoint(),\n input.port ? `http://127.0.0.1:${input.port}/` : undefined,\n ].filter((value): value is string => Boolean(value)).filter(isLoopbackEndpoint)),\n lanAddresses: () => {\n const port = input.port ?? readPort(endpoint());\n if (!port) return [];\n return readLanIpAddresses().map((host) => `http://${host}:${port}/`);\n },\n publicAddresses: () => uniqueUrls(input.publicUrls?.map(normalizeEndpoint).filter(Boolean) as string[] ?? []),\n };\n}\n\nexport function createDdnsStatusReader(ddnsManager: unknown): NetworkCapabilityReader | undefined {\n if (!hasFunction(ddnsManager, 'getStatus')) {\n return undefined;\n }\n return {\n read: async () => {\n const status = ddnsManager.getStatus() as {\n allocated?: boolean;\n mode?: string;\n tunnelProvider?: string;\n };\n if (!status.allocated) {\n return { supported: true, status: 'pending' };\n }\n return { supported: true, status: status.mode === 'unknown' ? 'allocated' : status.mode ?? 'allocated' };\n },\n };\n}\n\nexport function createDnsStatusReader(input: {\n ddnsManager?: unknown;\n dnsProvider?: unknown;\n dnsCoordinator?: unknown;\n}): NetworkCapabilityReader | undefined {\n const ddnsReader = createDdnsStatusReader(input.ddnsManager);\n if (ddnsReader) {\n return ddnsReader;\n }\n if (input.dnsProvider || input.dnsCoordinator) {\n return {\n read: async () => ({ supported: true, status: 'configured' }),\n };\n }\n return undefined;\n}\n\nexport function createTunnelStatusReader(tunnelProvider: unknown): NetworkCapabilityReader | undefined {\n if (!hasFunction(tunnelProvider, 'getStatus')) {\n return undefined;\n }\n return {\n read: async () => {\n const status = tunnelProvider.getStatus() as { running?: boolean; connected?: boolean; error?: string };\n if (status.connected) {\n return { supported: true, status: 'active' };\n }\n if (status.running) {\n return { supported: true, status: 'starting' };\n }\n if (status.error) {\n return { supported: true, status: 'error' };\n }\n return { supported: true, status: 'inactive' };\n },\n };\n}\n\nexport function createPublicAddressReader(options: NetworkPublicAddressReaderOptions): () => string[] {\n return () => uniqueUrls([\n ...(options.configuredUrls ?? []),\n readDdnsPublicUrl(options.ddnsManager),\n readTunnelEndpoint(options.tunnelProvider),\n readTunnelStatusEndpoint(options.tunnelProvider),\n ].map(normalizeEndpoint).filter(Boolean) as string[]);\n}\n\nexport function createCertificateCapability(...candidates: unknown[]): CertificateCapability | undefined {\n for (const candidate of candidates) {\n const tlsStatusReader = createCertificateStatusReader(candidate);\n const certificateRenewer = createCertificateRenewer(candidate);\n if (tlsStatusReader || certificateRenewer) {\n return {\n ...(tlsStatusReader ? { tlsStatusReader } : {}),\n ...(certificateRenewer ? { certificateRenewer } : {}),\n };\n }\n }\n return undefined;\n}\n\nasync function readNetworkStatus(\n options: NetworkSettingsHandlerOptions,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<NetworkSettingsStatus> {\n const [tls, dns, tunnel] = await Promise.all([\n safeReadCapability(options.tlsStatusReader, { supported: false, status: 'unsupported' }, 'TLS', logger),\n safeReadCapability(options.dnsStatusReader, { supported: false, status: 'unsupported' }, 'DNS', logger),\n safeReadCapability(options.tunnelStatusReader, { supported: false, status: 'unsupported' }, 'Tunnel', logger),\n ]);\n return {\n endpoint: normalizeEndpoint(resolveValue(options.endpoint)) ?? '',\n addresses: {\n local: safeAddressList(options.localAddresses, logger),\n lan: safeAddressList(options.lanAddresses, logger),\n public: safeAddressList(options.publicAddresses, logger),\n },\n tls,\n dns,\n tunnel,\n actions: {\n diagnose: true,\n renewCertificate: await isCertificateRenewalAvailable(options.certificateRenewer, logger),\n },\n };\n}\n\nasync function isCertificateRenewalAvailable(\n renewer: CertificateRenewer | undefined,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<boolean> {\n if (!renewer) {\n return false;\n }\n if (!renewer.isAvailable) {\n return true;\n }\n try {\n return Boolean(await renewer.isAvailable());\n } catch (error) {\n logger.warn(`Failed to read certificate renewal availability: ${redactSecretText(error)}`);\n return false;\n }\n}\n\nasync function safeReadCapability<T extends CapabilityStatus>(\n reader: NetworkCapabilityReader<T> | undefined,\n fallback: T,\n label: string,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<T> {\n if (!reader) {\n return fallback;\n }\n try {\n return await reader.read();\n } catch (error) {\n logger.warn(`Failed to read ${label} status: ${redactSecretText(error)}`);\n return { ...fallback, supported: true, status: 'error' };\n }\n}\n\nfunction safeAddressList(\n reader: (() => string[]) | undefined,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): string[] {\n if (!reader) return [];\n try {\n return uniqueUrls(reader().map(normalizeEndpoint).filter(Boolean) as string[]);\n } catch (error) {\n logger.warn(`Failed to read network addresses: ${redactSecretText(error)}`);\n return [];\n }\n}\n\nfunction buildDefaultDiagnostics(\n options: NetworkSettingsHandlerOptions,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): NetworkDiagnosticCheck[] {\n return [\n {\n id: 'endpoint',\n label: 'Endpoint',\n run: async () => {\n const endpoint = normalizeEndpoint(resolveValue(options.endpoint));\n return endpoint ? { status: 'ok', detail: endpoint } : { status: 'unsupported', detail: 'endpoint_unavailable' };\n },\n },\n {\n id: 'tls',\n label: 'TLS',\n run: async () => capabilityToDiagnostic(await safeReadCapability(\n options.tlsStatusReader,\n { supported: false, status: 'unsupported' },\n 'TLS',\n logger,\n )),\n },\n {\n id: 'dns',\n label: 'DNS',\n run: async () => capabilityToDiagnostic(await safeReadCapability(\n options.dnsStatusReader,\n { supported: false, status: 'unsupported' },\n 'DNS',\n logger,\n )),\n },\n {\n id: 'tunnel',\n label: 'Tunnel',\n run: async () => capabilityToDiagnostic(await safeReadCapability(\n options.tunnelStatusReader,\n { supported: false, status: 'unsupported' },\n 'Tunnel',\n logger,\n )),\n },\n ];\n}\n\nasync function runDiagnostic(\n check: NetworkDiagnosticCheck,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<NetworkDiagnosticCheckResult> {\n try {\n const result = await check.run();\n if (typeof result === 'string') {\n return { id: check.id, label: check.label, status: result };\n }\n return {\n id: check.id,\n label: check.label,\n status: result.status,\n ...(result.detail ? { detail: redactSecretText(result.detail) } : {}),\n };\n } catch (error) {\n logger.warn(`Network diagnostic ${check.id} failed: ${redactSecretText(error)}`);\n return { id: check.id, label: check.label, status: 'error', detail: redactSecretText(error) };\n }\n}\n\nfunction capabilityToDiagnostic(capability: CapabilityStatus): Omit<NetworkDiagnosticCheckResult, 'id' | 'label'> {\n if (!capability.supported) {\n return { status: 'unsupported', detail: capability.status };\n }\n if (capability.status === 'active' || capability.status === 'valid' || capability.status === 'synced' || capability.status === 'direct') {\n return { status: 'ok', detail: capability.status };\n }\n if (capability.status === 'error') {\n return { status: 'error', detail: capability.status };\n }\n return { status: 'warning', detail: capability.status };\n}\n\nasync function requireNetworkPermission(\n request: AuthenticatedRequest,\n response: ServerResponse,\n authorizer: NetworkSettingsAuthorizer,\n mode: 'read' | 'write',\n): Promise<boolean> {\n if (!request.auth) {\n sendJson(response, 401, { error: 'Authentication required' });\n return false;\n }\n const allowed = mode === 'read'\n ? await authorizer.canRead(request.auth)\n : await authorizer.canWrite(request.auth);\n if (!allowed) {\n sendJson(response, 403, { error: `Missing required permission: network:${mode}` });\n return false;\n }\n return true;\n}\n\nfunction hasDeploymentNetworkScope(auth: AuthContext, scope: 'network:read' | 'network:write'): boolean {\n const scopes = readAuthScopes(auth);\n if (scopes.includes(scope)) {\n return true;\n }\n return false;\n}\n\nfunction readAuthScopes(auth: AuthContext): string[] {\n if (auth.type === 'service') {\n return auth.scopes;\n }\n if (auth.type === 'solid' && auth.viaGatewayApiKey === true) {\n return auth.scopes ?? [];\n }\n return [];\n}\n\nasync function isDeploymentOwnerOrAdmin(\n auth: AuthContext,\n options: NetworkSettingsIdentityAuthorizerOptions | undefined,\n): Promise<boolean> {\n if (auth.type !== 'solid' || !options) {\n return false;\n }\n\n const roles = (await options.accountRoleRepository?.findByWebId(auth.webId))?.roles ?? [];\n return roles.includes('admin') || (options.deployment === 'local' && roles.includes('owner'));\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n\nfunction resolveValue(value: string | (() => string | undefined) | undefined): string | undefined {\n return typeof value === 'function' ? value() : value;\n}\n\nfunction normalizeEndpoint(value: string | undefined): string | undefined {\n if (!value?.trim()) return undefined;\n try {\n const url = new URL(value);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return undefined;\n return url.toString().replace(/\\/+$/u, '') + '/';\n } catch {\n return undefined;\n }\n}\n\nfunction uniqueUrls(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)));\n}\n\nfunction isLoopbackEndpoint(value: string): boolean {\n try {\n const host = new URL(value).hostname;\n return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';\n } catch {\n return false;\n }\n}\n\nfunction readPort(endpoint: string | undefined): number | undefined {\n if (!endpoint) return undefined;\n try {\n const url = new URL(endpoint);\n if (url.port) return Number.parseInt(url.port, 10);\n return url.protocol === 'https:' ? 443 : 80;\n } catch {\n return undefined;\n }\n}\n\nfunction readLanIpAddresses(): string[] {\n const result: string[] = [];\n for (const entries of Object.values(networkInterfaces())) {\n for (const entry of entries ?? []) {\n if (entry.family === 'IPv4' && !entry.internal) {\n result.push(entry.address);\n }\n }\n }\n return result;\n}\n\nfunction readDdnsPublicUrl(ddnsManager: unknown): string | undefined {\n if (!hasFunction(ddnsManager, 'getStatus')) {\n return undefined;\n }\n const status = ddnsManager.getStatus() as { allocated?: boolean; fqdn?: string; baseUrl?: string };\n if (status.baseUrl) {\n return status.baseUrl;\n }\n if (status.allocated && status.fqdn) {\n return `https://${status.fqdn}/`;\n }\n return undefined;\n}\n\nfunction readTunnelEndpoint(tunnelProvider: unknown): string | undefined {\n if (!hasFunction(tunnelProvider, 'getEndpoint')) {\n return undefined;\n }\n const endpoint = tunnelProvider.getEndpoint();\n return typeof endpoint === 'string' ? endpoint : undefined;\n}\n\nfunction readTunnelStatusEndpoint(tunnelProvider: unknown): string | undefined {\n if (!hasFunction(tunnelProvider, 'getStatus')) {\n return undefined;\n }\n const status = tunnelProvider.getStatus() as { endpoint?: string };\n return typeof status.endpoint === 'string' ? status.endpoint : undefined;\n}\n\nfunction createCertificateStatusReader(candidate: unknown): NetworkCapabilityReader<NetworkSettingsStatus['tls']> | undefined {\n const statusMethod = [\n 'readCertificateStatus',\n 'getCertificateStatus',\n 'readTlsStatus',\n 'getTlsStatus',\n ].find((method) => hasFunction(candidate, method));\n if (!statusMethod) {\n return undefined;\n }\n return {\n read: async () => normalizeCertificateStatus(\n await (candidate as Record<string, () => unknown>)[statusMethod](),\n ),\n };\n}\n\nfunction createCertificateRenewer(candidate: unknown): CertificateRenewer | undefined {\n const renewMethod = [\n 'renewCertificate',\n 'renew',\n 'ensureCertificate',\n ].find((method) => hasFunction(candidate, method));\n if (!renewMethod) {\n return undefined;\n }\n return {\n renew: async () => {\n return await (candidate as Record<string, () => unknown>)[renewMethod]() as CertificateRenewalResult | void;\n },\n ...(hasFunction(candidate, 'isAvailable') ? {\n isAvailable: async () => Boolean(await (candidate as Record<string, () => unknown>).isAvailable()),\n } : {}),\n };\n}\n\nfunction normalizeRenewalError(error: unknown): { statusCode: number; code: string; message: string } {\n if (error && typeof error === 'object') {\n const record = error as Record<string, unknown>;\n const statusCode = typeof record.statusCode === 'number' ? record.statusCode : undefined;\n const code = typeof record.code === 'string' ? record.code : undefined;\n const message = error instanceof Error ? error.message : undefined;\n if (statusCode && code) {\n return {\n statusCode,\n code,\n message: message ?? 'Certificate renewal failed',\n };\n }\n }\n return {\n statusCode: 500,\n code: 'certificate_renewal_failed',\n message: 'Failed to renew network certificate',\n };\n}\n\nfunction normalizeCertificateStatus(value: unknown): NetworkSettingsStatus['tls'] {\n if (typeof value === 'string') {\n return { supported: true, status: value };\n }\n if (!value || typeof value !== 'object') {\n return { supported: true, status: 'configured' };\n }\n const record = value as Record<string, unknown>;\n const nestedCertificate = record.certificate && typeof record.certificate === 'object'\n ? record.certificate as Record<string, unknown>\n : undefined;\n const status = typeof record.status === 'string' ? record.status : 'configured';\n const expiresAt = normalizeIsoDate(record.expiresAt ?? nestedCertificate?.expiresAt);\n return {\n supported: record.supported === false ? false : true,\n status,\n ...(expiresAt ? { expiresAt } : {}),\n };\n}\n\nfunction normalizeIsoDate(value: unknown): string | undefined {\n if (value instanceof Date && Number.isFinite(value.getTime())) {\n return value.toISOString();\n }\n if (typeof value === 'string') {\n const date = new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : value;\n }\n if (typeof value === 'number') {\n const date = new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : undefined;\n }\n return undefined;\n}\n\nfunction hasFunction<T extends string>(value: unknown, key: T): value is Record<T, (...args: never[]) => unknown> {\n return Boolean(value && typeof value === 'object' && typeof (value as Record<T, unknown>)[key] === 'function');\n}\n\nexport function redactSecretText(value: unknown): string {\n const raw = value instanceof Error ? value.message : String(value);\n const containsSensitiveValue = [\n /\\b(?:authorization|proxy-authorization)\\s*[:=]\\s*(?:bearer|dpop|basic)?\\s*[^,\\s;]+/iu,\n /\\bdpop\\s*[:=]\\s*[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)?/iu,\n /\\b(?:bearer|dpop)\\s+[A-Za-z0-9._~+/=-]{8,}/iu,\n /\\b(?:cookie|set-cookie)\\s*[:=]\\s*[^,\\n]+/iu,\n /\\b(?:token|secret|password|passwd|api[_-]?key|authorization|credential|clientSecret|client_secret)\\s*[=:]\\s*[^,\\s;]+/iu,\n /(?:[?#&]|\\b)(?:access_token|refresh_token|id_token|token_type)\\s*=\\s*[^&#\\s;,]+/iu,\n /[?&]code=[^&#\\s]+/iu,\n /\\b(?:oauth|oidc|auth(?:orization)?|callback)\\b[^,\\n]*\\bcode\\s*[=:]\\s*[^,\\s;&]+/iu,\n /\\bcode\\s*[=:]\\s*[^,\\s;&]+[^,\\n]*\\b(?:oauth|oidc|auth(?:orization)?|callback)\\b/iu,\n /\\bxpod_(?:gw|inv)_[A-Za-z0-9._-]+/iu,\n /-----BEGIN [A-Z ]*PRIVATE KEY-----/u,\n /\"d\"\\s*:\\s*\"[^\"]{8,}\"/u,\n /\\b(?:postgres|postgresql|mysql|redis|mongodb|sqlite):\\/\\/[^,\\s]+/iu,\n /\\bfile:\\/\\/\\/[^\\s,;]+/iu,\n /(?:^|\\s)\\/(?:Users|home|var|tmp|private|etc)\\/[^\\s,;]+/iu,\n /\\b[A-Za-z]:[\\\\/][^\\s,;]+/u,\n /\\\\\\\\[^\\\\\\s,;]+\\\\[^\\\\\\s,;]+\\\\[^\\s,;]+/u,\n ].some((pattern) => pattern.test(raw));\n return containsSensitiveValue ? '[redacted]' : raw;\n}\n"]}
1
+ {"version":3,"file":"NetworkSettingsHandler.js","sourceRoot":"","sources":["../../../src/api/handlers/NetworkSettingsHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ServerResponse } from 'node:http';\nimport { networkInterfaces } from 'node:os';\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ApiServer } from '../ApiServer';\nimport type { AuthContext } from '../auth/AuthContext';\nimport type { AuthenticatedRequest } from '../middleware/AuthMiddleware';\n\nexport interface NetworkSettingsStatus {\n endpoint: string;\n addresses: {\n local: string[];\n lan: string[];\n public: string[];\n };\n tls: CapabilityStatus & { expiresAt?: string };\n dns: CapabilityStatus;\n tunnel: CapabilityStatus;\n actions: {\n diagnose: true;\n renewCertificate: boolean;\n };\n}\n\nexport interface CapabilityStatus {\n supported: boolean;\n status: string;\n}\n\nexport type DiagnosticStatus = 'ok' | 'warning' | 'error' | 'unsupported';\n\nexport interface NetworkDiagnosticCheckResult {\n id: string;\n label: string;\n status: DiagnosticStatus;\n detail?: string;\n}\n\nexport interface NetworkDiagnosticCheck {\n id: string;\n label: string;\n run(): Promise<Omit<NetworkDiagnosticCheckResult, 'id' | 'label'> | DiagnosticStatus>;\n}\n\nexport interface NetworkCapabilityReader<T extends CapabilityStatus = CapabilityStatus> {\n read(): Promise<T>;\n}\n\nexport interface CertificateRenewer {\n renew(): Promise<CertificateRenewalResult | void>;\n isAvailable?(): boolean | Promise<boolean>;\n}\n\nexport interface CertificateRenewalResult {\n status: 'renewed' | 'unchanged';\n}\n\nexport interface NetworkSettingsAuthorizer {\n canRead(auth: AuthContext): boolean | Promise<boolean>;\n canWrite(auth: AuthContext): boolean | Promise<boolean>;\n}\n\nexport interface NetworkSettingsIdentityAuthorizerOptions {\n deployment: 'cloud' | 'local';\n accountRoleRepository?: {\n findByWebId(webId: string): Promise<{ roles?: string[] } | undefined>;\n };\n}\n\nexport interface CertificateCapability {\n tlsStatusReader?: NetworkCapabilityReader<NetworkSettingsStatus['tls']>;\n certificateRenewer?: CertificateRenewer;\n}\n\nexport interface NetworkPublicAddressReaderOptions {\n configuredUrls?: Array<string | undefined>;\n ddnsManager?: unknown;\n tunnelProvider?: unknown;\n}\n\nexport interface NetworkSettingsHandlerOptions {\n endpoint: string | (() => string | undefined);\n localAddresses?: () => string[];\n lanAddresses?: () => string[];\n publicAddresses?: () => string[];\n tlsStatusReader?: NetworkCapabilityReader<NetworkSettingsStatus['tls']>;\n dnsStatusReader?: NetworkCapabilityReader;\n tunnelStatusReader?: NetworkCapabilityReader;\n certificateRenewer?: CertificateRenewer;\n diagnostics?: NetworkDiagnosticCheck[];\n authorizer?: NetworkSettingsAuthorizer;\n logger?: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>;\n}\n\nexport function registerNetworkSettingsRoutes(server: ApiServer, options: NetworkSettingsHandlerOptions): void {\n const logger = options.logger ?? getLoggerFor('NetworkSettingsHandler');\n const authorizer = options.authorizer ?? createDeploymentNetworkSettingsAuthorizer();\n\n server.get('/api/network/settings/status', async (request, response) => {\n if (!await requireNetworkPermission(request, response, authorizer, 'read')) {\n return;\n }\n\n try {\n sendJson(response, 200, await readNetworkStatus(options, logger));\n } catch (error) {\n logger.error(`Failed to read network settings status: ${redactSecretText(error)}`);\n sendJson(response, 500, { error: 'Failed to read network settings status' });\n }\n });\n\n server.post('/api/network/settings/diagnose', async (request, response) => {\n if (!await requireNetworkPermission(request, response, authorizer, 'read')) {\n return;\n }\n\n try {\n const diagnostics = options.diagnostics ?? buildDefaultDiagnostics(options, logger);\n const checks = await Promise.all(diagnostics.map((check) => runDiagnostic(check, logger)));\n sendJson(response, 200, { checks });\n } catch (error) {\n logger.error(`Failed to run network diagnostics: ${redactSecretText(error)}`);\n sendJson(response, 500, { error: 'Failed to run network diagnostics' });\n }\n });\n\n if (options.certificateRenewer) {\n server.post('/api/network/settings/certificate/renew', async (request, response) => {\n if (!await requireNetworkPermission(request, response, authorizer, 'write')) {\n return;\n }\n\n try {\n if (!await isCertificateRenewalAvailable(options.certificateRenewer, logger)) {\n sendJson(response, 503, {\n error: 'Certificate renewal is unavailable',\n code: 'certificate_renewal_unavailable',\n });\n return;\n }\n const result = await options.certificateRenewer!.renew();\n sendJson(response, 200, { success: true, status: result?.status ?? 'renewed' });\n } catch (error) {\n logger.warn(`Failed to renew network certificate: ${redactSecretText(error)}`);\n const renewalError = normalizeRenewalError(error);\n sendJson(response, renewalError.statusCode, {\n error: renewalError.message,\n code: renewalError.code,\n });\n }\n });\n }\n}\n\nexport function createDeploymentNetworkSettingsAuthorizer(\n options?: NetworkSettingsIdentityAuthorizerOptions,\n): NetworkSettingsAuthorizer {\n return {\n canRead: async (auth) => hasDeploymentNetworkScope(auth, 'network:read')\n || hasDeploymentNetworkScope(auth, 'network:write')\n || await isDeploymentOwnerOrAdmin(auth, options),\n canWrite: async (auth) => hasDeploymentNetworkScope(auth, 'network:write')\n || await isDeploymentOwnerOrAdmin(auth, options),\n };\n}\n\nexport function createAddressReaders(input: {\n endpoint: string | (() => string | undefined);\n port?: number;\n publicUrls?: Array<string | undefined>;\n}): Pick<NetworkSettingsHandlerOptions, 'localAddresses' | 'lanAddresses' | 'publicAddresses'> {\n const endpoint = () => normalizeEndpoint(resolveValue(input.endpoint)) ?? '';\n return {\n localAddresses: () => uniqueUrls([\n endpoint(),\n input.port ? `http://127.0.0.1:${input.port}/` : undefined,\n ].filter((value): value is string => Boolean(value)).filter(isLoopbackEndpoint)),\n lanAddresses: () => {\n const port = input.port ?? readPort(endpoint());\n if (!port) return [];\n return readLanIpAddresses().map((host) => `http://${host}:${port}/`);\n },\n publicAddresses: () => uniqueUrls(input.publicUrls?.map(normalizeEndpoint).filter(Boolean) as string[] ?? []),\n };\n}\n\nexport function createDdnsStatusReader(ddnsManager: unknown): NetworkCapabilityReader | undefined {\n if (!hasFunction(ddnsManager, 'getStatus')) {\n return undefined;\n }\n return {\n read: async () => {\n const status = ddnsManager.getStatus() as {\n allocated?: boolean;\n mode?: string;\n tunnelProvider?: string;\n };\n if (!status.allocated) {\n return { supported: true, status: 'pending' };\n }\n return { supported: true, status: status.mode === 'unknown' ? 'allocated' : status.mode ?? 'allocated' };\n },\n };\n}\n\nexport function createDnsStatusReader(input: {\n ddnsManager?: unknown;\n dnsProvider?: unknown;\n dnsCoordinator?: unknown;\n}): NetworkCapabilityReader | undefined {\n const ddnsReader = createDdnsStatusReader(input.ddnsManager);\n if (ddnsReader) {\n return ddnsReader;\n }\n if (input.dnsProvider || input.dnsCoordinator) {\n return {\n read: async () => ({ supported: true, status: 'configured' }),\n };\n }\n return undefined;\n}\n\nexport function createTunnelStatusReader(tunnelProvider: unknown): NetworkCapabilityReader | undefined {\n if (!hasFunction(tunnelProvider, 'getStatus')) {\n return undefined;\n }\n return {\n read: async () => {\n const status = tunnelProvider.getStatus() as { running?: boolean; connected?: boolean; error?: string };\n if (status.connected) {\n return { supported: true, status: 'active' };\n }\n if (status.running) {\n return { supported: true, status: 'starting' };\n }\n if (status.error) {\n return { supported: true, status: 'error' };\n }\n return { supported: true, status: 'inactive' };\n },\n };\n}\n\nexport function createPublicAddressReader(options: NetworkPublicAddressReaderOptions): () => string[] {\n return () => uniqueUrls([\n ...(options.configuredUrls ?? []),\n readDdnsPublicUrl(options.ddnsManager),\n readTunnelEndpoint(options.tunnelProvider),\n readTunnelStatusEndpoint(options.tunnelProvider),\n ].map(normalizeEndpoint).filter(Boolean) as string[]);\n}\n\nexport function createCertificateCapability(...candidates: unknown[]): CertificateCapability | undefined {\n for (const candidate of candidates) {\n const tlsStatusReader = createCertificateStatusReader(candidate);\n const certificateRenewer = createCertificateRenewer(candidate);\n if (tlsStatusReader || certificateRenewer) {\n return {\n ...(tlsStatusReader ? { tlsStatusReader } : {}),\n ...(certificateRenewer ? { certificateRenewer } : {}),\n };\n }\n }\n return undefined;\n}\n\nasync function readNetworkStatus(\n options: NetworkSettingsHandlerOptions,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<NetworkSettingsStatus> {\n const [tls, dns, tunnel] = await Promise.all([\n safeReadCapability(options.tlsStatusReader, { supported: false, status: 'unsupported' }, 'TLS', logger),\n safeReadCapability(options.dnsStatusReader, { supported: false, status: 'unsupported' }, 'DNS', logger),\n safeReadCapability(options.tunnelStatusReader, { supported: false, status: 'unsupported' }, 'Tunnel', logger),\n ]);\n return {\n endpoint: normalizeEndpoint(resolveValue(options.endpoint)) ?? '',\n addresses: {\n local: safeAddressList(options.localAddresses, logger),\n lan: safeAddressList(options.lanAddresses, logger),\n public: safeAddressList(options.publicAddresses, logger),\n },\n tls,\n dns,\n tunnel,\n actions: {\n diagnose: true,\n renewCertificate: await isCertificateRenewalAvailable(options.certificateRenewer, logger),\n },\n };\n}\n\nasync function isCertificateRenewalAvailable(\n renewer: CertificateRenewer | undefined,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<boolean> {\n if (!renewer) {\n return false;\n }\n if (!renewer.isAvailable) {\n return true;\n }\n try {\n return Boolean(await renewer.isAvailable());\n } catch (error) {\n logger.warn(`Failed to read certificate renewal availability: ${redactSecretText(error)}`);\n return false;\n }\n}\n\nasync function safeReadCapability<T extends CapabilityStatus>(\n reader: NetworkCapabilityReader<T> | undefined,\n fallback: T,\n label: string,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<T> {\n if (!reader) {\n return fallback;\n }\n try {\n return await reader.read();\n } catch (error) {\n logger.warn(`Failed to read ${label} status: ${redactSecretText(error)}`);\n return { ...fallback, supported: true, status: 'error' };\n }\n}\n\nfunction safeAddressList(\n reader: (() => string[]) | undefined,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): string[] {\n if (!reader) return [];\n try {\n return uniqueUrls(reader().map(normalizeEndpoint).filter(Boolean) as string[]);\n } catch (error) {\n logger.warn(`Failed to read network addresses: ${redactSecretText(error)}`);\n return [];\n }\n}\n\nfunction buildDefaultDiagnostics(\n options: NetworkSettingsHandlerOptions,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): NetworkDiagnosticCheck[] {\n return [\n {\n id: 'endpoint',\n label: 'Endpoint',\n run: async () => {\n const endpoint = normalizeEndpoint(resolveValue(options.endpoint));\n return endpoint ? { status: 'ok', detail: endpoint } : { status: 'unsupported', detail: 'endpoint_unavailable' };\n },\n },\n {\n id: 'tls',\n label: 'TLS',\n run: async () => capabilityToDiagnostic(await safeReadCapability(\n options.tlsStatusReader,\n { supported: false, status: 'unsupported' },\n 'TLS',\n logger,\n )),\n },\n {\n id: 'dns',\n label: 'DNS',\n run: async () => capabilityToDiagnostic(await safeReadCapability(\n options.dnsStatusReader,\n { supported: false, status: 'unsupported' },\n 'DNS',\n logger,\n )),\n },\n {\n id: 'tunnel',\n label: 'Tunnel',\n run: async () => capabilityToDiagnostic(await safeReadCapability(\n options.tunnelStatusReader,\n { supported: false, status: 'unsupported' },\n 'Tunnel',\n logger,\n )),\n },\n ];\n}\n\nasync function runDiagnostic(\n check: NetworkDiagnosticCheck,\n logger: Pick<ReturnType<typeof getLoggerFor>, 'warn' | 'error'>,\n): Promise<NetworkDiagnosticCheckResult> {\n try {\n const result = await check.run();\n if (typeof result === 'string') {\n return { id: check.id, label: check.label, status: result };\n }\n return {\n id: check.id,\n label: check.label,\n status: result.status,\n ...(result.detail ? { detail: redactSecretText(result.detail) } : {}),\n };\n } catch (error) {\n logger.warn(`Network diagnostic ${check.id} failed: ${redactSecretText(error)}`);\n return { id: check.id, label: check.label, status: 'error', detail: redactSecretText(error) };\n }\n}\n\nfunction capabilityToDiagnostic(capability: CapabilityStatus): Omit<NetworkDiagnosticCheckResult, 'id' | 'label'> {\n if (!capability.supported) {\n return { status: 'unsupported', detail: capability.status };\n }\n if (capability.status === 'active' || capability.status === 'valid' || capability.status === 'synced' || capability.status === 'direct') {\n return { status: 'ok', detail: capability.status };\n }\n if (capability.status === 'error') {\n return { status: 'error', detail: capability.status };\n }\n return { status: 'warning', detail: capability.status };\n}\n\nasync function requireNetworkPermission(\n request: AuthenticatedRequest,\n response: ServerResponse,\n authorizer: NetworkSettingsAuthorizer,\n mode: 'read' | 'write',\n): Promise<boolean> {\n if (!request.auth) {\n sendJson(response, 401, { error: 'Authentication required' });\n return false;\n }\n const allowed = mode === 'read'\n ? await authorizer.canRead(request.auth)\n : await authorizer.canWrite(request.auth);\n if (!allowed) {\n sendJson(response, 403, { error: `Missing required permission: network:${mode}` });\n return false;\n }\n return true;\n}\n\nfunction hasDeploymentNetworkScope(auth: AuthContext, scope: 'network:read' | 'network:write'): boolean {\n const scopes = readAuthScopes(auth);\n if (scopes.includes(scope)) {\n return true;\n }\n return false;\n}\n\nfunction readAuthScopes(auth: AuthContext): string[] {\n if (auth.type === 'service') {\n return auth.scopes;\n }\n return [];\n}\n\nasync function isDeploymentOwnerOrAdmin(\n auth: AuthContext,\n options: NetworkSettingsIdentityAuthorizerOptions | undefined,\n): Promise<boolean> {\n if (auth.type !== 'solid' || !options) {\n return false;\n }\n\n const roles = (await options.accountRoleRepository?.findByWebId(auth.webId))?.roles ?? [];\n return roles.includes('admin') || (options.deployment === 'local' && roles.includes('owner'));\n}\n\nfunction sendJson(response: ServerResponse, status: number, data: unknown): void {\n response.statusCode = status;\n response.setHeader('Content-Type', 'application/json');\n response.end(JSON.stringify(data));\n}\n\nfunction resolveValue(value: string | (() => string | undefined) | undefined): string | undefined {\n return typeof value === 'function' ? value() : value;\n}\n\nfunction normalizeEndpoint(value: string | undefined): string | undefined {\n if (!value?.trim()) return undefined;\n try {\n const url = new URL(value);\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return undefined;\n return url.toString().replace(/\\/+$/u, '') + '/';\n } catch {\n return undefined;\n }\n}\n\nfunction uniqueUrls(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)));\n}\n\nfunction isLoopbackEndpoint(value: string): boolean {\n try {\n const host = new URL(value).hostname;\n return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';\n } catch {\n return false;\n }\n}\n\nfunction readPort(endpoint: string | undefined): number | undefined {\n if (!endpoint) return undefined;\n try {\n const url = new URL(endpoint);\n if (url.port) return Number.parseInt(url.port, 10);\n return url.protocol === 'https:' ? 443 : 80;\n } catch {\n return undefined;\n }\n}\n\nfunction readLanIpAddresses(): string[] {\n const result: string[] = [];\n for (const entries of Object.values(networkInterfaces())) {\n for (const entry of entries ?? []) {\n if (entry.family === 'IPv4' && !entry.internal) {\n result.push(entry.address);\n }\n }\n }\n return result;\n}\n\nfunction readDdnsPublicUrl(ddnsManager: unknown): string | undefined {\n if (!hasFunction(ddnsManager, 'getStatus')) {\n return undefined;\n }\n const status = ddnsManager.getStatus() as { allocated?: boolean; fqdn?: string; baseUrl?: string };\n if (status.baseUrl) {\n return status.baseUrl;\n }\n if (status.allocated && status.fqdn) {\n return `https://${status.fqdn}/`;\n }\n return undefined;\n}\n\nfunction readTunnelEndpoint(tunnelProvider: unknown): string | undefined {\n if (!hasFunction(tunnelProvider, 'getEndpoint')) {\n return undefined;\n }\n const endpoint = tunnelProvider.getEndpoint();\n return typeof endpoint === 'string' ? endpoint : undefined;\n}\n\nfunction readTunnelStatusEndpoint(tunnelProvider: unknown): string | undefined {\n if (!hasFunction(tunnelProvider, 'getStatus')) {\n return undefined;\n }\n const status = tunnelProvider.getStatus() as { endpoint?: string };\n return typeof status.endpoint === 'string' ? status.endpoint : undefined;\n}\n\nfunction createCertificateStatusReader(candidate: unknown): NetworkCapabilityReader<NetworkSettingsStatus['tls']> | undefined {\n const statusMethod = [\n 'readCertificateStatus',\n 'getCertificateStatus',\n 'readTlsStatus',\n 'getTlsStatus',\n ].find((method) => hasFunction(candidate, method));\n if (!statusMethod) {\n return undefined;\n }\n return {\n read: async () => normalizeCertificateStatus(\n await (candidate as Record<string, () => unknown>)[statusMethod](),\n ),\n };\n}\n\nfunction createCertificateRenewer(candidate: unknown): CertificateRenewer | undefined {\n const renewMethod = [\n 'renewCertificate',\n 'renew',\n 'ensureCertificate',\n ].find((method) => hasFunction(candidate, method));\n if (!renewMethod) {\n return undefined;\n }\n return {\n renew: async () => {\n return await (candidate as Record<string, () => unknown>)[renewMethod]() as CertificateRenewalResult | void;\n },\n ...(hasFunction(candidate, 'isAvailable') ? {\n isAvailable: async () => Boolean(await (candidate as Record<string, () => unknown>).isAvailable()),\n } : {}),\n };\n}\n\nfunction normalizeRenewalError(error: unknown): { statusCode: number; code: string; message: string } {\n if (error && typeof error === 'object') {\n const record = error as Record<string, unknown>;\n const statusCode = typeof record.statusCode === 'number' ? record.statusCode : undefined;\n const code = typeof record.code === 'string' ? record.code : undefined;\n const message = error instanceof Error ? error.message : undefined;\n if (statusCode && code) {\n return {\n statusCode,\n code,\n message: message ?? 'Certificate renewal failed',\n };\n }\n }\n return {\n statusCode: 500,\n code: 'certificate_renewal_failed',\n message: 'Failed to renew network certificate',\n };\n}\n\nfunction normalizeCertificateStatus(value: unknown): NetworkSettingsStatus['tls'] {\n if (typeof value === 'string') {\n return { supported: true, status: value };\n }\n if (!value || typeof value !== 'object') {\n return { supported: true, status: 'configured' };\n }\n const record = value as Record<string, unknown>;\n const nestedCertificate = record.certificate && typeof record.certificate === 'object'\n ? record.certificate as Record<string, unknown>\n : undefined;\n const status = typeof record.status === 'string' ? record.status : 'configured';\n const expiresAt = normalizeIsoDate(record.expiresAt ?? nestedCertificate?.expiresAt);\n return {\n supported: record.supported === false ? false : true,\n status,\n ...(expiresAt ? { expiresAt } : {}),\n };\n}\n\nfunction normalizeIsoDate(value: unknown): string | undefined {\n if (value instanceof Date && Number.isFinite(value.getTime())) {\n return value.toISOString();\n }\n if (typeof value === 'string') {\n const date = new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : value;\n }\n if (typeof value === 'number') {\n const date = new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : undefined;\n }\n return undefined;\n}\n\nfunction hasFunction<T extends string>(value: unknown, key: T): value is Record<T, (...args: never[]) => unknown> {\n return Boolean(value && typeof value === 'object' && typeof (value as Record<T, unknown>)[key] === 'function');\n}\n\nexport function redactSecretText(value: unknown): string {\n const raw = value instanceof Error ? value.message : String(value);\n const containsSensitiveValue = [\n /\\b(?:authorization|proxy-authorization)\\s*[:=]\\s*(?:bearer|dpop|basic)?\\s*[^,\\s;]+/iu,\n /\\bdpop\\s*[:=]\\s*[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)?/iu,\n /\\b(?:bearer|dpop)\\s+[A-Za-z0-9._~+/=-]{8,}/iu,\n /\\b(?:cookie|set-cookie)\\s*[:=]\\s*[^,\\n]+/iu,\n /\\b(?:token|secret|password|passwd|api[_-]?key|authorization|credential|clientSecret|client_secret)\\s*[=:]\\s*[^,\\s;]+/iu,\n /(?:[?#&]|\\b)(?:access_token|refresh_token|id_token|token_type)\\s*=\\s*[^&#\\s;,]+/iu,\n /[?&]code=[^&#\\s]+/iu,\n /\\b(?:oauth|oidc|auth(?:orization)?|callback)\\b[^,\\n]*\\bcode\\s*[=:]\\s*[^,\\s;&]+/iu,\n /\\bcode\\s*[=:]\\s*[^,\\s;&]+[^,\\n]*\\b(?:oauth|oidc|auth(?:orization)?|callback)\\b/iu,\n /\\bxpod_(?:gw|inv)_[A-Za-z0-9._-]+/iu,\n /-----BEGIN [A-Z ]*PRIVATE KEY-----/u,\n /\"d\"\\s*:\\s*\"[^\"]{8,}\"/u,\n /\\b(?:postgres|postgresql|mysql|redis|mongodb|sqlite):\\/\\/[^,\\s]+/iu,\n /\\bfile:\\/\\/\\/[^\\s,;]+/iu,\n /(?:^|\\s)\\/(?:Users|home|var|tmp|private|etc)\\/[^\\s,;]+/iu,\n /\\b[A-Za-z]:[\\\\/][^\\s,;]+/u,\n /\\\\\\\\[^\\\\\\s,;]+\\\\[^\\\\\\s,;]+\\\\[^\\s,;]+/u,\n ].some((pattern) => pattern.test(raw));\n return containsSensitiveValue ? '[redacted]' : raw;\n}\n"]}