mcp-scraper 0.43.4 → 0.43.6

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 (55) hide show
  1. package/README.md +3 -2
  2. package/dist/bin/api-server.cjs +124 -42
  3. package/dist/bin/api-server.cjs.map +1 -1
  4. package/dist/bin/api-server.js +3 -3
  5. package/dist/bin/mcp-scraper-cli.cjs +1 -1
  6. package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
  7. package/dist/bin/mcp-scraper-cli.js +1 -1
  8. package/dist/bin/mcp-scraper-install.cjs +1 -1
  9. package/dist/bin/mcp-scraper-install.cjs.map +1 -1
  10. package/dist/bin/mcp-scraper-install.js +1 -1
  11. package/dist/bin/mcp-stdio-server.cjs +26 -8
  12. package/dist/bin/mcp-stdio-server.cjs.map +1 -1
  13. package/dist/bin/mcp-stdio-server.js +6 -4
  14. package/dist/bin/mcp-stdio-server.js.map +1 -1
  15. package/dist/bin/paa-harvest.cjs.map +1 -1
  16. package/dist/bin/paa-harvest.js +3 -3
  17. package/dist/{chunk-6WLNXYRG.js → chunk-27FMOD6S.js} +1 -2
  18. package/dist/chunk-27FMOD6S.js.map +1 -0
  19. package/dist/{chunk-SXLQZKWC.js → chunk-3FKUKMNE.js} +30 -11
  20. package/dist/chunk-3FKUKMNE.js.map +1 -0
  21. package/dist/chunk-4FQDZ2T7.js +7 -0
  22. package/dist/chunk-4FQDZ2T7.js.map +1 -0
  23. package/dist/{chunk-FCFQ634B.js → chunk-5X7CJEK3.js} +25 -8
  24. package/dist/chunk-5X7CJEK3.js.map +1 -0
  25. package/dist/{chunk-ZBQ6EXZW.js → chunk-OVD4E4AP.js} +2 -2
  26. package/dist/{chunk-6TAQ2MXK.js → chunk-RJMOOII7.js} +2 -2
  27. package/dist/{chunk-ZDVQARDQ.js → chunk-T5AFM4G5.js} +2 -2
  28. package/dist/{chunk-QOWBJ4YY.js → chunk-WT2UHDSE.js} +2 -2
  29. package/dist/{chunk-GUI33Q27.js → chunk-WWIJ2NID.js} +2 -2
  30. package/dist/{db-C5ELI55I.js → db-4ABEYNDM.js} +4 -2
  31. package/dist/{extract-bundle-IOM45SFL.js → extract-bundle-U3MNYDKC.js} +4 -4
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.js +3 -3
  34. package/dist/{location-data-repository-SHEOIBTL.js → location-data-repository-HDNCU4Z4.js} +3 -3
  35. package/dist/{server-K76DL4S7.js → server-ZCX5X3N4.js} +76 -38
  36. package/dist/server-ZCX5X3N4.js.map +1 -0
  37. package/dist/{site-extract-repository-XNI4ZK2M.js → site-extract-repository-CKCJDP7N.js} +3 -3
  38. package/dist/{worker-OB6WSWOD.js → worker-73AYU4IK.js} +5 -5
  39. package/package.json +2 -1
  40. package/dist/chunk-6WLNXYRG.js.map +0 -1
  41. package/dist/chunk-FCFQ634B.js.map +0 -1
  42. package/dist/chunk-SXLQZKWC.js.map +0 -1
  43. package/dist/chunk-XQIVXIAL.js +0 -7
  44. package/dist/chunk-XQIVXIAL.js.map +0 -1
  45. package/dist/server-K76DL4S7.js.map +0 -1
  46. /package/dist/{chunk-ZBQ6EXZW.js.map → chunk-OVD4E4AP.js.map} +0 -0
  47. /package/dist/{chunk-6TAQ2MXK.js.map → chunk-RJMOOII7.js.map} +0 -0
  48. /package/dist/{chunk-ZDVQARDQ.js.map → chunk-T5AFM4G5.js.map} +0 -0
  49. /package/dist/{chunk-QOWBJ4YY.js.map → chunk-WT2UHDSE.js.map} +0 -0
  50. /package/dist/{chunk-GUI33Q27.js.map → chunk-WWIJ2NID.js.map} +0 -0
  51. /package/dist/{db-C5ELI55I.js.map → db-4ABEYNDM.js.map} +0 -0
  52. /package/dist/{extract-bundle-IOM45SFL.js.map → extract-bundle-U3MNYDKC.js.map} +0 -0
  53. /package/dist/{location-data-repository-SHEOIBTL.js.map → location-data-repository-HDNCU4Z4.js.map} +0 -0
  54. /package/dist/{site-extract-repository-XNI4ZK2M.js.map → site-extract-repository-CKCJDP7N.js.map} +0 -0
  55. /package/dist/{worker-OB6WSWOD.js.map → worker-73AYU4IK.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  harvest
3
- } from "./chunk-6TAQ2MXK.js";
3
+ } from "./chunk-RJMOOII7.js";
4
4
  import {
5
5
  recordVendorUsage
6
- } from "./chunk-ZDVQARDQ.js";
6
+ } from "./chunk-T5AFM4G5.js";
7
7
  import "./chunk-3ZUBQQPQ.js";
