gencow 0.1.152 → 0.1.153

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gencow",
3
- "version": "0.1.152",
3
+ "version": "0.1.153",
4
4
  "description": "Gencow — AI Backend Engine",
5
5
  "type": "module",
6
6
  "bin": {
package/server/index.js CHANGED
@@ -20610,8 +20610,8 @@ var init_pdf = __esm({
20610
20610
  this._readCapability = Promise.withResolvers();
20611
20611
  this._headersCapability = Promise.withResolvers();
20612
20612
  const fs4 = process.getBuiltinModule("fs");
20613
- fs4.promises.lstat(this._url).then((stat4) => {
20614
- this._contentLength = stat4.size;
20613
+ fs4.promises.lstat(this._url).then((stat5) => {
20614
+ this._contentLength = stat5.size;
20615
20615
  this._setReadableStream(fs4.createReadStream(this._url));
20616
20616
  this._headersCapability.resolve();
20617
20617
  }, (error) => {
@@ -92788,7 +92788,9 @@ var getNodeRouteMetricsSnapshot = mod2.getNodeRouteMetricsSnapshot;
92788
92788
  var resetNodeRouteMetricsForTests = mod2.resetNodeRouteMetricsForTests;
92789
92789
 
92790
92790
  // ../server/src/server-platform-static-file.ts
92791
- import { join as join2 } from "path";
92791
+ import { extname as extname2, join as join2 } from "path";
92792
+ import { brotliCompressSync, gzipSync } from "zlib";
92793
+ import { stat } from "fs/promises";
92792
92794
 
92793
92795
  // ../server/src/static-file-routing.ts
92794
92796
  import { extname, isAbsolute, relative as relative2, resolve as resolve7 } from "path";
@@ -92911,6 +92913,65 @@ async function resolveStaticFileRequest(params) {
92911
92913
  }
92912
92914
 
92913
92915
  // ../server/src/server-platform-static-file.ts
92916
+ var compressibleStaticExtensions = /* @__PURE__ */ new Set([
92917
+ ".css",
92918
+ ".csv",
92919
+ ".htm",
92920
+ ".html",
92921
+ ".js",
92922
+ ".json",
92923
+ ".mjs",
92924
+ ".svg",
92925
+ ".txt",
92926
+ ".wasm",
92927
+ ".webmanifest",
92928
+ ".xml"
92929
+ ]);
92930
+ var encodedFileCache = /* @__PURE__ */ new Map();
92931
+ var encodedFileCacheTtlMs = 10 * 60 * 1e3;
92932
+ var encodedFileCacheMaxEntries = 240;
92933
+ function acceptsEncoding(value, encoding) {
92934
+ const tokens = value.toLowerCase().split(",").map((part) => part.trim());
92935
+ return tokens.some((token) => {
92936
+ if (!token.startsWith(encoding)) return false;
92937
+ const q = token.match(/;\s*q=([0-9.]+)/)?.[1];
92938
+ return q === void 0 || Number(q) > 0;
92939
+ });
92940
+ }
92941
+ function requestHeader(c, name) {
92942
+ const direct = c?.req?.header?.(name);
92943
+ if (typeof direct === "string") return direct;
92944
+ const fromHeaders = c?.req?.headers?.get?.(name);
92945
+ return typeof fromHeaders === "string" ? fromHeaders : "";
92946
+ }
92947
+ function preferredStaticEncoding(acceptEncoding, filePath) {
92948
+ if (!compressibleStaticExtensions.has(extname2(filePath).toLowerCase())) return null;
92949
+ if (acceptsEncoding(acceptEncoding, "br")) return "br";
92950
+ if (acceptsEncoding(acceptEncoding, "gzip")) return "gzip";
92951
+ return null;
92952
+ }
92953
+ function pruneEncodedFileCache(now = Date.now()) {
92954
+ for (const [key, value] of encodedFileCache) {
92955
+ if (now - value.createdAt > encodedFileCacheTtlMs) encodedFileCache.delete(key);
92956
+ }
92957
+ while (encodedFileCache.size > encodedFileCacheMaxEntries) {
92958
+ const oldest = encodedFileCache.keys().next().value;
92959
+ if (!oldest) break;
92960
+ encodedFileCache.delete(oldest);
92961
+ }
92962
+ }
92963
+ async function encodedStaticFile(filePath, encoding, originalSize) {
92964
+ const stats = await stat(filePath).catch(() => null);
92965
+ const cacheKey = `${filePath}:${stats?.mtimeMs ?? 0}:${originalSize}:${encoding}`;
92966
+ pruneEncodedFileCache();
92967
+ const cached = encodedFileCache.get(cacheKey);
92968
+ if (cached) return cached.body;
92969
+ const input = Buffer.from(await Bun.file(filePath).arrayBuffer());
92970
+ const output = encoding === "br" ? brotliCompressSync(input) : gzipSync(input);
92971
+ if (output.byteLength >= input.byteLength) return null;
92972
+ encodedFileCache.set(cacheKey, { body: output, createdAt: Date.now() });
92973
+ return output;
92974
+ }
92914
92975
  async function serveStaticFile(params) {
92915
92976
  const staticDir = join2(params.dataDir, "static");
92916
92977
  const resolution = await resolveStaticFileRequest({
@@ -92925,14 +92986,23 @@ async function serveStaticFile(params) {
92925
92986
  const file = Bun.file(resolution.filePath);
92926
92987
  const fileSize = file.size;
92927
92988
  const requestMethod = String(params.c?.req?.method ?? "").toUpperCase();
92928
- if (requestMethod !== "HEAD" && Number.isSafeInteger(fileSize) && fileSize > 0) {
92929
- params.recordBytes?.(fileSize);
92989
+ const encoding = preferredStaticEncoding(requestHeader(params.c, "Accept-Encoding"), resolution.filePath);
92990
+ const encodedBody = encoding && Number.isSafeInteger(fileSize) && fileSize > 0 ? await encodedStaticFile(resolution.filePath, encoding, fileSize) : null;
92991
+ const responseBody = encodedBody ? new Uint8Array(encodedBody) : file;
92992
+ const responseBytes = encodedBody?.byteLength ?? fileSize;
92993
+ if (requestMethod !== "HEAD" && Number.isSafeInteger(responseBytes) && responseBytes > 0) {
92994
+ params.recordBytes?.(responseBytes);
92930
92995
  }
92931
92996
  const headers = new Headers({ "Cache-Control": resolution.cacheControl });
92932
- if (Number.isSafeInteger(fileSize) && fileSize >= 0) {
92933
- headers.set("Content-Length", String(fileSize));
92997
+ if (encodedBody && encoding) {
92998
+ headers.set("Content-Encoding", encoding);
92999
+ headers.set("Vary", "Accept-Encoding");
93000
+ }
93001
+ if (file.type) headers.set("Content-Type", file.type);
93002
+ if (Number.isSafeInteger(responseBytes) && responseBytes >= 0) {
93003
+ headers.set("Content-Length", String(responseBytes));
92934
93004
  }
92935
- return new Response(file, {
93005
+ return new Response(requestMethod === "HEAD" ? null : responseBody, {
92936
93006
  headers
92937
93007
  });
92938
93008
  }
@@ -97200,7 +97270,7 @@ import { existsSync as existsSync6 } from "fs";
97200
97270
  import { resolve as resolve20 } from "path";
97201
97271
 
97202
97272
  // ../../node_modules/.pnpm/hono@4.12.18/node_modules/hono/dist/adapter/bun/serve-static.js
97203
- import { stat } from "node:fs/promises";
97273
+ import { stat as stat2 } from "node:fs/promises";
97204
97274
  import { join as join3 } from "node:path";
97205
97275
 
97206
97276
  // ../../node_modules/.pnpm/hono@4.12.18/node_modules/hono/dist/utils/compress.js
@@ -97376,7 +97446,7 @@ var serveStatic2 = (options) => {
97376
97446
  const isDir = async (path3) => {
97377
97447
  let isDir2;
97378
97448
  try {
97379
- const stats = await stat(path3);
97449
+ const stats = await stat2(path3);
97380
97450
  isDir2 = stats.isDirectory();
97381
97451
  } catch {
97382
97452
  }
@@ -97824,11 +97894,11 @@ async function loadStorageMeta(params) {
97824
97894
  try {
97825
97895
  const raw2 = await fs.readFile(`${filePath}.meta`, "utf-8");
97826
97896
  const parsed = JSON.parse(raw2);
97827
- const stat4 = await fs.stat(filePath);
97897
+ const stat5 = await fs.stat(filePath);
97828
97898
  const meta = {
97829
97899
  id: params.storageId,
97830
97900
  name: typeof parsed.name === "string" ? parsed.name : params.storageId,
97831
- size: typeof parsed.size === "number" ? parsed.size : stat4.size,
97901
+ size: typeof parsed.size === "number" ? parsed.size : stat5.size,
97832
97902
  type: typeof parsed.type === "string" ? parsed.type : "application/octet-stream",
97833
97903
  visibility: normalizeStorageVisibility(parsed.visibility),
97834
97904
  path: filePath
@@ -99214,6 +99284,9 @@ function isAuthorizedCronToken(token, internalToken, cronToken) {
99214
99284
  if (!token) return false;
99215
99285
  return Boolean(internalToken) && token === internalToken || Boolean(cronToken) && token === cronToken;
99216
99286
  }
99287
+ function canFallbackToStableSchedulerAction(action) {
99288
+ return action.startsWith(`${WORKFLOW_RESUME_ACTION_PREFIX}.`);
99289
+ }
99217
99290
  function createInternalCronRouteHandler(params) {
99218
99291
  const logger2 = params.logger ?? console;
99219
99292
  return async (c) => {
@@ -99250,7 +99323,7 @@ function createInternalCronRouteHandler(params) {
99250
99323
  logger2.error(`[cron] /internal/cron/${action}: failed:`, message);
99251
99324
  return c.json({ ok: false, error: message }, 500);
99252
99325
  }
99253
- if (hasActionTokenMap) {
99326
+ if (hasActionTokenMap && !canFallbackToStableSchedulerAction(action)) {
99254
99327
  logger2.warn(`[cron] /internal/cron/${action}: action token not found`);
99255
99328
  return c.json({ ok: false, error: `Action "${action}" not found` }, 404);
99256
99329
  }
@@ -109598,13 +109671,21 @@ function sanitizePublicAuthResponsePayload(payload, fallback = "Authentication f
109598
109671
  return sanitized;
109599
109672
  }
109600
109673
 
109601
- // ../server/src/auth-session-cookies.ts
109674
+ // ../server/src/auth-session-resolution.ts
109602
109675
  function sessionTokenToCookieHeader(sessionToken) {
109603
109676
  return [
109604
109677
  `better-auth.session_token=${sessionToken}`,
109605
109678
  `__Secure-better-auth.session_token=${sessionToken}`
109606
109679
  ].join("; ");
109607
109680
  }
109681
+ function decodeCookieToken(value) {
109682
+ try {
109683
+ const decoded = decodeURIComponent(value);
109684
+ return decoded || null;
109685
+ } catch {
109686
+ return null;
109687
+ }
109688
+ }
109608
109689
  function extractSessionTokenFromCookieHeader(cookieHeader) {
109609
109690
  return extractSessionTokensFromCookieHeader(cookieHeader)[0] ?? null;
109610
109691
  }
@@ -109613,7 +109694,8 @@ function extractSessionTokensFromCookieHeader(cookieHeader) {
109613
109694
  const pattern = /(?:^|;\s*)(?:__Secure-)?better-auth\.session_token=([^;]+)/g;
109614
109695
  let match2;
109615
109696
  while ((match2 = pattern.exec(cookieHeader)) !== null) {
109616
- tokens.push(decodeURIComponent(match2[1]));
109697
+ const token = decodeCookieToken(match2[1]);
109698
+ if (token) tokens.push(token);
109617
109699
  }
109618
109700
  return tokens;
109619
109701
  }
@@ -109637,6 +109719,37 @@ function sessionCreatedAtMs(session2) {
109637
109719
  }
109638
109720
  return 0;
109639
109721
  }
109722
+ async function resolveRequestSession(input) {
109723
+ if (input.authorizationHeader?.startsWith("Bearer ")) {
109724
+ const sessionToken2 = input.authorizationHeader.substring(7);
109725
+ const session3 = await input.getSession(new Headers({ cookie: sessionTokenToCookieHeader(sessionToken2) }));
109726
+ return { session: session3, sessionToken: sessionToken2 };
109727
+ }
109728
+ const cookieHeader = input.cookieHeader ?? "";
109729
+ const sessionTokens = [...new Set(extractSessionTokensFromCookieHeader(cookieHeader))];
109730
+ if (sessionTokens.length <= 1) {
109731
+ const session3 = await input.getSession(buildSessionLookupHeaders(input.headers, cookieHeader));
109732
+ return { session: session3, sessionToken: sessionTokens[0] ?? null };
109733
+ }
109734
+ const resolved = await Promise.all(
109735
+ sessionTokens.map(async (sessionToken2, index) => {
109736
+ try {
109737
+ const session3 = await input.getSession(buildSessionLookupHeadersForToken(input.headers, sessionToken2));
109738
+ return session3 ? { session: session3, sessionToken: sessionToken2, index } : null;
109739
+ } catch {
109740
+ return null;
109741
+ }
109742
+ })
109743
+ );
109744
+ const valid = resolved.filter((candidate) => candidate !== null);
109745
+ if (valid.length === 0) return { session: null, sessionToken: null };
109746
+ valid.sort((a, b) => {
109747
+ const createdDelta = sessionCreatedAtMs(b.session) - sessionCreatedAtMs(a.session);
109748
+ return createdDelta || a.index - b.index;
109749
+ });
109750
+ const { session: session2, sessionToken } = valid[0];
109751
+ return { session: session2, sessionToken };
109752
+ }
109640
109753
 
109641
109754
  // ../server/src/auth-oauth-invite-reservation.ts
109642
109755
  import { createHash as createHash7, randomUUID as randomUUID2 } from "crypto";
@@ -111046,29 +111159,12 @@ async function issueJWT(user2) {
111046
111159
  return { token, expires_in: JWT_EXPIRES_IN_SEC };
111047
111160
  }
111048
111161
  async function resolveSessionFromRequest(c) {
111049
- const authHeader = c.req.header("Authorization");
111050
- if (authHeader?.startsWith("Bearer ")) {
111051
- const sessionToken = authHeader.substring(7);
111052
- const session2 = await authInstance.api.getSession({
111053
- headers: new Headers({ cookie: sessionTokenToCookieHeader(sessionToken) })
111054
- });
111055
- return { session: session2, sessionToken };
111056
- }
111057
- const cookieHeader = c.req.header("cookie") || "";
111058
- const sessionTokens = [...new Set(extractSessionTokensFromCookieHeader(cookieHeader))];
111059
- if (sessionTokens.length <= 1) {
111060
- const session2 = await authInstance.api.getSession({
111061
- headers: buildSessionLookupHeaders(c.req.raw.headers, cookieHeader)
111062
- });
111063
- return { session: session2, sessionToken: sessionTokens[0] ?? null };
111064
- }
111065
- const resolved = (await Promise.all(
111066
- sessionTokens.map(
111067
- (sessionToken) => authInstance.api.getSession({ headers: buildSessionLookupHeadersForToken(c.req.raw.headers, sessionToken) }).then((session2) => session2 ? { session: session2, sessionToken } : null).catch(() => null)
111068
- )
111069
- )).filter(Boolean);
111070
- if (resolved.length === 0) return { session: null, sessionToken: null };
111071
- return resolved.sort((a, b) => sessionCreatedAtMs(b.session) - sessionCreatedAtMs(a.session))[0];
111162
+ return resolveRequestSession({
111163
+ authorizationHeader: c.req.header("Authorization"),
111164
+ cookieHeader: c.req.header("cookie"),
111165
+ headers: c.req.raw.headers,
111166
+ getSession: (headers) => authInstance.api.getSession({ headers })
111167
+ });
111072
111168
  }
111073
111169
  async function getSessionFromRequest(c) {
111074
111170
  return (await resolveSessionFromRequest(c)).session;