unbrowse 10.1.4 → 10.1.5

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": "unbrowse",
3
- "version": "10.1.4",
3
+ "version": "10.1.5",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/unbrowse-ai/unbrowse.git"
package/runtime/cli.js CHANGED
@@ -64923,7 +64923,7 @@ var init_telemetry = __esm(() => {
64923
64923
  });
64924
64924
 
64925
64925
  // .tmp-runtime-src/build-info.generated.ts
64926
- var BUILD_RELEASE_VERSION = "10.1.4", BUILD_GIT_SHA = "089d49f75f26", BUILD_CODE_HASH = "5d9ebf619c61", BUILD_RELEASE_MANIFEST_BASE64 = "eyJzY2hlbWFfdmVyc2lvbiI6MSwicmVsZWFzZV92ZXJzaW9uIjoiMTAuMS40IiwiZ2l0X3NoYSI6IjA4OWQ0OWY3NWYyNiIsImNvZGVfaGFzaCI6IjVkOWViZjYxOWM2MSIsInRyYWNlX3ZlcnNpb24iOiI1ZDllYmY2MTljNjFAMDg5ZDQ5Zjc1ZjI2IiwiaXNzdWVkX2F0IjoiMjAyNi0wNi0yM1QxMDowNjoyMy45MjNaIn0", BUILD_RELEASE_MANIFEST_SIGNATURE = "cDbcbJgh0OyGCynwPC9q8d8xvPCtfzsY9H0lAtidjN4", BUILD_DEFAULT_BACKEND_URL = "https://beta-api.unbrowse.ai", BUILD_DEFAULT_PROFILE = "";
64926
+ var BUILD_RELEASE_VERSION = "10.1.5", BUILD_GIT_SHA = "8eceb88fcef6", BUILD_CODE_HASH = "5d9ebf619c61", BUILD_RELEASE_MANIFEST_BASE64 = "eyJzY2hlbWFfdmVyc2lvbiI6MSwicmVsZWFzZV92ZXJzaW9uIjoiMTAuMS41IiwiZ2l0X3NoYSI6IjhlY2ViODhmY2VmNiIsImNvZGVfaGFzaCI6IjVkOWViZjYxOWM2MSIsInRyYWNlX3ZlcnNpb24iOiI1ZDllYmY2MTljNjFAOGVjZWI4OGZjZWY2IiwiaXNzdWVkX2F0IjoiMjAyNi0wNi0yM1QxMDo1MTo0OC45MThaIn0", BUILD_RELEASE_MANIFEST_SIGNATURE = "O20RJ_2xTauDd3yWJFVqNsYakrh0Cfd67uJvkSxypBQ", BUILD_DEFAULT_BACKEND_URL = "https://beta-api.unbrowse.ai", BUILD_DEFAULT_PROFILE = "";
64927
64927
 
64928
64928
  // .tmp-runtime-src/version.ts
64929
64929
  import { createHash as createHash8 } from "crypto";
@@ -199855,6 +199855,7 @@ async function resolveAndExecute(intent, params = {}, context, projection, optio
199855
199855
  return null;
199856
199856
  };
199857
199857
  let directFetchCookieHeader = "";
199858
+ let directFetchCookiesAttached = 0;
199858
199859
  try {
199859
199860
  const dfHost = new URL(ctxUrl).hostname.replace(/^www\./, "");
199860
199861
  const { extractBrowserCookies: extractBrowserCookies2 } = await Promise.resolve().then(() => (init_browser_cookies(), exports_browser_cookies));
@@ -199865,6 +199866,7 @@ async function resolveAndExecute(intent, params = {}, context, projection, optio
199865
199866
  return `${c.name}=${v}`;
199866
199867
  }).filter((pair) => !pair.endsWith("=")).join("; ");
199867
199868
  if (directFetchCookieHeader) {
199869
+ directFetchCookiesAttached = directFetchCookieHeader.split("; ").filter(Boolean).length;
199868
199870
  console.log(`[direct-fetch] ${ctxUrl} attaching ${dfCookies.length} browser cookie(s) for ${dfHost} on native fetch`);
199869
199871
  }