8
8
  import "./chunk-5UN33CGU.js";
9
- import "./chunk-FCFQ634B.js";
9
+ import "./chunk-5X7CJEK3.js";
10
10
 
11
11
  // src/video/VideoGenerator.ts
12
12
  import { execSync as execSync2 } from "child_process";
@@ -13,9 +13,9 @@ import {
13
13
  parseHostedCensusPlacesCsv,
14
14
  parseHostedZipGroupsCsv,
15
15
  queryHostedLocationMarkets
16
- } from "./chunk-QOWBJ4YY.js";
16
+ } from "./chunk-WT2UHDSE.js";
17
17
  import "./chunk-G3P3ZDB4.js";
18
- import "./chunk-FCFQ634B.js";
18
+ import "./chunk-5X7CJEK3.js";
19
19
  export {
20
20
  HOSTED_CENSUS_DATASET_PREFIX,
21
21
  HOSTED_ZIP_DATASET_KIND,
@@ -32,4 +32,4 @@ export {
32
32
  parseHostedZipGroupsCsv,
33
33
  queryHostedLocationMarkets
34
34
  };
35
- //# sourceMappingURL=location-data-repository-SHEOIBTL.js.map
35
+ //# sourceMappingURL=location-data-repository-HDNCU4Z4.js.map
@@ -4,20 +4,20 @@ import {
4
4
  harvestPageMedia,
5
5
  readOwnedSiteExtractArtifactBuffer,
6
6
  renewSiteExtractArtifactDownload
7
- } from "./chunk-6WLNXYRG.js";
7
+ } from "./chunk-27FMOD6S.js";
8
8
  import {
9
9
  REQUIRED_LOCATION_STATE_CODES,
10
10
  importHostedCensusPlacesCsv,
11
11
  importHostedZipGroupsCsv,
12
12
  listActiveHostedLocationDatasets
13
- } from "./chunk-QOWBJ4YY.js";
13
+ } from "./chunk-WT2UHDSE.js";
14
14
  import {
15
15
  classifyHarvestProblem,
16
16
  createHarvestAttemptRecorder,
17
17
  deliverWebhook,
18
18
  harvestProblemResponse,
19
19
  serializeHarvestProblem
20
- } from "./chunk-ZBQ6EXZW.js";
20
+ } from "./chunk-OVD4E4AP.js";
21
21
  import {
22
22
  AIModeSelectors,
23
23
  AIOverviewSelectors,
@@ -44,7 +44,7 @@ import {
44
44
  resolveKernelProxyId,
45
45
  serpArrivalUrl,
46
46
  withRuntimeUserAgent
47
- } from "./chunk-6TAQ2MXK.js";
47
+ } from "./chunk-RJMOOII7.js";
48
48
  import {
49
49
  ApiErrorResponseSchema,
50
50
  ArtifactTemplateConfigSchema,
@@ -86,7 +86,7 @@ import {
86
86
  renewDirectoryArtifactDownload,
87
87
  resolveDeploymentProfile,
88
88
  transcribeMediaUrl
89
- } from "./chunk-SXLQZKWC.js";
89
+ } from "./chunk-3FKUKMNE.js";
90
90
  import {
91
91
  auditImageUrls,
92
92
  auditImages,
@@ -114,7 +114,7 @@ import {
114
114
  recordKernelSession,
115
115
  recordVendorUsage,
116
116
  runWithCostContext
117
- } from "./chunk-ZDVQARDQ.js";
117
+ } from "./chunk-T5AFM4G5.js";
118
118
  import {
119
119
  listWorkflowDefinitions,
120
120
  runWorkflow,
@@ -142,7 +142,7 @@ import {
142
142
  } from "./chunk-3ZUBQQPQ.js";
143
143
  import {
144
144
  PACKAGE_VERSION
145
- } from "./chunk-XQIVXIAL.js";
145
+ } from "./chunk-4FQDZ2T7.js";
146
146
  import {
147
147
  abandonExtractSettlement,
148
148
  countSuccessfulPages,
@@ -165,7 +165,7 @@ import {
165
165
  setExtractJobTotal,
166
166
  settleExtractJob,
167
167
  terminalExtractJobStatus
168
- } from "./chunk-GUI33Q27.js";
168
+ } from "./chunk-WWIJ2NID.js";
169
169
  import {
170
170
  BROWSER_OPEN_MIN_BALANCE_MC,
171
171
  CONCURRENCY_PRICE_ID,
@@ -321,7 +321,7 @@ import {
321
321
  startHarvestAttempt,
322
322
  upsertPageSnapshot,
323
323
  verifyPassword
324
- } from "./chunk-FCFQ634B.js";
324
+ } from "./chunk-5X7CJEK3.js";
325
325
 
