@ashlr/hub 3.3.0 → 3.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +46 -2
  2. package/README.md +51 -38
  3. package/dist/build-identity.json +2 -2
  4. package/dist/cli/completions.js +1 -2
  5. package/dist/cli/completions.js.map +1 -1
  6. package/dist/cli/dashboard.js +5 -4
  7. package/dist/cli/dashboard.js.map +1 -1
  8. package/dist/cli/help.js +7 -10
  9. package/dist/cli/help.js.map +1 -1
  10. package/dist/cli/index.d.ts +0 -1
  11. package/dist/cli/index.js +0 -10
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/serve.js +7 -3
  14. package/dist/cli/serve.js.map +1 -1
  15. package/dist/cli/setup.d.ts +5 -3
  16. package/dist/cli/setup.js +14 -7
  17. package/dist/cli/setup.js.map +1 -1
  18. package/dist/cli/update.js +3 -1
  19. package/dist/cli/update.js.map +1 -1
  20. package/dist/core/daemon/activation-permit.d.ts +33 -268
  21. package/dist/core/daemon/activation-permit.js +106 -1111
  22. package/dist/core/daemon/activation-permit.js.map +1 -1
  23. package/dist/core/daemon/loop.d.ts +1 -13
  24. package/dist/core/daemon/loop.js +10 -113
  25. package/dist/core/daemon/loop.js.map +1 -1
  26. package/dist/core/daemon/service-install-authority.d.ts +5 -1
  27. package/dist/core/daemon/service-install-authority.js +7 -20
  28. package/dist/core/daemon/service-install-authority.js.map +1 -1
  29. package/dist/core/fleet/automerge-pass.js +28 -77
  30. package/dist/core/fleet/automerge-pass.js.map +1 -1
  31. package/dist/core/fleet/decisions-ledger.js +1 -1
  32. package/dist/core/fleet/decisions-ledger.js.map +1 -1
  33. package/dist/core/fleet/judge-trace.js +2 -1
  34. package/dist/core/fleet/judge-trace.js.map +1 -1
  35. package/dist/core/fleet/manager.d.ts +6 -0
  36. package/dist/core/fleet/manager.js +35 -17
  37. package/dist/core/fleet/manager.js.map +1 -1
  38. package/dist/core/fleet/post-merge-credit-label.d.ts +10 -0
  39. package/dist/core/fleet/post-merge-credit-label.js +13 -0
  40. package/dist/core/fleet/post-merge-credit-label.js.map +1 -0
  41. package/dist/core/fleet/post-merge-credit.d.ts +20 -38
  42. package/dist/core/fleet/post-merge-credit.js +38 -39
  43. package/dist/core/fleet/post-merge-credit.js.map +1 -1
  44. package/dist/core/fleet/self-improve.d.ts +7 -7
  45. package/dist/core/fleet/self-improve.js +104 -20
  46. package/dist/core/fleet/self-improve.js.map +1 -1
  47. package/dist/core/fleet/status.js +0 -1
  48. package/dist/core/fleet/status.js.map +1 -1
  49. package/dist/core/foundry/automerge-scope-policy.d.ts +2 -2
  50. package/dist/core/foundry/automerge-scope-policy.js +2 -9
  51. package/dist/core/foundry/automerge-scope-policy.js.map +1 -1
  52. package/dist/core/goals/store.js +60 -20
  53. package/dist/core/goals/store.js.map +1 -1
  54. package/dist/core/inbox/apply.js +3 -5
  55. package/dist/core/inbox/apply.js.map +1 -1
  56. package/dist/core/inbox/merge.d.ts +0 -84
  57. package/dist/core/inbox/merge.js +23 -277
  58. package/dist/core/inbox/merge.js.map +1 -1
  59. package/dist/core/learn/reflect.js +10 -0
  60. package/dist/core/learn/reflect.js.map +1 -1
  61. package/dist/core/onboard.d.ts +2 -0
  62. package/dist/core/onboard.js +9 -3
  63. package/dist/core/onboard.js.map +1 -1
  64. package/dist/core/run/orchestrator.js +2 -0
  65. package/dist/core/run/orchestrator.js.map +1 -1
  66. package/dist/core/types.d.ts +5 -4
  67. package/dist/core/types.js.map +1 -1
  68. package/dist/core/web/api.d.ts +6 -0
  69. package/dist/core/web/api.js +69 -11
  70. package/dist/core/web/api.js.map +1 -1
  71. package/dist/core/web/public/app.js +5 -1
  72. package/dist/core/web/public/next/assets/index-CDHQraxS.css +1 -0
  73. package/dist/core/web/public/next/assets/index-zVKD9krw.js +69 -0
  74. package/dist/core/web/public/next/assets/{index-Ct0mf8n4.js.map → index-zVKD9krw.js.map} +1 -1
  75. package/dist/core/web/public/next/index.html +2 -2
  76. package/dist/core/web/read-session-revocations.d.ts +26 -0
  77. package/dist/core/web/read-session-revocations.js +48 -0
  78. package/dist/core/web/read-session-revocations.js.map +1 -0
  79. package/dist/core/web/server.js +73 -27
  80. package/dist/core/web/server.js.map +1 -1
  81. package/dist/core/web/static.d.ts +1 -1
  82. package/dist/core/web/static.js +54 -20
  83. package/dist/core/web/static.js.map +1 -1
  84. package/dist/release-dependency-inventory.json +1 -1
  85. package/docs/RUNTIME_ACTIVATION_AUTHORITY.md +0 -11
  86. package/node_modules/fast-uri/index.js +201 -48
  87. package/node_modules/fast-uri/lib/schemes.js +9 -4
  88. package/node_modules/fast-uri/lib/utils.js +388 -91
  89. package/node_modules/fast-uri/package.json +1 -1
  90. package/node_modules/fast-uri/test/component-safe-serialization.test.js +105 -0
  91. package/node_modules/fast-uri/test/equal.test.js +31 -3
  92. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  93. package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  94. package/node_modules/fast-uri/test/ipv6-validation.test.js +90 -0
  95. package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  96. package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  97. package/node_modules/fast-uri/test/parse.test.js +7 -3
  98. package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  99. package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  100. package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  101. package/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  102. package/node_modules/fast-uri/test/security.test.js +75 -3
  103. package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  104. package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  105. package/node_modules/qs/.github/THREAT_MODEL.md +3 -3
  106. package/node_modules/qs/CHANGELOG.md +26 -0
  107. package/node_modules/qs/README.md +19 -1
  108. package/node_modules/qs/dist/qs.js +25 -25
  109. package/node_modules/qs/eslint.config.mjs +1 -1
  110. package/node_modules/qs/lib/parse.js +16 -6
  111. package/node_modules/qs/lib/stringify.js +23 -8
  112. package/node_modules/qs/lib/utils.js +57 -11
  113. package/node_modules/qs/package.json +8 -7
  114. package/node_modules/qs/test/parse.js +419 -0
  115. package/node_modules/qs/test/stringify.js +317 -0
  116. package/node_modules/qs/test/utils.js +206 -0
  117. package/package.json +5 -4
  118. package/schema/config.schema.json +7 -7
  119. package/dist/cli/activation.d.ts +0 -41
  120. package/dist/cli/activation.js +0 -485
  121. package/dist/cli/activation.js.map +0 -1
  122. package/dist/core/web/public/next/assets/index-CY0U241s.css +0 -1
  123. package/dist/core/web/public/next/assets/index-Ct0mf8n4.js +0 -69
