@riddledc/riddle-proof 0.7.190 → 0.7.191

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.
@@ -5754,7 +5754,114 @@ function setupJsonValue(value) {
5754
5754
  function setupValuesEqual(left, right) {
5755
5755
  return JSON.stringify(setupJsonValue(left)) === JSON.stringify(setupJsonValue(right));
5756
5756
  }
5757
+ async function ensureProfilePageHelpers(context) {
5758
+ try {
5759
+ await context.evaluate(({ targetUrl }) => {
5760
+ const asPathname = (path) => {
5761
+ const value = String(path || "/");
5762
+ return value.startsWith("/") ? value : "/" + value;
5763
+ };
5764
+ const normalizePathname = (path) => {
5765
+ const value = asPathname(path);
5766
+ return value === "/" ? "/" : value.replace(/\/+$/, "") || "/";
5767
+ };
5768
+ const previewMountPrefix = (pathname) => {
5769
+ const value = normalizePathname(pathname);
5770
+ const apiPreview = value.match(/^(\/s\/[^/]+)(?:\/|$)/);
5771
+ if (apiPreview) return apiPreview[1];
5772
+ const internalPreview = value.match(/^(\/preview\/[^/]+\/[^/]+)(?:\/|$)/);
5773
+ return internalPreview ? internalPreview[1] : "";
5774
+ };
5775
+ const targetMountPrefix = () => {
5776
+ try {
5777
+ return previewMountPrefix(new URL(String(targetUrl || ""), window.location.href).pathname);
5778
+ } catch {
5779
+ return "";
5780
+ }
5781
+ };
5782
+ const currentRoute = () => {
5783
+ const pathname = asPathname(window.location.pathname);
5784
+ const normalizedPathname = normalizePathname(pathname);
5785
+ const currentBasePath = previewMountPrefix(normalizedPathname);
5786
+ const basePath = currentBasePath || targetMountPrefix();
5787
+ const suffix = String(window.location.search || "") + String(window.location.hash || "");
5788
+ const appPath = currentBasePath && (normalizedPathname === currentBasePath || normalizedPathname.startsWith(currentBasePath + "/"))
5789
+ ? normalizePathname(normalizedPathname.slice(currentBasePath.length) || "/")
5790
+ : normalizedPathname;
5791
+ return {
5792
+ url: window.location.href,
5793
+ origin: window.location.origin,
5794
+ pathname,
5795
+ search: window.location.search,
5796
+ hash: window.location.hash,
5797
+ basePath,
5798
+ previewMountPrefix: basePath,
5799
+ currentBasePath,
5800
+ appPath,
5801
+ appRoute: appPath + suffix,
5802
+ mountedPath: normalizedPathname,
5803
+ mountedRoute: normalizedPathname + suffix,
5804
+ isPreviewMounted: Boolean(currentBasePath),
5805
+ };
5806
+ };
5807
+ const parseRoute = (route) => {
5808
+ const raw = String(route || "/").trim() || "/";
5809
+ if (/^https?:\/\//i.test(raw)) {
5810
+ try {
5811
+ const url = new URL(raw);
5812
+ if (url.origin !== window.location.origin) return { external: true, value: raw };
5813
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
5814
+ } catch {
5815
+ return { external: false, pathname: normalizePathname(raw), suffix: "" };
5816
+ }
5817
+ }
5818
+ try {
5819
+ const url = new URL(raw, window.location.origin);
5820
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
5821
+ } catch {
5822
+ const hashIndex = raw.indexOf("#");
5823
+ const beforeHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;
5824
+ const hash = hashIndex >= 0 ? raw.slice(hashIndex) : "";
5825
+ const searchIndex = beforeHash.indexOf("?");
5826
+ const pathname = searchIndex >= 0 ? beforeHash.slice(0, searchIndex) : beforeHash;
5827
+ const search = searchIndex >= 0 ? beforeHash.slice(searchIndex) : "";
5828
+ return { external: false, pathname: normalizePathname(pathname), suffix: search + hash };
5829
+ }
5830
+ };
5831
+ const joinRoute = (route) => {
5832
+ const parsed = parseRoute(route);
5833
+ if (parsed.external) return parsed.value;
5834
+ const current = currentRoute();
5835
+ const basePath = current.basePath || "";
5836
+ const routePath = parsed.pathname || "/";
5837
+ if (!basePath) return routePath + (parsed.suffix || "");
5838
+ if (routePath === basePath || routePath.startsWith(basePath + "/")) return routePath + (parsed.suffix || "");
5839
+ return (routePath === "/" ? basePath + "/" : basePath + routePath) + (parsed.suffix || "");
5840
+ };
5841
+ const existing = window.__riddleProofProfile && typeof window.__riddleProofProfile === "object"
5842
+ ? window.__riddleProofProfile
5843
+ : {};
5844
+ Object.defineProperties(existing, {
5845
+ current: { configurable: true, get: currentRoute },
5846
+ appPath: { configurable: true, get: () => currentRoute().appPath },
5847
+ appRoute: { configurable: true, get: () => currentRoute().appRoute },
5848
+ basePath: { configurable: true, get: () => currentRoute().basePath },
5849
+ previewMountPrefix: { configurable: true, get: () => currentRoute().previewMountPrefix },
5850
+ mountedPath: { configurable: true, get: () => currentRoute().mountedPath },
5851
+ mountedRoute: { configurable: true, get: () => currentRoute().mountedRoute },
5852
+ });
5853
+ existing.version = "riddle-proof.profile-helper.v1";
5854
+ existing.route = currentRoute;
5855
+ existing.getRoute = currentRoute;
5856
+ existing.joinRoute = joinRoute;
5857
+ window.__riddleProofProfile = existing;
5858
+ }, { targetUrl });
5859
+ } catch {
5860
+ // Profile helper injection is best-effort so existing window actions keep their old behavior.
5861
+ }
5862
+ }
5757
5863
  async function setupReadWindowValue(context, path) {
5864
+ await ensureProfilePageHelpers(context);
5758
5865
  return await context.evaluate(({ path }) => {
5759
5866
  const toJsonValue = (value) => {
5760
5867
  if (value === null || value === undefined) return null;
@@ -5778,6 +5885,7 @@ async function setupReadWindowValue(context, path) {
5778
5885
  }, { path });
5779
5886
  }
5780
5887
  async function setupCallWindowFunction(context, path, args, storeReturnTo, captureReturn) {
5888
+ await ensureProfilePageHelpers(context);
5781
5889
  return await context.evaluate(async ({ path, args, storeReturnTo, captureReturn }) => {
5782
5890
  const toJsonValue = (value) => {
5783
5891
  if (value === null || value === undefined) return null;
@@ -5826,6 +5934,7 @@ async function setupCallWindowFunction(context, path, args, storeReturnTo, captu
5826
5934
  }, { path, args, storeReturnTo, captureReturn });
5827
5935
  }
5828
5936
  async function setupEvaluateWindowScript(context, script, args, storeReturnTo, captureReturn) {
5937
+ await ensureProfilePageHelpers(context);
5829
5938
  return await context.evaluate(async ({ script, args, storeReturnTo, captureReturn }) => {
5830
5939
  const toJsonValue = (value) => {
5831
5940
  if (value === null || value === undefined) return null;
package/dist/cli.cjs CHANGED
@@ -12695,7 +12695,114 @@ function setupJsonValue(value) {
12695
12695
  function setupValuesEqual(left, right) {
12696
12696
  return JSON.stringify(setupJsonValue(left)) === JSON.stringify(setupJsonValue(right));
12697
12697
  }
12698
+ async function ensureProfilePageHelpers(context) {
12699
+ try {
12700
+ await context.evaluate(({ targetUrl }) => {
12701
+ const asPathname = (path) => {
12702
+ const value = String(path || "/");
12703
+ return value.startsWith("/") ? value : "/" + value;
12704
+ };
12705
+ const normalizePathname = (path) => {
12706
+ const value = asPathname(path);
12707
+ return value === "/" ? "/" : value.replace(/\/+$/, "") || "/";
12708
+ };
12709
+ const previewMountPrefix = (pathname) => {
12710
+ const value = normalizePathname(pathname);
12711
+ const apiPreview = value.match(/^(\/s\/[^/]+)(?:\/|$)/);
12712
+ if (apiPreview) return apiPreview[1];
12713
+ const internalPreview = value.match(/^(\/preview\/[^/]+\/[^/]+)(?:\/|$)/);
12714
+ return internalPreview ? internalPreview[1] : "";
12715
+ };
12716
+ const targetMountPrefix = () => {
12717
+ try {
12718
+ return previewMountPrefix(new URL(String(targetUrl || ""), window.location.href).pathname);
12719
+ } catch {
12720
+ return "";
12721
+ }
12722
+ };
12723
+ const currentRoute = () => {
12724
+ const pathname = asPathname(window.location.pathname);
12725
+ const normalizedPathname = normalizePathname(pathname);
12726
+ const currentBasePath = previewMountPrefix(normalizedPathname);
12727
+ const basePath = currentBasePath || targetMountPrefix();
12728
+ const suffix = String(window.location.search || "") + String(window.location.hash || "");
12729
+ const appPath = currentBasePath && (normalizedPathname === currentBasePath || normalizedPathname.startsWith(currentBasePath + "/"))
12730
+ ? normalizePathname(normalizedPathname.slice(currentBasePath.length) || "/")
12731
+ : normalizedPathname;
12732
+ return {
12733
+ url: window.location.href,
12734
+ origin: window.location.origin,
12735
+ pathname,
12736
+ search: window.location.search,
12737
+ hash: window.location.hash,
12738
+ basePath,
12739
+ previewMountPrefix: basePath,
12740
+ currentBasePath,
12741
+ appPath,
12742
+ appRoute: appPath + suffix,
12743
+ mountedPath: normalizedPathname,
12744
+ mountedRoute: normalizedPathname + suffix,
12745
+ isPreviewMounted: Boolean(currentBasePath),
12746
+ };
12747
+ };
12748
+ const parseRoute = (route) => {
12749
+ const raw = String(route || "/").trim() || "/";
12750
+ if (/^https?:\/\//i.test(raw)) {
12751
+ try {
12752
+ const url = new URL(raw);
12753
+ if (url.origin !== window.location.origin) return { external: true, value: raw };
12754
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
12755
+ } catch {
12756
+ return { external: false, pathname: normalizePathname(raw), suffix: "" };
12757
+ }
12758
+ }
12759
+ try {
12760
+ const url = new URL(raw, window.location.origin);
12761
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
12762
+ } catch {
12763
+ const hashIndex = raw.indexOf("#");
12764
+ const beforeHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;
12765
+ const hash = hashIndex >= 0 ? raw.slice(hashIndex) : "";
12766
+ const searchIndex = beforeHash.indexOf("?");
12767
+ const pathname = searchIndex >= 0 ? beforeHash.slice(0, searchIndex) : beforeHash;
12768
+ const search = searchIndex >= 0 ? beforeHash.slice(searchIndex) : "";
12769
+ return { external: false, pathname: normalizePathname(pathname), suffix: search + hash };
12770
+ }
12771
+ };
12772
+ const joinRoute = (route) => {
12773
+ const parsed = parseRoute(route);
12774
+ if (parsed.external) return parsed.value;
12775
+ const current = currentRoute();
12776
+ const basePath = current.basePath || "";
12777
+ const routePath = parsed.pathname || "/";
12778
+ if (!basePath) return routePath + (parsed.suffix || "");
12779
+ if (routePath === basePath || routePath.startsWith(basePath + "/")) return routePath + (parsed.suffix || "");
12780
+ return (routePath === "/" ? basePath + "/" : basePath + routePath) + (parsed.suffix || "");
12781
+ };
12782
+ const existing = window.__riddleProofProfile && typeof window.__riddleProofProfile === "object"
12783
+ ? window.__riddleProofProfile
12784
+ : {};
12785
+ Object.defineProperties(existing, {
12786
+ current: { configurable: true, get: currentRoute },
12787
+ appPath: { configurable: true, get: () => currentRoute().appPath },
12788
+ appRoute: { configurable: true, get: () => currentRoute().appRoute },
12789
+ basePath: { configurable: true, get: () => currentRoute().basePath },
12790
+ previewMountPrefix: { configurable: true, get: () => currentRoute().previewMountPrefix },
12791
+ mountedPath: { configurable: true, get: () => currentRoute().mountedPath },
12792
+ mountedRoute: { configurable: true, get: () => currentRoute().mountedRoute },
12793
+ });
12794
+ existing.version = "riddle-proof.profile-helper.v1";
12795
+ existing.route = currentRoute;
12796
+ existing.getRoute = currentRoute;
12797
+ existing.joinRoute = joinRoute;
12798
+ window.__riddleProofProfile = existing;
12799
+ }, { targetUrl });
12800
+ } catch {
12801
+ // Profile helper injection is best-effort so existing window actions keep their old behavior.
12802
+ }
12803
+ }
12698
12804
  async function setupReadWindowValue(context, path) {
12805
+ await ensureProfilePageHelpers(context);
12699
12806
  return await context.evaluate(({ path }) => {
12700
12807
  const toJsonValue = (value) => {
12701
12808
  if (value === null || value === undefined) return null;
@@ -12719,6 +12826,7 @@ async function setupReadWindowValue(context, path) {
12719
12826
  }, { path });
12720
12827
  }
12721
12828
  async function setupCallWindowFunction(context, path, args, storeReturnTo, captureReturn) {
12829
+ await ensureProfilePageHelpers(context);
12722
12830
  return await context.evaluate(async ({ path, args, storeReturnTo, captureReturn }) => {
12723
12831
  const toJsonValue = (value) => {
12724
12832
  if (value === null || value === undefined) return null;
@@ -12767,6 +12875,7 @@ async function setupCallWindowFunction(context, path, args, storeReturnTo, captu
12767
12875
  }, { path, args, storeReturnTo, captureReturn });
12768
12876
  }
12769
12877
  async function setupEvaluateWindowScript(context, script, args, storeReturnTo, captureReturn) {
12878
+ await ensureProfilePageHelpers(context);
12770
12879
  return await context.evaluate(async ({ script, args, storeReturnTo, captureReturn }) => {
12771
12880
  const toJsonValue = (value) => {
12772
12881
  if (value === null || value === undefined) return null;
@@ -16457,6 +16566,24 @@ function profileHasTerminalLossReceipt(receipts) {
16457
16566
  return lastFlightLost || outOfBounds || ["over", "lost", "loss", "failed", "failure", "game_over", "gameover"].includes(status) || ["lost", "loss", "failed", "failure", "game_over", "gameover"].includes(outcome);
16458
16567
  });
16459
16568
  }
16569
+ function profileHasTerminalSuccessReceipt(receipts) {
16570
+ return receipts.some((receipt) => {
16571
+ const status = profileLowerSummaryValue(receipt, ["status", "state", "phase"]);
16572
+ const outcome = profileLowerSummaryValue(receipt, ["lastOutcome", "outcome", "terminalOutcome", "terminal", "result"]);
16573
+ const storedTo = cliString(receipt.return_stored_to) || "";
16574
+ const label = cliString(receipt.label) || "";
16575
+ const path7 = cliString(receipt.path) || cliString(receipt.function_name) || "";
16576
+ const haystack = `${storedTo} ${label} ${path7}`.toLowerCase();
16577
+ if (haystack.includes("shot")) return false;
16578
+ const labelsSuccess = haystack.includes("success") || haystack.includes("terminal") || haystack.includes("completed") || haystack.includes("complete");
16579
+ const success = setupReturnSummaryValue(receipt, ["success", "passed", "completed"]) === true;
16580
+ const targetHit = setupReturnSummaryValue(receipt, ["lastFlightTargetHit", "targetHit"]) === true;
16581
+ const gateHit = setupReturnSummaryValue(receipt, ["lastFlight.passedThroughGate", "passedThroughGate", "gate"]) === true;
16582
+ const bucketHit = setupReturnSummaryValue(receipt, ["lastFlight.bucketHit", "bucketHit", "bucket"]) === true;
16583
+ if (!labelsSuccess && !success && !targetHit && !gateHit && !bucketHit) return false;
16584
+ return success || targetHit || gateHit || bucketHit || ["success", "won", "complete", "completed", "passed"].includes(status) || ["success", "won", "complete", "completed", "passed"].includes(outcome);
16585
+ });
16586
+ }
16460
16587
  function profileHasControlledLaunchReceipt(receipts, expected) {
16461
16588
  return receipts.some((receipt) => {
16462
16589
  const shotKind = profileLowerSummaryValue(receipt, ["lastShotKind", "shotKind", "kind"]);
@@ -16468,6 +16595,20 @@ function profileHasControlledLaunchReceipt(receipts, expected) {
16468
16595
  return ["failure", "failed", "miss", "lost", "loss"].includes(shotKind) || ["failure", "failed", "miss", "lost", "loss"].includes(shotStatus) || ["failure", "failed", "miss", "lost", "loss"].includes(outcome);
16469
16596
  });
16470
16597
  }
16598
+ function profileHasRouteContinuationReceipt(receipts) {
16599
+ return receipts.some((receipt) => {
16600
+ const fromRoute = cliString(setupReturnSummaryValue(receipt, ["fromRoute", "from", "previousRoute", "sourceRoute"]));
16601
+ const target = cliString(setupReturnSummaryValue(receipt, ["target", "nextHref", "toRoute", "nextRoute", "href"]));
16602
+ const afterRoute = cliString(setupReturnSummaryValue(receipt, ["routeAfterPush", "afterRoute", "route", "observedRoute"]));
16603
+ if (!fromRoute || !target && !afterRoute) return false;
16604
+ const storedTo = cliString(receipt.return_stored_to) || "";
16605
+ const label = cliString(receipt.label) || "";
16606
+ const path7 = cliString(receipt.path) || cliString(receipt.function_name) || "";
16607
+ const summary = cliReturnSummaryLabel(receipt.return_summary) || "";
16608
+ const haystack = `${storedTo} ${label} ${path7} ${summary}`.toLowerCase();
16609
+ return haystack.includes("navigation") || haystack.includes("continuation") || haystack.includes("route") || haystack.includes("next") || haystack.includes("target");
16610
+ });
16611
+ }
16471
16612
  function profileHasRecoveredStateReceipt(receipts) {
16472
16613
  return receipts.some((receipt) => {
16473
16614
  const storedTo = cliString(receipt.return_stored_to) || "";
@@ -16539,8 +16680,10 @@ function profilePackReceiptStatus(result, metadata, receipt) {
16539
16680
  const hasOfflineAudioMetricsReceipt = profileHasOfflineAudioMetricsReceipt(valueReceipts);
16540
16681
  const hasActiveRouteLocalProofReceipt = profileHasActiveRouteLocalProofReceipt(valueReceipts);
16541
16682
  const hasTerminalLossReceipt = profileHasTerminalLossReceipt(valueReceipts);
16683
+ const hasTerminalSuccessReceipt = profileHasTerminalSuccessReceipt(valueReceipts);
16542
16684
  const hasControlledFailureLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "failure");
16543
16685
  const hasControlledSuccessLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "success");
16686
+ const hasRouteContinuationReceipt = profileHasRouteContinuationReceipt(valueReceipts);
16544
16687
  const hasRecoveredStateReceipt = profileHasRecoveredStateReceipt(valueReceipts);
16545
16688
  const failedCleanupInventoryReason = profileFailedCleanupInventoryReason(setupViewports);
16546
16689
  if (text.includes("artifact link") || text.includes("artifact path")) {
@@ -16594,6 +16737,13 @@ function profilePackReceiptStatus(result, metadata, receipt) {
16594
16737
  "terminal loss receipt missing"
16595
16738
  );
16596
16739
  }
16740
+ if (text.includes("success") && text.includes("terminal")) {
16741
+ return profileReceiptSignalStatus(
16742
+ hasTerminalSuccessReceipt,
16743
+ "terminal success receipt present",
16744
+ "terminal success receipt missing"
16745
+ );
16746
+ }
16597
16747
  if (text.includes("controlled") && text.includes("launch") && (text.includes("failure") || text.includes("failed") || text.includes("miss"))) {
16598
16748
  return profileReceiptSignalStatus(
16599
16749
  hasControlledFailureLaunchReceipt,
@@ -16615,6 +16765,13 @@ function profilePackReceiptStatus(result, metadata, receipt) {
16615
16765
  "visible recovery-action receipt missing"
16616
16766
  );
16617
16767
  }
16768
+ if (text.includes("route continuation") || text.includes("route-transition") || text.includes("route transition")) {
16769
+ return profileReceiptSignalStatus(
16770
+ hasRouteContinuationReceipt,
16771
+ "route continuation receipt present",
16772
+ "route continuation receipt missing"
16773
+ );
16774
+ }
16618
16775
  if (text.includes("through visible ui") || text.includes("visible ui action") || text.includes("ui-routed") || text.includes("ui routed") || text.includes("visible") && text.includes("route") && text.includes("exit") && text.includes("action") || text.includes("visible") && text.includes("mode") && text.includes("exit") && text.includes("action")) {
16619
16776
  return profileReceiptSignalStatus(
16620
16777
  visibleUiActionCount > 0,
package/dist/cli.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  profileStatusExitCode,
14
14
  resolveRiddleProofProfileTargetUrl,
15
15
  resolveRiddleProofProfileTimeoutSec
16
- } from "./chunk-Z42O55GB.js";
16
+ } from "./chunk-BG5GVTGM.js";
17
17
  import {
18
18
  createRiddleApiClient,
19
19
  isTerminalRiddleJobStatus,
@@ -662,6 +662,24 @@ function profileHasTerminalLossReceipt(receipts) {
662
662
  return lastFlightLost || outOfBounds || ["over", "lost", "loss", "failed", "failure", "game_over", "gameover"].includes(status) || ["lost", "loss", "failed", "failure", "game_over", "gameover"].includes(outcome);
663
663
  });
664
664
  }
665
+ function profileHasTerminalSuccessReceipt(receipts) {
666
+ return receipts.some((receipt) => {
667
+ const status = profileLowerSummaryValue(receipt, ["status", "state", "phase"]);
668
+ const outcome = profileLowerSummaryValue(receipt, ["lastOutcome", "outcome", "terminalOutcome", "terminal", "result"]);
669
+ const storedTo = cliString(receipt.return_stored_to) || "";
670
+ const label = cliString(receipt.label) || "";
671
+ const path2 = cliString(receipt.path) || cliString(receipt.function_name) || "";
672
+ const haystack = `${storedTo} ${label} ${path2}`.toLowerCase();
673
+ if (haystack.includes("shot")) return false;
674
+ const labelsSuccess = haystack.includes("success") || haystack.includes("terminal") || haystack.includes("completed") || haystack.includes("complete");
675
+ const success = setupReturnSummaryValue(receipt, ["success", "passed", "completed"]) === true;
676
+ const targetHit = setupReturnSummaryValue(receipt, ["lastFlightTargetHit", "targetHit"]) === true;
677
+ const gateHit = setupReturnSummaryValue(receipt, ["lastFlight.passedThroughGate", "passedThroughGate", "gate"]) === true;
678
+ const bucketHit = setupReturnSummaryValue(receipt, ["lastFlight.bucketHit", "bucketHit", "bucket"]) === true;
679
+ if (!labelsSuccess && !success && !targetHit && !gateHit && !bucketHit) return false;
680
+ return success || targetHit || gateHit || bucketHit || ["success", "won", "complete", "completed", "passed"].includes(status) || ["success", "won", "complete", "completed", "passed"].includes(outcome);
681
+ });
682
+ }
665
683
  function profileHasControlledLaunchReceipt(receipts, expected) {
666
684
  return receipts.some((receipt) => {
667
685
  const shotKind = profileLowerSummaryValue(receipt, ["lastShotKind", "shotKind", "kind"]);
@@ -673,6 +691,20 @@ function profileHasControlledLaunchReceipt(receipts, expected) {
673
691
  return ["failure", "failed", "miss", "lost", "loss"].includes(shotKind) || ["failure", "failed", "miss", "lost", "loss"].includes(shotStatus) || ["failure", "failed", "miss", "lost", "loss"].includes(outcome);
674
692
  });
675
693
  }
694
+ function profileHasRouteContinuationReceipt(receipts) {
695
+ return receipts.some((receipt) => {
696
+ const fromRoute = cliString(setupReturnSummaryValue(receipt, ["fromRoute", "from", "previousRoute", "sourceRoute"]));
697
+ const target = cliString(setupReturnSummaryValue(receipt, ["target", "nextHref", "toRoute", "nextRoute", "href"]));
698
+ const afterRoute = cliString(setupReturnSummaryValue(receipt, ["routeAfterPush", "afterRoute", "route", "observedRoute"]));
699
+ if (!fromRoute || !target && !afterRoute) return false;
700
+ const storedTo = cliString(receipt.return_stored_to) || "";
701
+ const label = cliString(receipt.label) || "";
702
+ const path2 = cliString(receipt.path) || cliString(receipt.function_name) || "";
703
+ const summary = cliReturnSummaryLabel(receipt.return_summary) || "";
704
+ const haystack = `${storedTo} ${label} ${path2} ${summary}`.toLowerCase();
705
+ return haystack.includes("navigation") || haystack.includes("continuation") || haystack.includes("route") || haystack.includes("next") || haystack.includes("target");
706
+ });
707
+ }
676
708
  function profileHasRecoveredStateReceipt(receipts) {
677
709
  return receipts.some((receipt) => {
678
710
  const storedTo = cliString(receipt.return_stored_to) || "";
@@ -744,8 +776,10 @@ function profilePackReceiptStatus(result, metadata, receipt) {
744
776
  const hasOfflineAudioMetricsReceipt = profileHasOfflineAudioMetricsReceipt(valueReceipts);
745
777
  const hasActiveRouteLocalProofReceipt = profileHasActiveRouteLocalProofReceipt(valueReceipts);
746
778
  const hasTerminalLossReceipt = profileHasTerminalLossReceipt(valueReceipts);
779
+ const hasTerminalSuccessReceipt = profileHasTerminalSuccessReceipt(valueReceipts);
747
780
  const hasControlledFailureLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "failure");
748
781
  const hasControlledSuccessLaunchReceipt = profileHasControlledLaunchReceipt(valueReceipts, "success");
782
+ const hasRouteContinuationReceipt = profileHasRouteContinuationReceipt(valueReceipts);
749
783
  const hasRecoveredStateReceipt = profileHasRecoveredStateReceipt(valueReceipts);
750
784
  const failedCleanupInventoryReason = profileFailedCleanupInventoryReason(setupViewports);
751
785
  if (text.includes("artifact link") || text.includes("artifact path")) {
@@ -799,6 +833,13 @@ function profilePackReceiptStatus(result, metadata, receipt) {
799
833
  "terminal loss receipt missing"
800
834
  );
801
835
  }
836
+ if (text.includes("success") && text.includes("terminal")) {
837
+ return profileReceiptSignalStatus(
838
+ hasTerminalSuccessReceipt,
839
+ "terminal success receipt present",
840
+ "terminal success receipt missing"
841
+ );
842
+ }
802
843
  if (text.includes("controlled") && text.includes("launch") && (text.includes("failure") || text.includes("failed") || text.includes("miss"))) {
803
844
  return profileReceiptSignalStatus(
804
845
  hasControlledFailureLaunchReceipt,
@@ -820,6 +861,13 @@ function profilePackReceiptStatus(result, metadata, receipt) {
820
861
  "visible recovery-action receipt missing"
821
862
  );
822
863
  }
864
+ if (text.includes("route continuation") || text.includes("route-transition") || text.includes("route transition")) {
865
+ return profileReceiptSignalStatus(
866
+ hasRouteContinuationReceipt,
867
+ "route continuation receipt present",
868
+ "route continuation receipt missing"
869
+ );
870
+ }
823
871
  if (text.includes("through visible ui") || text.includes("visible ui action") || text.includes("ui-routed") || text.includes("ui routed") || text.includes("visible") && text.includes("route") && text.includes("exit") && text.includes("action") || text.includes("visible") && text.includes("mode") && text.includes("exit") && text.includes("action")) {
824
872
  return profileReceiptSignalStatus(
825
873
  visibleUiActionCount > 0,
package/dist/index.cjs CHANGED
@@ -14487,7 +14487,114 @@ function setupJsonValue(value) {
14487
14487
  function setupValuesEqual(left, right) {
14488
14488
  return JSON.stringify(setupJsonValue(left)) === JSON.stringify(setupJsonValue(right));
14489
14489
  }
14490
+ async function ensureProfilePageHelpers(context) {
14491
+ try {
14492
+ await context.evaluate(({ targetUrl }) => {
14493
+ const asPathname = (path) => {
14494
+ const value = String(path || "/");
14495
+ return value.startsWith("/") ? value : "/" + value;
14496
+ };
14497
+ const normalizePathname = (path) => {
14498
+ const value = asPathname(path);
14499
+ return value === "/" ? "/" : value.replace(/\/+$/, "") || "/";
14500
+ };
14501
+ const previewMountPrefix = (pathname) => {
14502
+ const value = normalizePathname(pathname);
14503
+ const apiPreview = value.match(/^(\/s\/[^/]+)(?:\/|$)/);
14504
+ if (apiPreview) return apiPreview[1];
14505
+ const internalPreview = value.match(/^(\/preview\/[^/]+\/[^/]+)(?:\/|$)/);
14506
+ return internalPreview ? internalPreview[1] : "";
14507
+ };
14508
+ const targetMountPrefix = () => {
14509
+ try {
14510
+ return previewMountPrefix(new URL(String(targetUrl || ""), window.location.href).pathname);
14511
+ } catch {
14512
+ return "";
14513
+ }
14514
+ };
14515
+ const currentRoute = () => {
14516
+ const pathname = asPathname(window.location.pathname);
14517
+ const normalizedPathname = normalizePathname(pathname);
14518
+ const currentBasePath = previewMountPrefix(normalizedPathname);
14519
+ const basePath = currentBasePath || targetMountPrefix();
14520
+ const suffix = String(window.location.search || "") + String(window.location.hash || "");
14521
+ const appPath = currentBasePath && (normalizedPathname === currentBasePath || normalizedPathname.startsWith(currentBasePath + "/"))
14522
+ ? normalizePathname(normalizedPathname.slice(currentBasePath.length) || "/")
14523
+ : normalizedPathname;
14524
+ return {
14525
+ url: window.location.href,
14526
+ origin: window.location.origin,
14527
+ pathname,
14528
+ search: window.location.search,
14529
+ hash: window.location.hash,
14530
+ basePath,
14531
+ previewMountPrefix: basePath,
14532
+ currentBasePath,
14533
+ appPath,
14534
+ appRoute: appPath + suffix,
14535
+ mountedPath: normalizedPathname,
14536
+ mountedRoute: normalizedPathname + suffix,
14537
+ isPreviewMounted: Boolean(currentBasePath),
14538
+ };
14539
+ };
14540
+ const parseRoute = (route) => {
14541
+ const raw = String(route || "/").trim() || "/";
14542
+ if (/^https?:\/\//i.test(raw)) {
14543
+ try {
14544
+ const url = new URL(raw);
14545
+ if (url.origin !== window.location.origin) return { external: true, value: raw };
14546
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
14547
+ } catch {
14548
+ return { external: false, pathname: normalizePathname(raw), suffix: "" };
14549
+ }
14550
+ }
14551
+ try {
14552
+ const url = new URL(raw, window.location.origin);
14553
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
14554
+ } catch {
14555
+ const hashIndex = raw.indexOf("#");
14556
+ const beforeHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;
14557
+ const hash = hashIndex >= 0 ? raw.slice(hashIndex) : "";
14558
+ const searchIndex = beforeHash.indexOf("?");
14559
+ const pathname = searchIndex >= 0 ? beforeHash.slice(0, searchIndex) : beforeHash;
14560
+ const search = searchIndex >= 0 ? beforeHash.slice(searchIndex) : "";
14561
+ return { external: false, pathname: normalizePathname(pathname), suffix: search + hash };
14562
+ }
14563
+ };
14564
+ const joinRoute = (route) => {
14565
+ const parsed = parseRoute(route);
14566
+ if (parsed.external) return parsed.value;
14567
+ const current = currentRoute();
14568
+ const basePath = current.basePath || "";
14569
+ const routePath = parsed.pathname || "/";
14570
+ if (!basePath) return routePath + (parsed.suffix || "");
14571
+ if (routePath === basePath || routePath.startsWith(basePath + "/")) return routePath + (parsed.suffix || "");
14572
+ return (routePath === "/" ? basePath + "/" : basePath + routePath) + (parsed.suffix || "");
14573
+ };
14574
+ const existing = window.__riddleProofProfile && typeof window.__riddleProofProfile === "object"
14575
+ ? window.__riddleProofProfile
14576
+ : {};
14577
+ Object.defineProperties(existing, {
14578
+ current: { configurable: true, get: currentRoute },
14579
+ appPath: { configurable: true, get: () => currentRoute().appPath },
14580
+ appRoute: { configurable: true, get: () => currentRoute().appRoute },
14581
+ basePath: { configurable: true, get: () => currentRoute().basePath },
14582
+ previewMountPrefix: { configurable: true, get: () => currentRoute().previewMountPrefix },
14583
+ mountedPath: { configurable: true, get: () => currentRoute().mountedPath },
14584
+ mountedRoute: { configurable: true, get: () => currentRoute().mountedRoute },
14585
+ });
14586
+ existing.version = "riddle-proof.profile-helper.v1";
14587
+ existing.route = currentRoute;
14588
+ existing.getRoute = currentRoute;
14589
+ existing.joinRoute = joinRoute;
14590
+ window.__riddleProofProfile = existing;
14591
+ }, { targetUrl });
14592
+ } catch {
14593
+ // Profile helper injection is best-effort so existing window actions keep their old behavior.
14594
+ }
14595
+ }
14490
14596
  async function setupReadWindowValue(context, path) {
14597
+ await ensureProfilePageHelpers(context);
14491
14598
  return await context.evaluate(({ path }) => {
14492
14599
  const toJsonValue = (value) => {
14493
14600
  if (value === null || value === undefined) return null;
@@ -14511,6 +14618,7 @@ async function setupReadWindowValue(context, path) {
14511
14618
  }, { path });
14512
14619
  }
14513
14620
  async function setupCallWindowFunction(context, path, args, storeReturnTo, captureReturn) {
14621
+ await ensureProfilePageHelpers(context);
14514
14622
  return await context.evaluate(async ({ path, args, storeReturnTo, captureReturn }) => {
14515
14623
  const toJsonValue = (value) => {
14516
14624
  if (value === null || value === undefined) return null;
@@ -14559,6 +14667,7 @@ async function setupCallWindowFunction(context, path, args, storeReturnTo, captu
14559
14667
  }, { path, args, storeReturnTo, captureReturn });
14560
14668
  }
14561
14669
  async function setupEvaluateWindowScript(context, script, args, storeReturnTo, captureReturn) {
14670
+ await ensureProfilePageHelpers(context);
14562
14671
  return await context.evaluate(async ({ script, args, storeReturnTo, captureReturn }) => {
14563
14672
  const toJsonValue = (value) => {
14564
14673
  if (value === null || value === undefined) return null;
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ import {
62
62
  resolveRiddleProofProfileTimeoutSec,
63
63
  slugifyRiddleProofProfileName,
64
64
  summarizeRiddleProofProfileResult
65
- } from "./chunk-Z42O55GB.js";
65
+ } from "./chunk-BG5GVTGM.js";
66
66
  import {
67
67
  DEFAULT_RIDDLE_API_BASE_URL,
68
68
  DEFAULT_RIDDLE_API_KEY_FILE,
package/dist/profile.cjs CHANGED
@@ -5801,7 +5801,114 @@ function setupJsonValue(value) {
5801
5801
  function setupValuesEqual(left, right) {
5802
5802
  return JSON.stringify(setupJsonValue(left)) === JSON.stringify(setupJsonValue(right));
5803
5803
  }
5804
+ async function ensureProfilePageHelpers(context) {
5805
+ try {
5806
+ await context.evaluate(({ targetUrl }) => {
5807
+ const asPathname = (path) => {
5808
+ const value = String(path || "/");
5809
+ return value.startsWith("/") ? value : "/" + value;
5810
+ };
5811
+ const normalizePathname = (path) => {
5812
+ const value = asPathname(path);
5813
+ return value === "/" ? "/" : value.replace(/\/+$/, "") || "/";
5814
+ };
5815
+ const previewMountPrefix = (pathname) => {
5816
+ const value = normalizePathname(pathname);
5817
+ const apiPreview = value.match(/^(\/s\/[^/]+)(?:\/|$)/);
5818
+ if (apiPreview) return apiPreview[1];
5819
+ const internalPreview = value.match(/^(\/preview\/[^/]+\/[^/]+)(?:\/|$)/);
5820
+ return internalPreview ? internalPreview[1] : "";
5821
+ };
5822
+ const targetMountPrefix = () => {
5823
+ try {
5824
+ return previewMountPrefix(new URL(String(targetUrl || ""), window.location.href).pathname);
5825
+ } catch {
5826
+ return "";
5827
+ }
5828
+ };
5829
+ const currentRoute = () => {
5830
+ const pathname = asPathname(window.location.pathname);
5831
+ const normalizedPathname = normalizePathname(pathname);
5832
+ const currentBasePath = previewMountPrefix(normalizedPathname);
5833
+ const basePath = currentBasePath || targetMountPrefix();
5834
+ const suffix = String(window.location.search || "") + String(window.location.hash || "");
5835
+ const appPath = currentBasePath && (normalizedPathname === currentBasePath || normalizedPathname.startsWith(currentBasePath + "/"))
5836
+ ? normalizePathname(normalizedPathname.slice(currentBasePath.length) || "/")
5837
+ : normalizedPathname;
5838
+ return {
5839
+ url: window.location.href,
5840
+ origin: window.location.origin,
5841
+ pathname,
5842
+ search: window.location.search,
5843
+ hash: window.location.hash,
5844
+ basePath,
5845
+ previewMountPrefix: basePath,
5846
+ currentBasePath,
5847
+ appPath,
5848
+ appRoute: appPath + suffix,
5849
+ mountedPath: normalizedPathname,
5850
+ mountedRoute: normalizedPathname + suffix,
5851
+ isPreviewMounted: Boolean(currentBasePath),
5852
+ };
5853
+ };
5854
+ const parseRoute = (route) => {
5855
+ const raw = String(route || "/").trim() || "/";
5856
+ if (/^https?:\/\//i.test(raw)) {
5857
+ try {
5858
+ const url = new URL(raw);
5859
+ if (url.origin !== window.location.origin) return { external: true, value: raw };
5860
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
5861
+ } catch {
5862
+ return { external: false, pathname: normalizePathname(raw), suffix: "" };
5863
+ }
5864
+ }
5865
+ try {
5866
+ const url = new URL(raw, window.location.origin);
5867
+ return { external: false, pathname: normalizePathname(url.pathname), suffix: url.search + url.hash };
5868
+ } catch {
5869
+ const hashIndex = raw.indexOf("#");
5870
+ const beforeHash = hashIndex >= 0 ? raw.slice(0, hashIndex) : raw;
5871
+ const hash = hashIndex >= 0 ? raw.slice(hashIndex) : "";
5872
+ const searchIndex = beforeHash.indexOf("?");
5873
+ const pathname = searchIndex >= 0 ? beforeHash.slice(0, searchIndex) : beforeHash;
5874
+ const search = searchIndex >= 0 ? beforeHash.slice(searchIndex) : "";
5875
+ return { external: false, pathname: normalizePathname(pathname), suffix: search + hash };
5876
+ }
5877
+ };
5878
+ const joinRoute = (route) => {
5879
+ const parsed = parseRoute(route);
5880
+ if (parsed.external) return parsed.value;
5881
+ const current = currentRoute();
5882
+ const basePath = current.basePath || "";
5883
+ const routePath = parsed.pathname || "/";
5884
+ if (!basePath) return routePath + (parsed.suffix || "");
5885
+ if (routePath === basePath || routePath.startsWith(basePath + "/")) return routePath + (parsed.suffix || "");
5886
+ return (routePath === "/" ? basePath + "/" : basePath + routePath) + (parsed.suffix || "");
5887
+ };
5888
+ const existing = window.__riddleProofProfile && typeof window.__riddleProofProfile === "object"
5889
+ ? window.__riddleProofProfile
5890
+ : {};
5891
+ Object.defineProperties(existing, {
5892
+ current: { configurable: true, get: currentRoute },
5893
+ appPath: { configurable: true, get: () => currentRoute().appPath },
5894
+ appRoute: { configurable: true, get: () => currentRoute().appRoute },
5895
+ basePath: { configurable: true, get: () => currentRoute().basePath },
5896
+ previewMountPrefix: { configurable: true, get: () => currentRoute().previewMountPrefix },
5897
+ mountedPath: { configurable: true, get: () => currentRoute().mountedPath },
5898
+ mountedRoute: { configurable: true, get: () => currentRoute().mountedRoute },
5899
+ });
5900
+ existing.version = "riddle-proof.profile-helper.v1";
5901
+ existing.route = currentRoute;
5902
+ existing.getRoute = currentRoute;
5903
+ existing.joinRoute = joinRoute;
5904
+ window.__riddleProofProfile = existing;
5905
+ }, { targetUrl });
5906
+ } catch {
5907
+ // Profile helper injection is best-effort so existing window actions keep their old behavior.
5908
+ }
5909
+ }
5804
5910
  async function setupReadWindowValue(context, path) {
5911
+ await ensureProfilePageHelpers(context);
5805
5912
  return await context.evaluate(({ path }) => {
5806
5913
  const toJsonValue = (value) => {
5807
5914
  if (value === null || value === undefined) return null;
@@ -5825,6 +5932,7 @@ async function setupReadWindowValue(context, path) {
5825
5932
  }, { path });
5826
5933
  }
5827
5934
  async function setupCallWindowFunction(context, path, args, storeReturnTo, captureReturn) {
5935
+ await ensureProfilePageHelpers(context);
5828
5936
  return await context.evaluate(async ({ path, args, storeReturnTo, captureReturn }) => {
5829
5937
  const toJsonValue = (value) => {
5830
5938
  if (value === null || value === undefined) return null;
@@ -5873,6 +5981,7 @@ async function setupCallWindowFunction(context, path, args, storeReturnTo, captu
5873
5981
  }, { path, args, storeReturnTo, captureReturn });
5874
5982
  }
5875
5983
  async function setupEvaluateWindowScript(context, script, args, storeReturnTo, captureReturn) {
5984
+ await ensureProfilePageHelpers(context);
5876
5985
  return await context.evaluate(async ({ script, args, storeReturnTo, captureReturn }) => {
5877
5986
  const toJsonValue = (value) => {
5878
5987
  if (value === null || value === undefined) return null;
package/dist/profile.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  resolveRiddleProofProfileTimeoutSec,
24
24
  slugifyRiddleProofProfileName,
25
25
  summarizeRiddleProofProfileResult
26
- } from "./chunk-Z42O55GB.js";
26
+ } from "./chunk-BG5GVTGM.js";
27
27
  export {
28
28
  RIDDLE_PROOF_PROFILE_CHECK_TYPES,
29
29
  RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION,
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
292
292
  blocking?: boolean;
293
293
  details?: Record<string, unknown>;
294
294
  ok: boolean;
295
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
295
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
296
296
  state_path: string;
297
297
  stage: any;
298
298
  summary: string;
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
382
382
  continueWithStage?: WorkflowStage | null;
383
383
  blocking?: boolean;
384
384
  details?: Record<string, unknown>;
385
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
385
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
386
386
  state_path: string;
387
387
  stage: any;
388
388
  checkpoint: string;
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
659
659
  error?: undefined;
660
660
  } | {
661
661
  ok: boolean;
662
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
662
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
663
663
  state_path: string;
664
664
  stage: any;
665
665
  summary: string;
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
292
292
  blocking?: boolean;
293
293
  details?: Record<string, unknown>;
294
294
  ok: boolean;
295
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
295
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
296
296
  state_path: string;
297
297
  stage: any;
298
298
  summary: string;
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
382
382
  continueWithStage?: WorkflowStage | null;
383
383
  blocking?: boolean;
384
384
  details?: Record<string, unknown>;
385
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
385
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
386
386
  state_path: string;
387
387
  stage: any;
388
388
  checkpoint: string;
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
659
659
  error?: undefined;
660
660
  } | {
661
661
  ok: boolean;
662
- action: "setup" | "recon" | "author" | "implement" | "verify" | "ship" | "run";
662
+ action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
663
663
  state_path: string;
664
664
  stage: any;
665
665
  summary: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.7.190",
3
+ "version": "0.7.191",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",