326
326
  // src/blog/registry.ts
327
327
  var posts = [
@@ -3775,6 +3775,9 @@ async function fetchWithKernel(url) {
3775
3775
  }
3776
3776
  }
3777
3777
 
3778
+ // src/lib/http-user-agent.ts
3779
+ var MCP_SCRAPER_CRAWLER_USER_AGENT = "MCPScraperBot/1.0 (+https://mcpscraper.dev)";
3780
+
3778
3781
  // src/api/kpo-extractor.ts
3779
3782
  async function extractKpo(opts) {
3780
3783
  const start = Date.now();
@@ -3784,7 +3787,7 @@ async function extractKpo(opts) {
3784
3787
  let target = parsed.href;
3785
3788
  for (let redirects = 0; redirects < 5; redirects++) {
3786
3789
  const res = await fetch(target, {
3787
- headers: { "User-Agent": "Mozilla/5.0 (compatible; ThorbitBot/1.0)" },
3790
+ headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT },
3788
3791
  signal: AbortSignal.timeout(15e3),
3789
3792
  redirect: "manual"
3790
3793
  });
@@ -4505,7 +4508,6 @@ var SKIP_PATH_PREFIXES = [
4505
4508
  ];
4506
4509
  var SKIP_QUERY_PARAMS = ["replytocom", "p", "preview", "ver", "v"];
4507
4510
  var KERNEL_RETRY_LIMIT = 15;
4508
- var UA = "Mozilla/5.0 (compatible; ThorbitBot/1.0; +https://thorbit.ai)";
4509
4511
  var MAX_DISCOVERED_URL_CHARS = 4096;
4510
4512
  var MAX_DISCOVERY_FRONTIER_BYTES = 4 * 1024 * 1024;
4511
4513
  function boundedDiscoveredUrl(value) {
@@ -4557,7 +4559,7 @@ async function fetchText(url, auditedHost, timeoutMs = 1e4) {
4557
4559
  const checked = await validatePublicHttpUrl(target, { field: "sitemap URL" });
4558
4560
  if (checked.error || !checked.parsed || !sameAuditedHost(checked.parsed, auditedHost)) return null;
4559
4561
  const res = await fetch(checked.parsed.href, {
4560
- headers: { "User-Agent": UA },
4562
+ headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT },
4561
4563
  signal: AbortSignal.timeout(timeoutMs),
4562
4564
  redirect: "manual"
4563
4565
  });
@@ -4675,7 +4677,7 @@ async function fetchPage(url, timeoutMs) {
4675
4677
  const checked = await validatePublicHttpUrl(target, { field: "page URL" });
4676
4678
  if (checked.error || !checked.parsed || !sameAuditedHost(checked.parsed, auditedHost)) return { html: null, status: null };
4677
4679
  const res = await fetch(checked.parsed.href, {
4678
- headers: { "User-Agent": UA, "Accept": "text/html,application/xhtml+xml" },
4680
+ headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT, "Accept": "text/html,application/xhtml+xml" },
4679
4681
  signal: AbortSignal.timeout(timeoutMs),
4680
4682
  redirect: "manual"
4681
4683
  });
@@ -5621,7 +5623,6 @@ function makeSeedSpider(startUrl, urls) {
5621
5623
  sitemapUrls: []
5622
5624
  };
5623
5625
  }
5624
- var UA2 = "Mozilla/5.0 (compatible; ThorbitBot/1.0; +https://thorbit.ai)";
5625
5626
  var EXTRACT_CONCURRENCY = 6;
5626
5627
  var MAX_PAGE_MARKDOWN = 4e4;
5627
5628
  var PAGE_DATA_LIMITS = {
@@ -5983,7 +5984,7 @@ async function fetchPagePlain(url) {
5983
5984
  try {
5984
5985
  for (let redirects = 0; redirects <= 5; redirects++) {
5985
5986
  const res = await fetch(target, {
5986
- headers: { "User-Agent": UA2, "Accept": "text/html,application/xhtml+xml" },
5987
+ headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT, "Accept": "text/html,application/xhtml+xml" },
5987
5988
  signal: AbortSignal.timeout(15e3),
5988
5989
  redirect: "manual"
5989
5990
  });
@@ -8666,7 +8667,7 @@ var siteExtractFn = inngest.createFunction(
8666
8667
  });
8667
8668
  }) : null;
8668
8669
  const finalized = await step.run("finalize", async () => {
8669
- const { assembleExtractArtifacts } = await import("./extract-bundle-IOM45SFL.js");
8670
+ const { assembleExtractArtifacts } = await import("./extract-bundle-U3MNYDKC.js");
8670
8671
  const current = await getExtractJob(jobId2);
8671
8672
  if (!current) throw new Error("extract job disappeared before finalization");
8672
8673
  const stored = await assembleExtractArtifacts(current, { branding, imageAudit });
@@ -9608,7 +9609,7 @@ async function resolveUsZipsPath(requestedPath) {
9608
9609
  async function loadZipGroups(stateAbbr, requestedPath, warnings, sourceMode) {
9609
9610
  const mode = resolvedLocationDataMode({ zipSource: sourceMode });
9610
9611
  if (mode === "hosted") {
9611
- const { getHostedZipGroups } = await import("./location-data-repository-SHEOIBTL.js");
9612
+ const { getHostedZipGroups } = await import("./location-data-repository-HDNCU4Z4.js");
9612
9613
  const hosted = await getHostedZipGroups(stateAbbr);
9613
9614
  if (!hosted.dataset) {
9614
9615
  throw new DirectoryLocationError(
@@ -9671,7 +9672,7 @@ async function resolveDirectoryMarkets(options, config = {}) {
9671
9672
  const sourceUrl = censusStateUrl(state.fips);
9672
9673
  const warnings = [];
9673
9674
  if (resolvedLocationDataMode(config) === "hosted") {
9674
- const { queryHostedLocationMarkets } = await import("./location-data-repository-SHEOIBTL.js");
9675
+ const { queryHostedLocationMarkets } = await import("./location-data-repository-HDNCU4Z4.js");
9675
9676
  const hosted = await queryHostedLocationMarkets({
9676
9677
  state: state.abbr,
9677
9678
  minPopulation: options.minPopulation,
@@ -25549,6 +25550,31 @@ var ACCESS_TTL_SECONDS = 3600;
25549
25550
  var REFRESH_TTL_SECONDS = 60 * 60 * 24 * 30;
25550
25551
  var CODE_TTL_SECONDS = 60;
25551
25552
  var ROTATION_GRACE_SECONDS = 120;
25553
+ var OAUTH_DATABASE_TIMEOUT_MS = 5e3;
25554
+ var OAuthDatabaseUnavailableError = class extends Error {
25555
+ stage;
25556
+ constructor(stage) {
25557
+ super("The authorization service database is temporarily unavailable.");
25558
+ this.name = "OAuthDatabaseUnavailableError";
25559
+ this.stage = stage;
25560
+ }
25561
+ };
25562
+ async function withOAuthDatabaseDeadline(stage, operation, timeoutMs = OAUTH_DATABASE_TIMEOUT_MS) {
25563
+ const startedAt = Date.now();
25564
+ let timeout;
25565
+ try {
25566
+ const value = await Promise.race([
25567
+ operation,
25568
+ new Promise((_, reject) => {
25569
+ timeout = setTimeout(() => reject(new OAuthDatabaseUnavailableError(stage)), timeoutMs);
25570
+ })
25571
+ ]);
25572
+ console.log("[oauth-db] stage=%s status=ok duration_ms=%d", stage, Date.now() - startedAt);
25573
+ return value;
25574
+ } finally {
25575
+ if (timeout) clearTimeout(timeout);
25576
+ }
25577
+ }
25552
25578
  var secureCookies = process.env.NODE_ENV === "production" || process.env.VERCEL === "1";
25553
25579
  var sessionCookieOptions = {
25554
25580
  httpOnly: true,
@@ -25611,7 +25637,7 @@ async function sessionUser(token4) {
25611
25637
  if (!token4) return null;
25612
25638
  const userId = verifySession(token4);
25613
25639
  if (!userId) return null;
25614
- const user = await getUserById(userId);
25640
+ const user = await withOAuthDatabaseDeadline("session-user", getUserById(userId));
25615
25641
  return user ?? null;
25616
25642
  }
25617
25643
  function escapeHtml(value) {
@@ -25701,6 +25727,18 @@ function redirectWithError(redirectUri, state, error) {
25701
25727
  return new Response(null, { status: 302, headers: { Location: u.toString() } });
25702
25728
  }
25703
25729
  var oauthApp = new Hono23();
25730
+ oauthApp.onError((error, c) => {
25731
+ if (error instanceof OAuthDatabaseUnavailableError) {
25732
+ console.error("[oauth-db] stage=%s status=timeout timeout_ms=%d", error.stage, OAUTH_DATABASE_TIMEOUT_MS);
25733
+ c.header("Retry-After", "5");
25734
+ return c.json({
25735
+ error: "temporarily_unavailable",
25736
+ error_description: "Authorization is temporarily unavailable. Please retry shortly."
25737
+ }, 503);
25738
+ }
25739
+ console.error("[oauth] unhandled error:", error);
25740
+ return c.json({ error: "server_error", error_description: "Authorization could not be completed." }, 500);
25741
+ });
25704
25742
  oauthApp.use("*", async (c, next) => {
25705
25743
  c.header("Access-Control-Allow-Origin", "*");
25706
25744
  c.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
@@ -25783,7 +25821,7 @@ oauthApp.post("/oauth/register", async (c) => {
25783
25821
  }
25784
25822
  const clientName = typeof body.client_name === "string" ? body.client_name : null;
25785
25823
  const clientId = `client_${randomBytes2(16).toString("hex")}`;
25786
- await registerClient(clientId, redirectUris, clientName);
25824
+ await withOAuthDatabaseDeadline("register-client", registerClient(clientId, redirectUris, clientName));
25787
25825
  console.log("[oauth-dcr] register OK client_id=%s redirect_uris=%s", clientId, JSON.stringify(redirectUris));
25788
25826
  return c.json({
25789
25827
  client_id: clientId,
@@ -25810,7 +25848,7 @@ function parseAuthParams(get) {
25810
25848
  async function validateAuthRequest(p) {
25811
25849
  if (p.response_type !== "code") return { ok: false, status: 400, message: "response_type must be code" };
25812
25850
  if (!p.client_id) return { ok: false, status: 400, message: "client_id is required" };
25813
- const client2 = await getClient(p.client_id);
25851
+ const client2 = await withOAuthDatabaseDeadline("get-client", getClient(p.client_id));
25814
25852
  if (!client2) return { ok: false, status: 400, message: "unknown client_id" };
25815
25853
  if (!p.redirect_uri || !client2.redirect_uris.includes(p.redirect_uri)) return { ok: false, status: 400, message: "redirect_uri does not match the registered set" };
25816
25854
  if (!isAllowedRedirect(p.redirect_uri)) return { ok: false, status: 400, message: "redirect_uri host not allowed" };
@@ -25843,7 +25881,7 @@ oauthApp.post("/oauth/authorize", async (c) => {
25843
25881
  if (action === "login") {
25844
25882
  const email = (get("email") ?? "").trim().toLowerCase();
25845
25883
  const password = get("password") ?? "";
25846
- const user2 = email ? await getUserByEmail(email) : void 0;
25884
+ const user2 = email ? await withOAuthDatabaseDeadline("login-user", getUserByEmail(email)) : void 0;
25847
25885
  const okPw = !!(user2 && user2.password_hash && verifyPassword(password, user2.password_hash));
25848
25886
  console.log("[oauth-dcr] LOGIN email=%s found=%s hasHash=%s pwLen=%d ok=%s", email, !!user2, !!(user2 && user2.password_hash), password.length, okPw);
25849
25887
  if (!okPw) {
@@ -25859,7 +25897,7 @@ oauthApp.post("/oauth/authorize", async (c) => {
25859
25897
  const scope = negotiateScope(p.scope, user, p.resource);
25860
25898
  const code = `code_${randomBytes2(32).toString("base64url")}`;
25861
25899
  const expiresAt = new Date(Date.now() + CODE_TTL_SECONDS * 1e3).toISOString();
25862
- await putCode({
25900
+ await withOAuthDatabaseDeadline("put-authorization-code", putCode({
25863
25901
  code,
25864
25902
  client_id: p.client_id,
25865
25903
  redirect_uri: p.redirect_uri,
@@ -25868,7 +25906,7 @@ oauthApp.post("/oauth/authorize", async (c) => {
25868
25906
  scope,
25869
25907
  resource: p.resource || RESOURCE(),
25870
25908
  expires_at: expiresAt
25871
- });
25909
+ }));
25872
25910
  const u = new URL(p.redirect_uri);
25873
25911
  u.searchParams.set("code", code);
25874
25912
  if (p.state) u.searchParams.set("state", p.state);
@@ -25898,18 +25936,18 @@ oauthApp.post("/oauth/token", async (c) => {
25898
25936
  const clientId = get("client_id") ?? "";
25899
25937
  const redirectUri = get("redirect_uri") ?? "";
25900
25938
  const verifier = get("code_verifier") ?? "";
25901
- const record = await consumeCode(code);
25939
+ const record = await withOAuthDatabaseDeadline("consume-authorization-code", consumeCode(code));
25902
25940
  if (!record) return tokenErrorResponse(c, "invalid_grant", "Authorization code is invalid or already used", 400);
25903
25941
  if (new Date(record.expires_at).getTime() < Date.now()) return tokenErrorResponse(c, "invalid_grant", "Authorization code has expired", 400);
25904
25942
  if (record.client_id !== clientId) return tokenErrorResponse(c, "invalid_grant", "client_id mismatch", 400);
25905
25943
  if (record.redirect_uri !== redirectUri) return tokenErrorResponse(c, "invalid_grant", "redirect_uri mismatch", 400);
25906
25944
  if (!pkceMatches(verifier, record.code_challenge)) return tokenErrorResponse(c, "invalid_grant", "PKCE verification failed", 400);
25907
- const user = await getUserByEmail(record.identity);
25945
+ const user = await withOAuthDatabaseDeadline("token-user", getUserByEmail(record.identity));
25908
25946
  const plan = user ? resolvePlan(user) : "free";
25909
25947
  const audience = record.resource ?? RESOURCE();
25910
25948
  const accessToken = await mintAccessToken(record.identity, record.scope, plan, audience);
25911
25949
  const refreshToken = `rt_${randomBytes2(40).toString("base64url")}`;
25912
- await putRefresh({
25950
+ await withOAuthDatabaseDeadline("put-refresh-token", putRefresh({
25913
25951
  refresh_token: refreshToken,
25914
25952
  client_id: clientId,
25915
25953
  identity: record.identity,
@@ -25917,15 +25955,15 @@ oauthApp.post("/oauth/token", async (c) => {
25917
25955
  resource: audience,
25918
25956
  expires_at: new Date(Date.now() + REFRESH_TTL_SECONDS * 1e3).toISOString(),
25919
25957
  revoked: 0
25920
- });
25958
+ }));
25921
25959
  return c.json({ access_token: accessToken, token_type: "Bearer", expires_in: ACCESS_TTL_SECONDS, refresh_token: refreshToken, scope: record.scope });
25922
25960
  }
25923
25961
  if (grantType === "refresh_token") {
25924
25962
  const refreshToken = get("refresh_token") ?? "";
25925
25963
  const clientId = get("client_id") ?? "";
25926
- const record = await getRefresh(refreshToken);
25964
+ const record = await withOAuthDatabaseDeadline("get-refresh-token", getRefresh(refreshToken));
25927
25965
  if (record && record.revoked && record.replaced_by && record.rotated_at && Date.now() - new Date(record.rotated_at).getTime() < ROTATION_GRACE_SECONDS * 1e3 && (!clientId || record.client_id === clientId)) {
25928
- const graceUser = await getUserByEmail(record.identity);
25966
+ const graceUser = await withOAuthDatabaseDeadline("refresh-grace-user", getUserByEmail(record.identity));
25929
25967
  const gracePlan = graceUser ? resolvePlan(graceUser) : "free";
25930
25968
  const graceAudience = record.resource ?? RESOURCE();
25931
25969
  const graceAccess = await mintAccessToken(record.identity, record.scope, gracePlan, graceAudience);
@@ -25934,12 +25972,12 @@ oauthApp.post("/oauth/token", async (c) => {
25934
25972
  if (!record || record.revoked) return tokenErrorResponse(c, "invalid_grant", "Refresh token is invalid or revoked", 400);
25935
25973
  if (new Date(record.expires_at).getTime() < Date.now()) return tokenErrorResponse(c, "invalid_grant", "Refresh token has expired", 400);
25936
25974
  if (clientId && record.client_id !== clientId) return tokenErrorResponse(c, "invalid_grant", "client_id mismatch", 400);
25937
- const user = await getUserByEmail(record.identity);
25975
+ const user = await withOAuthDatabaseDeadline("refresh-user", getUserByEmail(record.identity));
25938
25976
  const plan = user ? resolvePlan(user) : "free";
25939
25977
  const audience = record.resource ?? RESOURCE();
25940
25978
  const accessToken = await mintAccessToken(record.identity, record.scope, plan, audience);
25941
25979
  const nextRefresh = `rt_${randomBytes2(40).toString("base64url")}`;
25942
- await rotateRefresh(refreshToken, {
25980
+ await withOAuthDatabaseDeadline("rotate-refresh-token", rotateRefresh(refreshToken, {
25943
25981
  refresh_token: nextRefresh,
25944
25982
  client_id: record.client_id,
25945
25983
  identity: record.identity,
@@ -25947,7 +25985,7 @@ oauthApp.post("/oauth/token", async (c) => {
25947
25985
  resource: audience,
25948
25986
  expires_at: new Date(Date.now() + REFRESH_TTL_SECONDS * 1e3).toISOString(),
25949
25987
  revoked: 0
25950
- });
25988
+ }));
25951
25989
  return c.json({ access_token: accessToken, token_type: "Bearer", expires_in: ACCESS_TTL_SECONDS, refresh_token: nextRefresh, scope: record.scope });
25952
25990
  }
25953
25991
  return tokenErrorResponse(c, "unsupported_grant_type", "grant_type must be authorization_code or refresh_token", 400);
@@ -37172,7 +37210,7 @@ app.get("/cron/tick", async (c) => {
37172
37210
  if (!process.env.CRON_SECRET || secret2 !== `Bearer ${process.env.CRON_SECRET}`) {
37173
37211
  return c.json({ error: "Unauthorized" }, 401);
37174
37212
  }
37175
- const { drainQueue } = await import("./worker-OB6WSWOD.js");
37213
+ const { drainQueue } = await import("./worker-73AYU4IK.js");
37176
37214
  const budget = { maxJobs: 10, deadlineMs: Date.now() + 28e4 };
37177
37215
  const workflowDispatchResult = await dispatchDueWorkflowSchedules(`${new URL(c.req.url).protocol}//${new URL(c.req.url).host}`);
37178
37216
  const [results, sweepResult, reapResult, expiredResult, blobCleanup, connectedDataArtifactCleanup, connectedAccountBilling, directoryWorkflowDispatch, directoryWorkflowReconciliation, directoryArtifactCleanup, siteExtractArtifactCleanup, siteExtractRedispatch, siteExtractReconciliation, paaHarvestRedispatch, paaHarvestReconciliation] = await Promise.all([
@@ -37225,8 +37263,8 @@ app.post("/api/internal/extract-refinalize/:id", async (c) => {
37225
37263
  finishExtractJob: finishExtractJob2,
37226
37264
  terminalExtractJobStatus: terminalExtractJobStatus2,
37227
37265
  extractJobLimitInfo: extractJobLimitInfo2
37228
- } = await import("./site-extract-repository-XNI4ZK2M.js");
37229
- const { assembleExtractArtifacts } = await import("./extract-bundle-IOM45SFL.js");
37266
+ } = await import("./site-extract-repository-CKCJDP7N.js");
37267
+ const { assembleExtractArtifacts } = await import("./extract-bundle-U3MNYDKC.js");
37230
37268
  const existing = await getExtractJob2(jobId2);
37231
37269
  if (!existing) return c.json({ error: "job not found" }, 404);
37232
37270
  if (existing.status !== "failed") {
@@ -37253,7 +37291,7 @@ app.post("/api/internal/extract-refinalize/:id", async (c) => {
37253
37291
  if (!updated) return c.json({ error: "job state changed during re-finalization" }, 409);
37254
37292
  let settlement = "already_settled_or_refunded";
37255
37293
  if (job.billedMc == null && job.userId != null) {
37256
- const { settleExtractJob: settleExtractJob3, countSuccessfulPages: countSuccessfulPages2 } = await import("./site-extract-repository-XNI4ZK2M.js");
37294
+ const { settleExtractJob: settleExtractJob3, countSuccessfulPages: countSuccessfulPages2 } = await import("./site-extract-repository-CKCJDP7N.js");
37257
37295
  const heldMc = Number(job.options.heldMc ?? 0);
37258
37296
  const successful = await countSuccessfulPages2(jobId2);
37259
37297
  const usedMc = Math.min(successful * MC_COSTS.page_scrape, heldMc);
@@ -37432,4 +37470,4 @@ app.get("/blog/:slug/", (c) => {
37432
37470
  export {
37433
37471
  app
37434
37472
  };
37435
- //# sourceMappingURL=server-K76DL4S7.js.map
37473
+ //# sourceMappingURL=server-ZCX5X3N4.js.map