@@ -6,8 +6,8 @@
6
6
  <meta name="color-scheme" content="light dark" />
7
7
  <title>ashlr — operator console</title>
8
8
  <meta name="referrer" content="no-referrer" />
9
- <script type="module" crossorigin src="/next/assets/index-Ct0mf8n4.js"></script>
10
- <link rel="stylesheet" crossorigin href="/next/assets/index-CY0U241s.css">
9
+ <script type="module" crossorigin src="/next/assets/index-zVKD9krw.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/next/assets/index-CDHQraxS.css">
11
11
  </head>
12
12
  <body>
13
13
  <div id="root"></div>
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Bounded, process-local revocation state for signed dashboard read sessions.
3
+ *
4
+ * Tickets are otherwise self-contained, so deleting the browser cookie alone
5
+ * would not revoke a copied ticket. This registry remembers the exact ticket
6
+ * digest until its signed expiry. If the bounded registry saturates, it tells
7
+ * the owning server to rotate the independent ticket-signing key and drain
8
+ * every stream. That invalidates all old tickets without evicting a still-live
9
+ * revocation and still permits a fresh ticket exchange afterward.
10
+ */
11
+ export interface RevocableReadSession {
12
+ id: string;
13
+ expiresAt: number;
14
+ }
15
+ export interface ReadSessionRevocationResult {
16
+ rotateSigningKey: boolean;
17
+ }
18
+ export declare class ReadSessionRevocations {
19
+ private readonly maxEntries;
20
+ private readonly revoked;
21
+ constructor(maxEntries?: number);
22
+ private prune;
23
+ isRevoked(id: string, nowMs?: number): boolean;
24
+ revoke(session: RevocableReadSession, nowMs?: number): ReadSessionRevocationResult;
25
+ clear(): void;
26
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Bounded, process-local revocation state for signed dashboard read sessions.
3
+ *
4
+ * Tickets are otherwise self-contained, so deleting the browser cookie alone
5
+ * would not revoke a copied ticket. This registry remembers the exact ticket
6
+ * digest until its signed expiry. If the bounded registry saturates, it tells
7
+ * the owning server to rotate the independent ticket-signing key and drain
8
+ * every stream. That invalidates all old tickets without evicting a still-live
9
+ * revocation and still permits a fresh ticket exchange afterward.
10
+ */
11
+ export class ReadSessionRevocations {
12
+ maxEntries;
13
+ revoked = new Map();
14
+ constructor(maxEntries = 1_024) {
15
+ this.maxEntries = maxEntries;
16
+ if (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {
17
+ throw new Error('read session revocation capacity must be a positive integer');
18
+ }
19
+ }
20
+ prune(nowMs) {
21
+ for (const [id, expiresAt] of this.revoked) {
22
+ if (expiresAt <= nowMs)
23
+ this.revoked.delete(id);
24
+ }
25
+ }
26
+ isRevoked(id, nowMs = Date.now()) {
27
+ this.prune(nowMs);
28
+ return (this.revoked.get(id) ?? 0) > nowMs;
29
+ }
30
+ revoke(session, nowMs = Date.now()) {
31
+ this.prune(nowMs);
32
+ if (session.expiresAt <= nowMs) {
33
+ return { rotateSigningKey: false };
34
+ }
35
+ const priorExpiry = this.revoked.get(session.id);
36
+ if (priorExpiry !== undefined || this.revoked.size < this.maxEntries) {
37
+ this.revoked.set(session.id, Math.max(priorExpiry ?? 0, session.expiresAt));
38
+ return { rotateSigningKey: false };
39
+ }
40
+ // Never evict a live revocation. The caller must synchronously rotate the
41
+ // ticket-signing key and drain all streams before returning logout success.
42
+ return { rotateSigningKey: true };
43
+ }
44
+ clear() {
45
+ this.revoked.clear();
46
+ }
47
+ }
48
+ //# sourceMappingURL=read-session-revocations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-session-revocations.js","sourceRoot":"","sources":["../../../src/core/web/read-session-revocations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,OAAO,sBAAsB;IAGJ;IAFZ,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,YAA6B,aAAa,KAAK;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAC7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAa;QACzB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,SAAS,IAAI,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,OAA6B,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;QACtD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC;YAC/B,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5E,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -20,7 +20,8 @@ import { createServer } from 'node:http';
20
20
  import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
21
21
  import { fileURLToPath } from 'node:url';
22
22
  import { join, dirname } from 'node:path';
23
- import { handleApi, drainSseConnections } from './api.js';
23
+ import { handleApi, drainSseConnections, drainSseSession } from './api.js';
24
+ import { ReadSessionRevocations } from './read-session-revocations.js';
24
25
  import { serveStatic } from './static.js';
25
26
  // ---------------------------------------------------------------------------
26
27
  // Host-header allowlist (anti DNS-rebinding)
@@ -38,6 +39,7 @@ const MAX_READ_SESSION_BYTES = 256;
38
39
  const READ_CLIENT_HEADER = 'x-ashlr-read-client';
39
40
  const READ_CLIENT_QUERY = 'client';
40
41
  const READ_CLIENT_RE = /^[a-f0-9]{64}$/;
42
+ const READ_SESSION_REVOCATION_CAPACITY = 64;
41
43
  function isAllowedHost(host) {
42
44
  if (!host)
43
45
  return false;
@@ -71,7 +73,10 @@ function sendJson(res, status, body, headers = {}) {
71
73
  'X-Content-Type-Options': 'nosniff',
72
74
  ...headers,
73
75
  });
74
- res.end(JSON.stringify(body));
76
+ const publicBody = body && typeof body === 'object' && 'error' in body
77
+ ? { ...body, error: String(body.error).slice(0, 512) }
78
+ : body;
79
+ res.end(JSON.stringify(publicBody));
75
80
  }
76
81
  function clientBinding(clientProof) {
77
82
  return createHash('sha256').update(clientProof, 'utf8').digest('base64url');
@@ -86,12 +91,12 @@ function ticketPayload(expiresAtMs, nonce, binding) {
86
91
  binding,
87
92
  ].join('.');
88
93
  }
89
- function signTicketPayload(payload, token) {
90
- return createHmac('sha256', token).update(payload, 'utf8').digest('base64url');
94
+ function signTicketPayload(payload, signingKey) {
95
+ return createHmac('sha256', signingKey).update(payload, 'utf8').digest('base64url');
91
96
  }
92
- function mintReadSession(token, clientProof, nowMs = Date.now()) {
97
+ function mintReadSession(signingKey, clientProof, nowMs = Date.now()) {
93
98
  const payload = ticketPayload(nowMs + READ_SESSION_TTL_MS, randomBytes(16).toString('base64url'), clientBinding(clientProof));
94
- return `${payload}.${signTicketPayload(payload, token)}`;
99
+ return `${payload}.${signTicketPayload(payload, signingKey)}`;
95
100
  }
96
101
  function readClientHeader(req) {
97
102
  const value = headerValue(req, READ_CLIENT_HEADER);
@@ -138,40 +143,48 @@ function readCookie(req, name) {
138
143
  }
139
144
  return found;
140
145
  }
141
- function validReadSession(req, token, url, nowMs = Date.now()) {
146
+ function validateReadSession(req, signingKey, url, revocations, purpose = 'read', nowMs = Date.now()) {
142
147
  const ticket = readCookie(req, READ_SESSION_COOKIE);
143
148
  if (!ticket)
144
- return false;
145
- const clientProof = readSessionClientProof(req, url);
149
+ return null;
150
+ const clientProof = purpose === 'logout' ? readClientHeader(req) : readSessionClientProof(req, url);
146
151
  if (!clientProof)
147
- return false;
152
+ return null;
148
153
  const parts = ticket.split('.');
149
154
  if (parts.length !== 7)
150
- return false;
155
+ return null;
151
156
  const [version, method, pathPrefix, expiresRaw, nonce, binding, signature] = parts;
152
157
  if (version !== READ_SESSION_VERSION
153
158
  || method !== READ_SESSION_METHOD
154
159
  || pathPrefix !== READ_SESSION_PATH_PREFIX
155
- || (req.method ?? 'GET').toUpperCase() !== method
156
- || !url.pathname.startsWith(pathPrefix)
160
+ || (purpose === 'read' && (req.method ?? 'GET').toUpperCase() !== method)
161
+ || (purpose === 'read' && !url.pathname.startsWith(pathPrefix))
157
162
  || !/^\d{13}$/.test(expiresRaw ?? '')
158
163
  || !/^[A-Za-z0-9_-]{22}$/.test(nonce ?? '')
159
164
  || !/^[A-Za-z0-9_-]{43}$/.test(binding ?? '')
160
165
  || !/^[A-Za-z0-9_-]{43}$/.test(signature ?? ''))
161
- return false;
166
+ return null;
162
167
  const expiresAtMs = Number(expiresRaw);
163
168
  if (!Number.isSafeInteger(expiresAtMs)
164
169
  || expiresAtMs <= nowMs
165
170
  || expiresAtMs > nowMs + READ_SESSION_TTL_MS + READ_SESSION_FUTURE_SKEW_MS)
166
- return false;
171
+ return null;
167
172
  if (!safeEqual(binding, clientBinding(clientProof)))
168
- return false;
173
+ return null;
169
174
  const payload = ticketPayload(expiresAtMs, nonce, binding);
170
- return safeEqual(signature, signTicketPayload(payload, token));
175
+ if (!safeEqual(signature, signTicketPayload(payload, signingKey)))
176
+ return null;
177
+ const session = {
178
+ id: createHash('sha256').update(ticket, 'utf8').digest('hex'),
179
+ expiresAt: expiresAtMs,
180
+ };
181
+ return revocations.isRevoked(session.id, nowMs) ? null : session;
171
182
  }
172
- function hasReadAuthority(req, token, url) {
173
- return safeEqual(headerValue(req, 'x-ashlr-token'), token)
174
- || validReadSession(req, token, url);
183
+ function readAuthority(req, token, signingKey, url, revocations) {
184
+ if (safeEqual(headerValue(req, 'x-ashlr-token'), token))
185
+ return { kind: 'header' };
186
+ const session = validateReadSession(req, signingKey, url, revocations);
187
+ return session ? { kind: 'session', session } : null;
175
188
  }
176
189
  function sessionCookie(value, maxAgeSeconds) {
177
190
  // The dashboard is intentionally plain HTTP on loopback, so a Secure cookie
@@ -211,10 +224,18 @@ export async function startServer(cfg, opts) {
211
224
  // while the mutation token is accepted only by handleApi mutation gates.
212
225
  const readToken = randomBytes(32).toString('hex');
213
226
  const token = randomBytes(32).toString('hex');
227
+ let readSessionSigningKey = randomBytes(32).toString('hex');
228
+ const readSessionRevocations = new ReadSessionRevocations(READ_SESSION_REVOCATION_CAPACITY);
214
229
  const server = createServer((req, res) => {
215
230
  // The EventSource client proof appears in its same-origin URL because the
216
231
  // browser API cannot set headers. Never allow it to escape in a Referer.
217
232
  res.setHeader('Referrer-Policy', 'no-referrer');
233
+ // Legacy index.html contains its stylesheet inline; scripts remain
234
+ // external-only. The new console uses external assets for both.
235
+ res.setHeader('Content-Security-Policy', "default-src 'self'; base-uri 'none'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'");
236
+ res.setHeader('X-Frame-Options', 'DENY');
237
+ res.setHeader('Cross-Origin-Resource-Policy', 'same-origin');
238
+ res.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
218
239
  // ── 1. Host-header allowlist (anti DNS-rebinding) ──────────────────────
219
240
  if (!isAllowedHost(req.headers.host)) {
220
241
  res.writeHead(403, { 'Content-Type': 'text/plain' });
@@ -228,6 +249,7 @@ export async function startServer(cfg, opts) {
228
249
  }
229
250
  const path = url.pathname;
230
251
  const method = (req.method ?? 'GET').toUpperCase();
252
+ const authority = readAuthority(req, readToken, readSessionSigningKey, url, readSessionRevocations);
231
253
  // Exchange the raw operator token for a short-lived, read-only browser
232
254
  // session. The ticket is HMAC-bound to this server process and cannot be
233
255
  // used by any mutation route, which still requires the raw header.
@@ -241,13 +263,32 @@ export async function startServer(cfg, opts) {
241
263
  sendJson(res, 400, { error: 'invalid read client proof' });
242
264
  return;
243
265
  }
244
- const ticket = mintReadSession(readToken, readClientHeader(req));
266
+ const ticket = mintReadSession(readSessionSigningKey, readClientHeader(req));
245
267
  sendJson(res, 204, undefined, {
246
268
  'Set-Cookie': sessionCookie(ticket, Math.floor(READ_SESSION_TTL_MS / 1000)),
247
269
  });
248
270
  return;
249
271
  }
250
272
  if (method === 'DELETE') {
273
+ const session = !url.search
274
+ ? validateReadSession(req, readSessionSigningKey, url, readSessionRevocations, 'logout')
275
+ : null;
276
+ if (!session) {
277
+ sendJson(res, 401, { code: 'SESSION_REQUIRED', error: 'valid read session required' });
278
+ return;
279
+ }
280
+ const revocation = readSessionRevocations.revoke(session);
281
+ if (revocation.rotateSigningKey) {
282
+ // Capacity exhaustion must never resurrect an evicted ticket. Rotate
283
+ // the independent signer synchronously and drain all old streams;
284
+ // the stable raw read token can still mint fresh tickets afterward.
285
+ readSessionSigningKey = randomBytes(32).toString('hex');
286
+ readSessionRevocations.clear();
287
+ drainSseConnections();
288
+ }
289
+ else {
290
+ drainSseSession(session.id);
291
+ }
251
292
  sendJson(res, 204, undefined, {
252
293
  'Set-Cookie': sessionCookie('', 0),
253
294
  });
@@ -258,7 +299,7 @@ export async function startServer(cfg, opts) {
258
299
  }
259
300
  // Public liveness is intentionally content-free and bounded. Operators
260
301
  // with read authority retain the richer persisted /api/health projection.
261
- if (path === '/api/health' && method === 'GET' && !hasReadAuthority(req, readToken, url)) {
302
+ if (path === '/api/health' && method === 'GET' && !authority) {
262
303
  sendJson(res, 200, { ok: true });
263
304
  return;
264
305
  }
@@ -266,7 +307,7 @@ export async function startServer(cfg, opts) {
266
307
  // GET (including SSE) is default-deny here before route dispatch.
267
308
  if (method === 'GET'
268
309
  && (path === '/api' || path.startsWith('/api/'))
269
- && !hasReadAuthority(req, readToken, url)) {
310
+ && !authority) {
270
311
  sendJson(res, 401, { error: 'unauthorized: read session required' }, {
271
312
  Vary: 'Cookie, X-Ashlr-Token, X-Ashlr-Read-Client',
272
313
  });
@@ -274,7 +315,11 @@ export async function startServer(cfg, opts) {
274
315
  }
275
316
  // ── 2. API routes ──────────────────────────────────────────────────────
276
317
  // handleApi is async; wrap to catch errors without crashing the server.
277
- handleApi(req, res, cfg, { token, allowDispatch: opts.allowDispatch })
318
+ handleApi(req, res, cfg, {
319
+ token,
320
+ allowDispatch: opts.allowDispatch,
321
+ readSession: authority?.kind === 'session' ? authority.session : undefined,
322
+ })
278
323
  .then((handled) => {
279
324
  if (handled)
280
325
  return;
@@ -288,10 +333,10 @@ export async function startServer(cfg, opts) {
288
333
  .catch(() => {
289
334
  // Never let an unhandled rejection crash the server.
290
335
  if (!res.headersSent) {
291
- res.writeHead(500, { 'Content-Type': 'text/plain' });
336
+ sendJson(res, 500, { code: 'INTERNAL_ERROR', error: 'internal server error' });
292
337
  }
293
- if (!res.writableEnded) {
294
- res.end('Internal server error');
338
+ else if (!res.writableEnded) {
339
+ res.end();
295
340
  }
296
341
  });
297
342
  });
@@ -329,6 +374,7 @@ export async function startServer(cfg, opts) {
329
374
  // Drain all open SSE response streams registered by handleApi, then
330
375
  // close the HTTP server (stops accepting new connections).
331
376
  drainSseConnections();
377
+ readSessionRevocations.clear();
332
378
  if (typeof server.closeAllConnections === 'function') {
333
379
  server.closeAllConnections();
334
380
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/core/web/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/core/web/server.ts"],"names":[],"mappings":"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"}
@@ -15,4 +15,4 @@
15
15
  * - No outward calls; pure local fs read bounded to the assets dir.
16
16
  */
17
17
  import type { IncomingMessage, ServerResponse } from 'node:http';
18
- export declare function serveStatic(req: IncomingMessage, res: ServerResponse, dir: string): boolean;
18
+ export declare function serveStatic(req: IncomingMessage, res: ServerResponse, dir: string, beforeDescriptorOpen?: (() => void) | undefined): boolean;
@@ -14,7 +14,7 @@
14
14
  * - NEVER throws — all errors are caught and surface as `false`.
15
15
  * - No outward calls; pure local fs read bounded to the assets dir.
16
16
  */
17
- import { readFileSync, statSync } from 'node:fs';
17
+ import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync, realpathSync } from 'node:fs';
18
18
  import { resolve, join, sep, normalize, extname } from 'node:path';
19
19
  // ---------------------------------------------------------------------------
20
20
  // Content-Type mapping (only the handful of extensions the SPA ships).
@@ -67,14 +67,16 @@ function extractPathname(rawUrl) {
67
67
  // ---------------------------------------------------------------------------
68
68
  // serveStatic
69
69
  // ---------------------------------------------------------------------------
70
- export function serveStatic(req, res, dir) {
70
+ export function serveStatic(req, res, dir, beforeDescriptorOpen = undefined) {
71
71
  try {
72
72
  const rootDir = resolve(dir);
73
73
  const pathname = extractPathname(req.url);
74
74
  if (pathname === null)
75
75
  return false;
76
76
  // "/" (or empty) -> index.html (SPA shell).
77
- let rel = pathname === '/' ? '/index.html' : pathname;
77
+ let rel = pathname === '/' ? '/index.html'
78
+ : (pathname === '/next' || pathname === '/next/') ? '/next/index.html'
79
+ : pathname;
78
80
  // Reject null bytes anywhere in the relative path.
79
81
  if (rel.includes('\x00'))
80
82
  return false;
@@ -91,28 +93,60 @@ export function serveStatic(req, res, dir) {
91
93
  if (candidate !== rootDir && !candidate.startsWith(rootWithSep)) {
92
94
  return false;
93
95
  }
94
- // Stat — must be an existing regular file (never a directory).
95
- let stat;
96
+ // Open first without following a replacement final symlink. All named-path
97
+ // containment and identity checks happen after descriptor custody is held,
98
+ // so the bytes are never read through a separately checked pathname.
99
+ let fd;
96
100
  try {
97
- stat = statSync(candidate);
101
+ const realRoot = realpathSync(rootDir);
102
+ beforeDescriptorOpen?.();
103
+ fd = openSync(candidate, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
104
+ const openedBefore = fstatSync(fd);
105
+ if (!openedBefore.isFile())
106
+ return false;
107
+ const realCandidate = realpathSync(candidate);
108
+ const realRootWithSep = realRoot.endsWith(sep) ? realRoot : realRoot + sep;
109
+ if (!realCandidate.startsWith(realRootWithSep))
110
+ return false;
111
+ const namedBefore = lstatSync(candidate);
112
+ if (namedBefore.isSymbolicLink() || !namedBefore.isFile() ||
113
+ openedBefore.dev !== namedBefore.dev || openedBefore.ino !== namedBefore.ino)
114
+ return false;
115
+ const body = readFileSync(fd);
116
+ const openedAfter = fstatSync(fd);
117
+ const realCandidateAfter = realpathSync(candidate);
118
+ const namedAfter = lstatSync(candidate);
119
+ if (!openedAfter.isFile() || !realCandidateAfter.startsWith(realRootWithSep) ||
120
+ namedAfter.isSymbolicLink() || !namedAfter.isFile() ||
121
+ openedBefore.dev !== openedAfter.dev || openedBefore.ino !== openedAfter.ino ||
122
+ openedAfter.dev !== namedAfter.dev || openedAfter.ino !== namedAfter.ino ||
123
+ openedBefore.size !== openedAfter.size ||
124
+ openedBefore.mtimeMs !== openedAfter.mtimeMs ||
125
+ openedBefore.ctimeMs !== openedAfter.ctimeMs ||
126
+ openedAfter.size !== namedAfter.size ||
127
+ openedAfter.mtimeMs !== namedAfter.mtimeMs ||
128
+ openedAfter.ctimeMs !== namedAfter.ctimeMs)
129
+ return false;
130
+ res.setHeader('Content-Type', contentTypeFor(candidate));
131
+ res.writeHead(200, {
132
+ 'Content-Type': contentTypeFor(candidate),
133
+ 'Content-Length': String(body.byteLength),
134
+ 'Cache-Control': 'no-cache',
135
+ 'X-Content-Type-Options': 'nosniff',
136
+ });
137
+ res.end(body);
138
+ return true;
98
139
  }
99
140
  catch {
100
141
  return false; // ENOENT and friends -> not found.
101
142
  }
102
- if (!stat.isFile())
103
- return false;
104
- const body = readFileSync(candidate);
105
- // Set Content-Type via setHeader (case-insensitive in real Node http) so
106
- // downstream readers can look it up by the canonical lowercase name.
107
- res.setHeader('Content-Type', contentTypeFor(candidate));
108
- res.writeHead(200, {
109
- 'Content-Type': contentTypeFor(candidate),
110
- 'Content-Length': String(body.byteLength),
111
- 'Cache-Control': 'no-cache',
112
- 'X-Content-Type-Options': 'nosniff',
113
- });
114
- res.end(body);
115
- return true;
143
+ finally {
144
+ if (fd !== undefined)
145
+ try {
146
+ closeSync(fd);
147
+ }
148
+ catch { /* best effort */ }
149
+ }
116
150
  }
117
151
  catch {
118
152
  // NEVER throw — any unexpected error means "not served".
@@ -1 +1 @@
1
- {"version":3,"file":"static.js","sourceRoot":"","sources":["../../../src/core/web/static.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../../src/core/web/static.ts"],"names":[],"mappings":"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"}