199870
199872
  }
@@ -199986,7 +199988,8 @@ async function resolveAndExecute(intent, params = {}, context, projection, optio
199986
199988
  trace: trace2,
199987
199989
  source: "direct-fetch",
199988
199990
  skill: undefined,
199989
- timing: t
199991
+ timing: t,
199992
+ ...directFetchCookiesAttached > 0 ? { cookies_injected: directFetchCookiesAttached } : {}
199990
199993
  };
199991
199994
  }
199992
199995
  } else if (directRes.status === 403 || directRes.status === 429 || directRes.status === 503) {
@@ -293992,6 +293995,7 @@ async function handler14(parsed, opts) {
293992
293995
  const conn = wsEndpoint ? await attach(wsEndpoint) : await spawnChrome({ headless: true, perContextProxy: false, persist: true });
293993
293996
  const target = await createTarget(conn, url, {});
293994
293997
  let cookiesInjected = 0;
293998
+ let injectedCookies = [];
293995
293999
  try {
293996
294000
  const { shouldImportBrowserCookies: shouldImportBrowserCookies2 } = await init_auth().then(() => exports_auth);
293997
294001
  if (shouldImportBrowserCookies2()) {
@@ -293999,6 +294003,7 @@ async function handler14(parsed, opts) {
293999
294003
  const { findBestBrowserSession: findBestBrowserSession3, extractBrowserCookies: extractBrowserCookies3 } = await Promise.resolve().then(() => (init_browser_cookies(), exports_browser_cookies));
294000
294004
  const best = findBestBrowserSession3(host);
294001
294005
  const cookies = best?.cookies ?? extractBrowserCookies3(host).cookies;
294006
+ injectedCookies = cookies.map((c) => ({ name: c.name, value: c.value }));
294002
294007
  if (cookies.length > 0) {
294003
294008
  const toCdpSameSite = (s) => {
294004
294009
  const v = (s ?? "").toLowerCase();
@@ -294052,6 +294057,44 @@ async function handler14(parsed, opts) {
294052
294057
  process.stderr.write(`[page] act go: body read skipped: ${readErr instanceof Error ? readErr.message : String(readErr)}
294053
294058
  `);
294054
294059
  }
294060
+ const decodesToJsonRecord = (s) => {
294061
+ if (!s)
294062
+ return false;
294063
+ const t = s.trim();
294064
+ if (!(t.startsWith("{") || t.startsWith("[")))
294065
+ return false;
294066
+ try {
294067
+ const v = JSON.parse(t);
294068
+ return v !== null && typeof v === "object";
294069
+ } catch {
294070
+ return false;
294071
+ }
294072
+ };
294073
+ if (!decodesToJsonRecord(pageText) && injectedCookies.length > 0) {
294074
+ try {
294075
+ const cookieHeader = injectedCookies.map((c) => {
294076
+ const v = c.value.startsWith('"') && c.value.endsWith('"') ? c.value.slice(1, -1) : c.value;
294077
+ return `${c.name}=${v}`;
294078
+ }).join("; ");
294079
+ const ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
294080
+ const res = await fetch(url, {
294081
+ headers: { Cookie: cookieHeader, "User-Agent": ua, Accept: "application/json" },
294082
+ signal: AbortSignal.timeout(1e4)
294083
+ });
294084
+ const directBody = await res.text();
294085
+ if (decodesToJsonRecord(directBody)) {
294086
+ pageText = directBody.slice(0, 200000);
294087
+ process.stderr.write(`[auth] act go: navigated body unstructured/walled; supplemented page.text from authenticated direct fetch (status ${res.status}, ${directBody.length} bytes)
294088
+ `);
294089
+ } else {
294090
+ process.stderr.write(`[auth] act go: direct-fetch supplement skipped — body not a JSON record (status ${res.status})
294091
+ `);
294092
+ }
294093
+ } catch (directErr) {
294094
+ process.stderr.write(`[auth] act go: direct-fetch supplement failed: ${directErr instanceof Error ? directErr.message : String(directErr)}
294095
+ `);
294096
+ }
294097
+ }
294055
294098
  let captcha;
294056
294099
  if (parsed.flags.solve === true || process.env.UNBROWSE_AUTO_SOLVE === "1") {
294057
294100
  const { clearCaptchaInRender: clearCaptchaInRender2 } = await Promise.resolve().then(() => (init_captcha_render(), exports_captcha_render));
@@ -304859,6 +304902,30 @@ async function cmdRun(args, flags, verb = "run") {
304859
304902
  run_plan: runPlan
304860
304903
  };
304861
304904
  }
304905
+ const isActGoNavigateVariant = (() => {
304906
+ const i = (intent ?? "").trim().toLowerCase();
304907
+ return i === "act go" || i === "go" || i === "act read" || i === "read";
304908
+ })();
304909
+ function mirrorNavigateBodyToPage(result) {
304910
+ if (!isActGoNavigateVariant)
304911
+ return result;
304912
+ if ("page" in result)
304913
+ return result;
304914
+ if (result.source !== "direct-fetch")
304915
+ return result;
304916
+ const body = result.result;
304917
+ if (body === null || typeof body !== "object")
304918
+ return result;
304919
+ let text3;
304920
+ try {
304921
+ text3 = JSON.stringify(body);
304922
+ } catch {
304923
+ return result;
304924
+ }
304925
+ if (!text3)
304926
+ return result;
304927
+ return { ...result, page: { text: text3.slice(0, 200000) } };
304928
+ }
304862
304929
  function endpointsDiscovered(result) {
304863
304930
  if (typeof result.endpoints_discovered === "number")
304864
304931
  return result.endpoints_discovered;
@@ -304969,11 +305036,11 @@ async function cmdRun(args, flags, verb = "run") {
304969
305036
  return;
304970
305037
  }
304971
305038
  if (isResolveSuccessResult(result)) {
304972
- output(decorate(result), !!flags.pretty);
305039
+ output(decorate(mirrorNavigateBodyToPage(result)), !!flags.pretty);
304973
305040
  return;
304974
305041
  }
304975
305042
  if (!shouldIndexFallback(result)) {
304976
- output(decorate(result), !!flags.pretty);
305043
+ output(decorate(mirrorNavigateBodyToPage(result)), !!flags.pretty);
304977
305044
  return;
304978
305045
  }
304979
305046
  if (flags["no-index"]) {
@@ -304999,7 +305066,7 @@ async function cmdRun(args, flags, verb = "run") {
304999
305066
  if (!captureLooksThin(capture)) {
305000
305067
  result = await resolveStep("after_index");
305001
305068
  if (isResolveSuccessResult(result)) {
305002
- output(decorate(result), !!flags.pretty);
305069
+ output(decorate(mirrorNavigateBodyToPage(result)), !!flags.pretty);
305003
305070
  return;
305004
305071
  }
305005
305072
  if (resolveResultError(result) === "auth_required") {
package/runtime/mcp.js CHANGED
@@ -101443,7 +101443,7 @@ async function mergedAuthHeaders(key, signer) {
101443
101443
  var AUTH_DOMAIN = "unbrowse-auth:v1";
101444
101444
 
101445
101445
  // .tmp-runtime-src/build-info.generated.ts
101446
- var BUILD_RELEASE_VERSION = "10.1.4", BUILD_GIT_SHA = "089d49f75f26", BUILD_CODE_HASH = "5d9ebf619c61", BUILD_RELEASE_MANIFEST_BASE64 = "eyJzY2hlbWFfdmVyc2lvbiI6MSwicmVsZWFzZV92ZXJzaW9uIjoiMTAuMS40IiwiZ2l0X3NoYSI6IjA4OWQ0OWY3NWYyNiIsImNvZGVfaGFzaCI6IjVkOWViZjYxOWM2MSIsInRyYWNlX3ZlcnNpb24iOiI1ZDllYmY2MTljNjFAMDg5ZDQ5Zjc1ZjI2IiwiaXNzdWVkX2F0IjoiMjAyNi0wNi0yM1QxMDowNjoyMy45MjNaIn0", BUILD_RELEASE_MANIFEST_SIGNATURE = "cDbcbJgh0OyGCynwPC9q8d8xvPCtfzsY9H0lAtidjN4", BUILD_DEFAULT_BACKEND_URL = "https://beta-api.unbrowse.ai", BUILD_DEFAULT_PROFILE = "";
101446
+ var BUILD_RELEASE_VERSION = "10.1.5", BUILD_GIT_SHA = "8eceb88fcef6", BUILD_CODE_HASH = "5d9ebf619c61", BUILD_RELEASE_MANIFEST_BASE64 = "eyJzY2hlbWFfdmVyc2lvbiI6MSwicmVsZWFzZV92ZXJzaW9uIjoiMTAuMS41IiwiZ2l0X3NoYSI6IjhlY2ViODhmY2VmNiIsImNvZGVfaGFzaCI6IjVkOWViZjYxOWM2MSIsInRyYWNlX3ZlcnNpb24iOiI1ZDllYmY2MTljNjFAOGVjZWI4OGZjZWY2IiwiaXNzdWVkX2F0IjoiMjAyNi0wNi0yM1QxMDo1MTo0OC45MThaIn0", BUILD_RELEASE_MANIFEST_SIGNATURE = "O20RJ_2xTauDd3yWJFVqNsYakrh0Cfd67uJvkSxypBQ", BUILD_DEFAULT_BACKEND_URL = "https://beta-api.unbrowse.ai", BUILD_DEFAULT_PROFILE = "";
101447
101447
 
101448
101448
  // .tmp-runtime-src/version.ts
101449
101449
  import { createHash as createHash6 } from "crypto";
@@ -196992,6 +196992,7 @@ async function resolveAndExecute(intent, params = {}, context, projection, optio
196992
196992
  return null;
196993
196993
  };
196994
196994
  let directFetchCookieHeader = "";
196995
+ let directFetchCookiesAttached = 0;
196995
196996
  try {
196996
196997
  const dfHost = new URL(ctxUrl).hostname.replace(/^www\./, "");
196997
196998
  const { extractBrowserCookies: extractBrowserCookies2 } = await Promise.resolve().then(() => (init_browser_cookies(), exports_browser_cookies));
@@ -197002,6 +197003,7 @@ async function resolveAndExecute(intent, params = {}, context, projection, optio
197002
197003
  return `${c.name}=${v}`;
197003
197004
  }).filter((pair) => !pair.endsWith("=")).join("; ");
197004
197005
  if (directFetchCookieHeader) {
197006
+ directFetchCookiesAttached = directFetchCookieHeader.split("; ").filter(Boolean).length;
197005
197007
  console.log(`[direct-fetch] ${ctxUrl} attaching ${dfCookies.length} browser cookie(s) for ${dfHost} on native fetch`);
197006
197008
  }
197007
197009
  }
@@ -197123,7 +197125,8 @@ async function resolveAndExecute(intent, params = {}, context, projection, optio
197123
197125
  trace: trace2,
197124
197126
  source: "direct-fetch",
197125
197127
  skill: undefined,
197126
- timing: t
197128
+ timing: t,
197129
+ ...directFetchCookiesAttached > 0 ? { cookies_injected: directFetchCookiesAttached } : {}
197127
197130
  };
197128
197131
  }
197129
197132
  } else if (directRes.status === 403 || directRes.status === 429 || directRes.status === 503) {
@@ -286020,6 +286023,7 @@ async function handler14(parsed, opts) {
286020
286023
  const conn = wsEndpoint ? await attach(wsEndpoint) : await spawnChrome({ headless: true, perContextProxy: false, persist: true });
286021
286024
  const target = await createTarget(conn, url, {});
286022
286025
  let cookiesInjected = 0;
286026
+ let injectedCookies = [];
286023
286027
  try {
286024
286028
  const { shouldImportBrowserCookies: shouldImportBrowserCookies2 } = await init_auth().then(() => exports_auth);
286025
286029
  if (shouldImportBrowserCookies2()) {
@@ -286027,6 +286031,7 @@ async function handler14(parsed, opts) {
286027
286031
  const { findBestBrowserSession: findBestBrowserSession2, extractBrowserCookies: extractBrowserCookies2 } = await Promise.resolve().then(() => (init_browser_cookies(), exports_browser_cookies));
286028
286032
  const best = findBestBrowserSession2(host);
286029
286033
  const cookies = best?.cookies ?? extractBrowserCookies2(host).cookies;
286034
+ injectedCookies = cookies.map((c) => ({ name: c.name, value: c.value }));
286030
286035
  if (cookies.length > 0) {
286031
286036
  const toCdpSameSite = (s) => {
286032
286037
  const v = (s ?? "").toLowerCase();
@@ -286080,6 +286085,44 @@ async function handler14(parsed, opts) {
286080
286085
  process.stderr.write(`[page] act go: body read skipped: ${readErr instanceof Error ? readErr.message : String(readErr)}
286081
286086
  `);
286082
286087
  }
286088
+ const decodesToJsonRecord = (s) => {
286089
+ if (!s)
286090
+ return false;
286091
+ const t = s.trim();
286092
+ if (!(t.startsWith("{") || t.startsWith("[")))
286093
+ return false;
286094
+ try {
286095
+ const v = JSON.parse(t);
286096
+ return v !== null && typeof v === "object";
286097
+ } catch {
286098
+ return false;
286099
+ }
286100
+ };
286101
+ if (!decodesToJsonRecord(pageText) && injectedCookies.length > 0) {
286102
+ try {
286103
+ const cookieHeader = injectedCookies.map((c) => {
286104
+ const v = c.value.startsWith('"') && c.value.endsWith('"') ? c.value.slice(1, -1) : c.value;
286105
+ return `${c.name}=${v}`;
286106
+ }).join("; ");
286107
+ const ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
286108
+ const res = await fetch(url, {
286109
+ headers: { Cookie: cookieHeader, "User-Agent": ua, Accept: "application/json" },
286110
+ signal: AbortSignal.timeout(1e4)
286111
+ });
286112
+ const directBody = await res.text();
286113
+ if (decodesToJsonRecord(directBody)) {
286114
+ pageText = directBody.slice(0, 200000);
286115
+ process.stderr.write(`[auth] act go: navigated body unstructured/walled; supplemented page.text from authenticated direct fetch (status ${res.status}, ${directBody.length} bytes)
286116
+ `);
286117
+ } else {
286118
+ process.stderr.write(`[auth] act go: direct-fetch supplement skipped — body not a JSON record (status ${res.status})
286119
+ `);
286120
+ }
286121
+ } catch (directErr) {
286122
+ process.stderr.write(`[auth] act go: direct-fetch supplement failed: ${directErr instanceof Error ? directErr.message : String(directErr)}
286123
+ `);
286124
+ }
286125
+ }
286083
286126
  let captcha;
286084
286127
  if (parsed.flags.solve === true || process.env.UNBROWSE_AUTO_SOLVE === "1") {
286085
286128
  const { clearCaptchaInRender: clearCaptchaInRender2 } = await Promise.resolve().then(() => (init_captcha_render(), exports_captcha_render));
@@ -297050,6 +297093,30 @@ async function cmdRun(args, flags, verb = "run") {
297050
297093
  run_plan: runPlan
297051
297094
  };
297052
297095
  }
297096
+ const isActGoNavigateVariant = (() => {
297097
+ const i = (intent ?? "").trim().toLowerCase();
297098
+ return i === "act go" || i === "go" || i === "act read" || i === "read";
297099
+ })();
297100
+ function mirrorNavigateBodyToPage(result) {
297101
+ if (!isActGoNavigateVariant)
297102
+ return result;
297103
+ if ("page" in result)
297104
+ return result;
297105
+ if (result.source !== "direct-fetch")
297106
+ return result;
297107
+ const body = result.result;
297108
+ if (body === null || typeof body !== "object")
297109
+ return result;
297110
+ let text3;
297111
+ try {
297112
+ text3 = JSON.stringify(body);
297113
+ } catch {
297114
+ return result;
297115
+ }
297116
+ if (!text3)
297117
+ return result;
297118
+ return { ...result, page: { text: text3.slice(0, 200000) } };
297119
+ }
297053
297120
  function endpointsDiscovered(result) {
297054
297121
  if (typeof result.endpoints_discovered === "number")
297055
297122
  return result.endpoints_discovered;
@@ -297160,11 +297227,11 @@ async function cmdRun(args, flags, verb = "run") {
297160
297227
  return;
297161
297228
  }
297162
297229
  if (isResolveSuccessResult(result)) {
297163
- output(decorate(result), !!flags.pretty);
297230
+ output(decorate(mirrorNavigateBodyToPage(result)), !!flags.pretty);
297164
297231
  return;
297165
297232
  }
297166
297233
  if (!shouldIndexFallback(result)) {
297167
- output(decorate(result), !!flags.pretty);
297234
+ output(decorate(mirrorNavigateBodyToPage(result)), !!flags.pretty);
297168
297235
  return;
297169
297236
  }
297170
297237
  if (flags["no-index"]) {
@@ -297190,7 +297257,7 @@ async function cmdRun(args, flags, verb = "run") {
297190
297257
  if (!captureLooksThin(capture)) {
297191
297258
  result = await resolveStep("after_index");
297192
297259
  if (isResolveSuccessResult(result)) {
297193
- output(decorate(result), !!flags.pretty);
297260
+ output(decorate(mirrorNavigateBodyToPage(result)), !!flags.pretty);
297194
297261
  return;
297195
297262
  }
297196
297263
  if (resolveResultError(result) === "auth_required") {
@@ -304279,6 +304346,7 @@ async function resolveAndExecute2(intent, params = {}, context, projection, opti
304279
304346
  return null;
304280
304347
  };
304281
304348
  let directFetchCookieHeader = "";
304349
+ let directFetchCookiesAttached = 0;
304282
304350
  try {
304283
304351
  const dfHost = new URL(ctxUrl).hostname.replace(/^www\./, "");
304284
304352
  const { extractBrowserCookies: extractBrowserCookies3 } = await Promise.resolve().then(() => (init_browser_cookies(), exports_browser_cookies));
@@ -304289,6 +304357,7 @@ async function resolveAndExecute2(intent, params = {}, context, projection, opti
304289
304357
  return `${c.name}=${v}`;
304290
304358
  }).filter((pair) => !pair.endsWith("=")).join("; ");
304291
304359
  if (directFetchCookieHeader) {
304360
+ directFetchCookiesAttached = directFetchCookieHeader.split("; ").filter(Boolean).length;
304292
304361
  console.log(`[direct-fetch] ${ctxUrl} attaching ${dfCookies.length} browser cookie(s) for ${dfHost} on native fetch`);
304293
304362
  }
304294
304363
  }
@@ -304410,7 +304479,8 @@ async function resolveAndExecute2(intent, params = {}, context, projection, opti
304410
304479
  trace: trace2,
304411
304480
  source: "direct-fetch",
304412
304481
  skill: undefined,
304413
- timing: t
304482
+ timing: t,
304483
+ ...directFetchCookiesAttached > 0 ? { cookies_injected: directFetchCookiesAttached } : {}
304414
304484
  };
304415
304485
  }
304416
304486
  } else if (directRes.status === 403 || directRes.status === 429 || directRes.status === 503) {