@riddledc/riddle-proof 0.5.32 → 0.5.34

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 (40) hide show
  1. package/dist/{chunk-R4BPJNAM.js → chunk-4YCWZVBN.js} +101 -8
  2. package/dist/{chunk-LIDYNU7Q.js → chunk-7R6ZQE3X.js} +39 -2
  3. package/dist/{chunk-TMMKRKY5.js → chunk-J2MERROF.js} +1 -0
  4. package/dist/{chunk-F6VFKS7K.js → chunk-MQ2BHHLX.js} +2 -2
  5. package/dist/{chunk-7ZJAUEUN.js → chunk-OASB3CYU.js} +6 -1
  6. package/dist/chunk-ODORKNSO.js +121 -0
  7. package/dist/engine-harness.cjs +143 -9
  8. package/dist/engine-harness.js +4 -3
  9. package/dist/index.cjs +271 -11
  10. package/dist/index.d.cts +2 -1
  11. package/dist/index.d.ts +2 -1
  12. package/dist/index.js +24 -7
  13. package/dist/openclaw.cjs +5 -0
  14. package/dist/openclaw.js +2 -2
  15. package/dist/proof-run-core.cjs +104 -8
  16. package/dist/proof-run-core.d.cts +24 -1
  17. package/dist/proof-run-core.d.ts +24 -1
  18. package/dist/proof-run-core.js +7 -1
  19. package/dist/proof-run-engine.cjs +101 -8
  20. package/dist/proof-run-engine.d.cts +24 -0
  21. package/dist/proof-run-engine.d.ts +24 -0
  22. package/dist/proof-run-engine.js +4 -1
  23. package/dist/proof-session.cjs +151 -0
  24. package/dist/proof-session.d.cts +37 -0
  25. package/dist/proof-session.d.ts +37 -0
  26. package/dist/proof-session.js +18 -0
  27. package/dist/result.cjs +1 -0
  28. package/dist/result.js +1 -1
  29. package/dist/runner.cjs +6 -0
  30. package/dist/runner.js +3 -3
  31. package/dist/state.cjs +5 -0
  32. package/dist/state.js +2 -2
  33. package/dist/types.d.cts +67 -1
  34. package/dist/types.d.ts +67 -1
  35. package/package.json +7 -2
  36. package/runtime/lib/preflight.py +42 -2
  37. package/runtime/lib/ship.py +55 -1
  38. package/runtime/lib/util.py +237 -0
  39. package/runtime/lib/verify.py +93 -6
  40. package/runtime/tests/recon_verify_smoke.py +181 -3
package/dist/index.cjs CHANGED
@@ -81,6 +81,11 @@ function ensureAction(action) {
81
81
  function workflowFile(riddleProofDir, action) {
82
82
  return import_node_path.default.join(riddleProofDir, "pipelines", `riddle-proof-${action}.lobster`);
83
83
  }
84
+ function asJsonString(value) {
85
+ if (value === void 0 || value === null || value === "") return "";
86
+ if (typeof value === "string") return value;
87
+ return JSON.stringify(value);
88
+ }
84
89
  function buildSetupArgs(params, config) {
85
90
  if (!params.repo) throw new Error("repo is required for setup/run");
86
91
  if (!params.change_request) throw new Error("change_request is required for setup/run");
@@ -96,8 +101,13 @@ function buildSetupArgs(params, config) {
96
101
  prod_url: params.prod_url || "",
97
102
  capture_script: captureScript,
98
103
  success_criteria: params.success_criteria || "",
99
- assertions_json: params.assertions_json || "",
104
+ assertions_json: params.assertions_json || asJsonString(params.assertions),
100
105
  verification_mode: params.verification_mode || "proof",
106
+ resume_session: params.resume_session || "",
107
+ target_image_url: params.target_image_url || "",
108
+ target_image_hash: params.target_image_hash || "",
109
+ viewport_matrix_json: params.viewport_matrix_json || asJsonString(params.viewport_matrix),
110
+ deterministic_setup_json: params.deterministic_setup_json || asJsonString(params.deterministic_setup),
101
111
  reference: requestedReference,
102
112
  base_branch: params.base_branch || "main",
103
113
  before_ref: params.before_ref || "",
@@ -340,6 +350,44 @@ function normalizedProofAssessment(state = {}) {
340
350
  source: source || null
341
351
  };
342
352
  }
353
+ function objectValue(value) {
354
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
355
+ }
356
+ function normalizedVerificationMode(state = {}) {
357
+ const bundle = objectValue(state?.evidence_bundle);
358
+ const bundleMode = String(bundle.verification_mode || "").trim().toLowerCase();
359
+ if (bundleMode) return bundleMode;
360
+ return String(state?.verification_mode || "proof").trim().toLowerCase() || "proof";
361
+ }
362
+ function visualDeltaRequiredForState(state = {}) {
363
+ const bundle = objectValue(state?.evidence_bundle);
364
+ const contract = objectValue(bundle.artifact_contract);
365
+ const required = objectValue(contract.required);
366
+ return required.visual_delta === true || VISUAL_FIRST_MODES.has(normalizedVerificationMode(state));
367
+ }
368
+ function visualDeltaForState(state = {}) {
369
+ const bundle = objectValue(state?.evidence_bundle);
370
+ const after = objectValue(bundle.after);
371
+ const afterDelta = objectValue(after.visual_delta);
372
+ if (Object.keys(afterDelta).length) return afterDelta;
373
+ const request = objectValue(state?.proof_assessment_request);
374
+ return objectValue(request.visual_delta);
375
+ }
376
+ function visualDeltaShipGateReason(state = {}) {
377
+ if (!visualDeltaRequiredForState(state)) return null;
378
+ const visualDelta = visualDeltaForState(state);
379
+ if (visualDelta.status === "measured" && visualDelta.passed === true) return null;
380
+ const status = String(visualDelta.status || "missing");
381
+ if (status === "unmeasured") {
382
+ return "visual_delta.status=unmeasured blocks ready_to_ship for visual/UI proof";
383
+ }
384
+ if (status === "measured" && visualDelta.passed === false) {
385
+ return "visual_delta.status=measured but visual_delta.passed=false blocks ready_to_ship for visual/UI proof";
386
+ }
387
+ const reason = String(visualDelta.reason || "").trim();
388
+ if (reason) return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof: ${reason}`;
389
+ return `visual_delta.status=${status} blocks ready_to_ship for visual/UI proof`;
390
+ }
343
391
  function requiredBaselineLabelsForState(state = {}) {
344
392
  const reference = normalizedReference(state);
345
393
  const labels = [];
@@ -355,6 +403,10 @@ function validateShipGate(state = {}) {
355
403
  const afterCdn = String(state?.after_cdn || "").trim();
356
404
  const verifyStatus = String(state?.verify_status || "").trim();
357
405
  const proofAssessment = normalizedProofAssessment(state);
406
+ const verificationMode = normalizedVerificationMode(state);
407
+ const visualDelta = visualDeltaForState(state);
408
+ const visualDeltaRequired = visualDeltaRequiredForState(state);
409
+ const visualDeltaBlocker = visualDeltaShipGateReason(state);
358
410
  const reasons = [];
359
411
  if (!["before", "prod", "both"].includes(reference)) {
360
412
  reasons.push(`reference must be before, prod, or both; got ${reference}`);
@@ -383,19 +435,26 @@ function validateShipGate(state = {}) {
383
435
  if (proofAssessment.decision !== "ready_to_ship") {
384
436
  reasons.push("proof_assessment.decision must be ready_to_ship before ship");
385
437
  }
438
+ if (visualDeltaBlocker) {
439
+ reasons.push(visualDeltaBlocker);
440
+ }
386
441
  return {
387
442
  ok: reasons.length === 0,
388
443
  reasons,
389
444
  required_baselines: requiredBaselines,
390
445
  evidence: {
391
446
  reference,
447
+ verification_mode: verificationMode || null,
392
448
  prod_url: prodUrl || null,
393
449
  before_cdn: beforeCdn || null,
394
450
  prod_cdn: prodCdn || null,
395
451
  after_cdn: afterCdn || null,
396
452
  verify_status: verifyStatus || null,
397
453
  proof_assessment_decision: proofAssessment.decision,
398
- proof_assessment_source: proofAssessment.source
454
+ proof_assessment_source: proofAssessment.source,
455
+ visual_delta_required: visualDeltaRequired,
456
+ visual_delta_status: typeof visualDelta.status === "string" ? visualDelta.status : null,
457
+ visual_delta_passed: typeof visualDelta.passed === "boolean" ? visualDelta.passed : null
399
458
  }
400
459
  };
401
460
  }
@@ -440,6 +499,11 @@ function mergeStateFromParams(statePath, params) {
440
499
  "success_criteria",
441
500
  "assertions_json",
442
501
  "verification_mode",
502
+ "resume_session",
503
+ "target_image_url",
504
+ "target_image_hash",
505
+ "viewport_matrix_json",
506
+ "deterministic_setup_json",
443
507
  "base_branch",
444
508
  "before_ref",
445
509
  "context",
@@ -541,23 +605,36 @@ function mergeStateFromParams(statePath, params) {
541
605
  state.proof_assessment_source = null;
542
606
  } else {
543
607
  const parsed = JSON.parse(raw);
544
- state.proof_assessment = {
608
+ const assessment = {
545
609
  ...parsed,
546
610
  source: (parsed?.source || "supervising_agent").toString()
547
611
  };
612
+ const readyBlocker = assessment?.decision === "ready_to_ship" ? visualDeltaShipGateReason({ ...state, proof_assessment: assessment, proof_assessment_source: assessment.source }) : null;
613
+ if (readyBlocker) {
614
+ assessment.blocked_decision = assessment.decision;
615
+ assessment.decision = "needs_richer_proof";
616
+ if (assessment.recommended_stage === "ship") assessment.recommended_stage = "verify";
617
+ if (assessment.continue_with_stage === "ship") assessment.continue_with_stage = "verify";
618
+ const blockers = Array.isArray(assessment.blockers) ? assessment.blockers : [];
619
+ assessment.blockers = [...blockers, readyBlocker];
620
+ }
621
+ state.proof_assessment = assessment;
548
622
  state.proof_assessment_source = state.proof_assessment.source;
549
- if (typeof parsed?.decision === "string") {
550
- state.proof_decision = parsed.decision;
623
+ if (typeof state.proof_assessment?.decision === "string") {
624
+ state.proof_decision = state.proof_assessment.decision;
551
625
  }
552
626
  if (typeof parsed?.summary === "string") {
553
627
  state.proof_assessment_summary = normalizeOptionalString(parsed.summary) || null;
554
628
  }
555
- if (parsed?.decision === "ready_to_ship") {
629
+ if (state.proof_assessment?.decision === "ready_to_ship") {
556
630
  state.merge_recommendation = "ready-to-ship";
557
- } else if (typeof parsed?.decision === "string" && parsed.decision.trim()) {
631
+ } else if (typeof state.proof_assessment?.decision === "string" && state.proof_assessment.decision.trim()) {
558
632
  state.merge_recommendation = "do-not-merge";
559
633
  }
560
634
  appendProofSummaryLine(state, `Supervising proof assessment: ${state.proof_assessment.decision || "unknown"}`);
635
+ if (readyBlocker) {
636
+ appendProofSummaryLine(state, `Ready-to-ship assessment blocked: ${readyBlocker}`);
637
+ }
561
638
  if (state.proof_assessment_summary) {
562
639
  appendProofSummaryLine(state, `Assessment summary: ${state.proof_assessment_summary}`);
563
640
  }
@@ -658,7 +735,10 @@ function summarizeState(state) {
658
735
  explicit_stage_gate: Boolean(state.explicit_stage_gate),
659
736
  last_requested_advance_stage: state.last_requested_advance_stage || null,
660
737
  recon_results: state.recon_results || null,
661
- verify_results: state.verify_results || null
738
+ verify_results: state.verify_results || null,
739
+ proof_session: state.proof_session || null,
740
+ parent_proof_session: state.parent_proof_session || null,
741
+ proof_session_artifact_url: state.proof_session_artifact_url || null
662
742
  };
663
743
  const parts = [
664
744
  state.workspace_ready ? "workspace ready" : "workspace not ready",
@@ -679,7 +759,7 @@ function summarizeState(state) {
679
759
  state: selected
680
760
  };
681
761
  }
682
- var import_node_fs, import_node_crypto, import_node_path, import_node_url, import_meta, WORKFLOW_STAGE_ORDER, CHECKPOINT_CONTRACT_VERSION, BUNDLED_RIDDLE_PROOF_DIR, RIDDLE_PROOF_DIR_CANDIDATES, CHECKPOINT_CONTRACT_SPECS;
762
+ var import_node_fs, import_node_crypto, import_node_path, import_node_url, import_meta, WORKFLOW_STAGE_ORDER, CHECKPOINT_CONTRACT_VERSION, BUNDLED_RIDDLE_PROOF_DIR, RIDDLE_PROOF_DIR_CANDIDATES, VISUAL_FIRST_MODES, CHECKPOINT_CONTRACT_SPECS;
683
763
  var init_proof_run_core = __esm({
684
764
  "src/proof-run-core.ts"() {
685
765
  "use strict";
@@ -698,6 +778,16 @@ var init_proof_run_core = __esm({
698
778
  RIDDLE_PROOF_DIR_CANDIDATES = [
699
779
  BUNDLED_RIDDLE_PROOF_DIR
700
780
  ];
781
+ VISUAL_FIRST_MODES = /* @__PURE__ */ new Set([
782
+ "visual",
783
+ "render",
784
+ "interaction",
785
+ "ui",
786
+ "layout",
787
+ "screenshot",
788
+ "canvas",
789
+ "animation"
790
+ ]);
701
791
  CHECKPOINT_CONTRACT_SPECS = {
702
792
  setup_review: {
703
793
  purpose: "Inspect prepared workspace state before moving into recon."
@@ -1624,6 +1714,9 @@ async function executeWorkflow(params, pluginConfig, resolvedConfig) {
1624
1714
  if (reasons.some((reason) => reason.includes("proof_assessment"))) {
1625
1715
  return "resume with riddle_proof_review using decision=ready_to_ship only after the screenshots and semantic evidence visibly prove the request; otherwise choose needs_implementation or needs_richer_proof";
1626
1716
  }
1717
+ if (reasons.some((reason) => reason.includes("visual_delta"))) {
1718
+ return "rerun verify with a measured before/after visual delta, or choose needs_richer_proof instead of ready_to_ship for this visual proof";
1719
+ }
1627
1720
  if (reasons.some((reason) => reason.includes("after_cdn") || reason.includes("verify_status"))) {
1628
1721
  return "rerun verify with stronger proof framing so after evidence is captured before shipping";
1629
1722
  }
@@ -2643,12 +2736,16 @@ __export(index_exports, {
2643
2736
  DEFAULT_DIAGNOSTIC_STRING_LIMIT: () => DEFAULT_DIAGNOSTIC_STRING_LIMIT,
2644
2737
  RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION: () => RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION,
2645
2738
  RIDDLE_PROOF_RUN_STATE_VERSION: () => RIDDLE_PROOF_RUN_STATE_VERSION,
2739
+ RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION: () => RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION,
2740
+ RIDDLE_PROOF_VISUAL_SESSION_VERSION: () => RIDDLE_PROOF_VISUAL_SESSION_VERSION,
2646
2741
  appendCaptureDiagnostic: () => appendCaptureDiagnostic,
2647
2742
  appendRunEvent: () => appendRunEvent,
2648
2743
  appendStageHeartbeat: () => appendStageHeartbeat,
2649
2744
  applyPrLifecycleState: () => applyPrLifecycleState,
2650
2745
  applyTerminalMetadata: () => applyTerminalMetadata,
2746
+ buildVisualProofSession: () => buildVisualProofSession,
2651
2747
  compactRecord: () => compactRecord,
2748
+ compareVisualProofSessionFingerprint: () => compareVisualProofSessionFingerprint,
2652
2749
  createCaptureDiagnostic: () => createCaptureDiagnostic,
2653
2750
  createDisabledRiddleProofAgentAdapter: () => createDisabledRiddleProofAgentAdapter,
2654
2751
  createRunResult: () => createRunResult,
@@ -2661,13 +2758,16 @@ __export(index_exports, {
2661
2758
  normalizePrLifecycleState: () => normalizePrLifecycleState,
2662
2759
  normalizeRunParams: () => normalizeRunParams,
2663
2760
  normalizeTerminalMetadata: () => normalizeTerminalMetadata,
2761
+ parseVisualProofSession: () => parseVisualProofSession,
2664
2762
  readRiddleProofRunStatus: () => readRiddleProofRunStatus,
2665
2763
  recordValue: () => recordValue,
2666
2764
  redactForProofDiagnostics: () => redactForProofDiagnostics,
2667
2765
  runRiddleProof: () => runRiddleProof,
2668
2766
  runRiddleProofEngineHarness: () => runRiddleProofEngineHarness,
2669
2767
  setRunStatus: () => setRunStatus,
2670
- summarizeCaptureArtifacts: () => summarizeCaptureArtifacts
2768
+ summarizeCaptureArtifacts: () => summarizeCaptureArtifacts,
2769
+ visualSessionFingerprint: () => visualSessionFingerprint,
2770
+ visualSessionFingerprintBasis: () => visualSessionFingerprintBasis
2671
2771
  });
2672
2772
  module.exports = __toCommonJS(index_exports);
2673
2773
 
@@ -2875,6 +2975,7 @@ function createRunResult(input) {
2875
2975
  merge_recommendation: state.merge_recommendation,
2876
2976
  finalized: state.finalized,
2877
2977
  blocker: state.blocker,
2978
+ proof_session: state.proof_session,
2878
2979
  evidence_bundle: input.evidence_bundle,
2879
2980
  raw: input.raw
2880
2981
  });
@@ -2952,6 +3053,11 @@ function normalizeRunParams(input) {
2952
3053
  success_criteria: input.success_criteria,
2953
3054
  assertions: input.assertions,
2954
3055
  verification_mode: input.verification_mode,
3056
+ resume_session: input.resume_session,
3057
+ target_image_url: input.target_image_url,
3058
+ target_image_hash: input.target_image_hash,
3059
+ viewport_matrix: input.viewport_matrix,
3060
+ deterministic_setup: input.deterministic_setup,
2955
3061
  reference: input.reference,
2956
3062
  base_branch: input.base_branch,
2957
3063
  before_ref: input.before_ref,
@@ -3584,6 +3690,7 @@ var import_node_child_process2 = require("child_process");
3584
3690
  var import_node_fs3 = require("fs");
3585
3691
  var import_node_path3 = __toESM(require("path"), 1);
3586
3692
  var import_node_crypto2 = __toESM(require("crypto"), 1);
3693
+ init_proof_run_core();
3587
3694
  var DEFAULT_MAX_ITERATIONS = 12;
3588
3695
  var DEFAULT_STAGE_ITERATION_LIMITS = {
3589
3696
  setup: 2,
@@ -3848,6 +3955,26 @@ function proofAssessmentContinuation(result, payload) {
3848
3955
  const proof_assessment_json = jsonParam(payload);
3849
3956
  return { ...baseContinuation(result), proof_assessment_json };
3850
3957
  }
3958
+ function proofAssessmentVisualBlocker(state, payload) {
3959
+ if (!proofAssessmentRequestsShip(payload)) return null;
3960
+ const source = nonEmptyString(payload.source) || "supervising_agent";
3961
+ return visualDeltaShipGateReason({
3962
+ ...state || {},
3963
+ proof_assessment: { ...payload, source },
3964
+ proof_assessment_source: source
3965
+ });
3966
+ }
3967
+ function blockedProofAssessmentPayload(payload, blocker) {
3968
+ const blockers = Array.isArray(payload.blockers) ? payload.blockers.filter((item) => typeof item === "string") : [];
3969
+ return {
3970
+ ...payload,
3971
+ blocked_decision: payload.decision || "ready_to_ship",
3972
+ decision: "needs_richer_proof",
3973
+ recommended_stage: payload.recommended_stage === "ship" ? "verify" : payload.recommended_stage || "verify",
3974
+ continue_with_stage: payload.continue_with_stage === "ship" ? "verify" : payload.continue_with_stage || "verify",
3975
+ blockers: [...blockers, blocker]
3976
+ };
3977
+ }
3851
3978
  function contextFor(request, state, result) {
3852
3979
  return {
3853
3980
  request,
@@ -4217,6 +4344,20 @@ async function routeCheckpoint(request, state, result, agent, input) {
4217
4344
  summary: assessment.summary,
4218
4345
  details: { payload }
4219
4346
  });
4347
+ const visualBlocker = proofAssessmentVisualBlocker({
4348
+ ...context.fullRiddleState || {},
4349
+ verification_mode: context.fullRiddleState?.verification_mode || request.verification_mode
4350
+ }, payload);
4351
+ if (visualBlocker) {
4352
+ recordEvent(state, {
4353
+ kind: "agent.proof_assessment.blocked",
4354
+ checkpoint,
4355
+ stage: "verify",
4356
+ summary: visualBlocker,
4357
+ details: { payload }
4358
+ });
4359
+ return { next: proofAssessmentContinuation(result, blockedProofAssessmentPayload(payload, visualBlocker)) };
4360
+ }
4220
4361
  if (effectiveShipMode(request, input.config) !== "ship" && proofAssessmentRequestsShip(payload)) {
4221
4362
  return {
4222
4363
  terminal: terminalResult(
@@ -4573,6 +4714,118 @@ function appendCaptureDiagnostic(state, input, historyLimit = DEFAULT_DIAGNOSTIC
4573
4714
  state.capture_diagnostics = [...existing, diagnostic].slice(-Math.max(1, historyLimit));
4574
4715
  return diagnostic;
4575
4716
  }
4717
+
4718
+ // src/proof-session.ts
4719
+ var import_node_crypto3 = require("crypto");
4720
+ var RIDDLE_PROOF_VISUAL_SESSION_VERSION = "riddle-proof.visual-session.v1";
4721
+ var RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION = "riddle-proof.visual-session.fingerprint.v1";
4722
+ function trim(value) {
4723
+ const text = String(value ?? "").trim();
4724
+ return text || void 0;
4725
+ }
4726
+ function hashString(value) {
4727
+ const text = trim(value);
4728
+ if (!text) return void 0;
4729
+ return (0, import_node_crypto3.createHash)("sha256").update(text).digest("hex");
4730
+ }
4731
+ function stableJson(value) {
4732
+ if (value === void 0) return "null";
4733
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
4734
+ if (Array.isArray(value)) return `[${value.map((item) => stableJson(item)).join(",")}]`;
4735
+ const record = value;
4736
+ return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`).join(",")}}`;
4737
+ }
4738
+ function withoutUndefined(record) {
4739
+ for (const key of Object.keys(record)) {
4740
+ if (record[key] === void 0) delete record[key];
4741
+ }
4742
+ return record;
4743
+ }
4744
+ function visualSessionFingerprintBasis(input) {
4745
+ return withoutUndefined({
4746
+ version: RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION,
4747
+ repo: trim(input.repo),
4748
+ route: trim(input.route),
4749
+ wait_for_selector: trim(input.wait_for_selector),
4750
+ reference: trim(input.reference),
4751
+ verification_mode: trim(input.verification_mode)?.toLowerCase(),
4752
+ target_image_url: trim(input.target_image_url),
4753
+ target_image_hash: trim(input.target_image_hash),
4754
+ viewport_matrix: input.viewport_matrix,
4755
+ deterministic_setup: input.deterministic_setup,
4756
+ assertions: input.assertions,
4757
+ capture_script_hash: hashString(input.capture_script)
4758
+ });
4759
+ }
4760
+ function visualSessionFingerprint(input) {
4761
+ const basis = input.version === RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION ? input : visualSessionFingerprintBasis(input);
4762
+ return (0, import_node_crypto3.createHash)("sha256").update(stableJson(basis)).digest("hex");
4763
+ }
4764
+ function buildVisualProofSession(input) {
4765
+ const basis = visualSessionFingerprintBasis(input);
4766
+ const fingerprint = visualSessionFingerprint(basis);
4767
+ const session = {
4768
+ version: RIDDLE_PROOF_VISUAL_SESSION_VERSION,
4769
+ session_id: `rps_${(/* @__PURE__ */ new Date()).toISOString().replace(/[-:.TZ]/g, "").slice(0, 14)}_${(0, import_node_crypto3.randomUUID)().slice(0, 8)}`,
4770
+ run_id: trim(input.run_id),
4771
+ parent_session_id: input.parent?.session_id || null,
4772
+ parent_fingerprint: input.parent?.fingerprint || null,
4773
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
4774
+ fingerprint,
4775
+ fingerprint_basis: basis,
4776
+ repo: trim(input.repo),
4777
+ branch: trim(input.branch),
4778
+ route: withoutUndefined({
4779
+ path: trim(input.route),
4780
+ observed_after_path: trim(input.observed_after_path)
4781
+ }),
4782
+ reference: trim(input.reference),
4783
+ verification_mode: trim(input.verification_mode),
4784
+ target_image: withoutUndefined({
4785
+ url: trim(input.target_image_url),
4786
+ hash: trim(input.target_image_hash)
4787
+ }),
4788
+ viewport_matrix: input.viewport_matrix,
4789
+ deterministic_setup: input.deterministic_setup,
4790
+ capture: withoutUndefined({
4791
+ proof_plan: trim(input.proof_plan),
4792
+ capture_script: trim(input.capture_script),
4793
+ wait_for_selector: trim(input.wait_for_selector)
4794
+ }),
4795
+ assertions: input.assertions,
4796
+ artifacts: input.artifacts,
4797
+ evidence: input.evidence,
4798
+ status: trim(input.status)
4799
+ };
4800
+ return JSON.parse(JSON.stringify(session));
4801
+ }
4802
+ function parseVisualProofSession(value) {
4803
+ const parsed = typeof value === "string" ? JSON.parse(value) : value;
4804
+ if (!parsed || typeof parsed !== "object") throw new Error("proof session must be a JSON object");
4805
+ const session = parsed;
4806
+ if (session.version !== RIDDLE_PROOF_VISUAL_SESSION_VERSION) {
4807
+ throw new Error(`unsupported proof session version: ${String(session.version || "")}`);
4808
+ }
4809
+ if (!session.session_id) throw new Error("proof session missing session_id");
4810
+ if (!session.fingerprint) throw new Error("proof session missing fingerprint");
4811
+ return session;
4812
+ }
4813
+ function compareVisualProofSessionFingerprint(parent, input) {
4814
+ const actual = visualSessionFingerprintBasis(input);
4815
+ const expected = parent.fingerprint_basis || {};
4816
+ const keys = /* @__PURE__ */ new Set([...Object.keys(expected), ...Object.keys(actual)]);
4817
+ const expectedRecord = expected;
4818
+ const actualRecord = actual;
4819
+ const mismatches = [];
4820
+ for (const key of keys) {
4821
+ const expectedValue = expectedRecord[key];
4822
+ const actualValue = actualRecord[key];
4823
+ if (stableJson(expectedValue) !== stableJson(actualValue)) {
4824
+ mismatches.push({ key, expected: expectedValue, actual: actualValue });
4825
+ }
4826
+ }
4827
+ return mismatches;
4828
+ }
4576
4829
  // Annotate the CommonJS export names for ESM import in node:
4577
4830
  0 && (module.exports = {
4578
4831
  DEFAULT_DIAGNOSTIC_ARRAY_LIMIT,
@@ -4580,12 +4833,16 @@ function appendCaptureDiagnostic(state, input, historyLimit = DEFAULT_DIAGNOSTIC
4580
4833
  DEFAULT_DIAGNOSTIC_STRING_LIMIT,
4581
4834
  RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION,
4582
4835
  RIDDLE_PROOF_RUN_STATE_VERSION,
4836
+ RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION,
4837
+ RIDDLE_PROOF_VISUAL_SESSION_VERSION,
4583
4838
  appendCaptureDiagnostic,
4584
4839
  appendRunEvent,
4585
4840
  appendStageHeartbeat,
4586
4841
  applyPrLifecycleState,
4587
4842
  applyTerminalMetadata,
4843
+ buildVisualProofSession,
4588
4844
  compactRecord,
4845
+ compareVisualProofSessionFingerprint,
4589
4846
  createCaptureDiagnostic,
4590
4847
  createDisabledRiddleProofAgentAdapter,
4591
4848
  createRunResult,
@@ -4598,11 +4855,14 @@ function appendCaptureDiagnostic(state, input, historyLimit = DEFAULT_DIAGNOSTIC
4598
4855
  normalizePrLifecycleState,
4599
4856
  normalizeRunParams,
4600
4857
  normalizeTerminalMetadata,
4858
+ parseVisualProofSession,
4601
4859
  readRiddleProofRunStatus,
4602
4860
  recordValue,
4603
4861
  redactForProofDiagnostics,
4604
4862
  runRiddleProof,
4605
4863
  runRiddleProofEngineHarness,
4606
4864
  setRunStatus,
4607
- summarizeCaptureArtifacts
4865
+ summarizeCaptureArtifacts,
4866
+ visualSessionFingerprint,
4867
+ visualSessionFingerprintBasis
4608
4868
  });
package/dist/index.d.cts CHANGED
@@ -1,6 +1,7 @@
1
- export { EvidenceArtifact, EvidenceReference, ImplementationAdapter, ImplementationAdapterInput, ImplementationAdapterResult, IntegrationContext, JsonObject, JsonPrimitive, JsonValue, JudgeAdapter, NotificationAdapter, PreflightAdapter, PreflightAdapterInput, PreflightAdapterResult, ProofAdapter, ProofAdapterInput, ProofAdapterResult, RiddleProofArtifactRole, RiddleProofAssessment, RiddleProofBlocker, RiddleProofDecision, RiddleProofEvent, RiddleProofEvidenceBundle, RiddleProofPrLifecycleState, RiddleProofPrLifecycleStatus, RiddleProofRunParams, RiddleProofRunResult, RiddleProofRunState, RiddleProofRunStatusSnapshot, RiddleProofStage, RiddleProofStatus, RiddleProofTerminalMetadata, RiddleProofVerificationMode, SetupAdapter, SetupAdapterInput, SetupAdapterResult, ShipAdapter } from './types.cjs';
1
+ export { EvidenceArtifact, EvidenceReference, ImplementationAdapter, ImplementationAdapterInput, ImplementationAdapterResult, IntegrationContext, JsonObject, JsonPrimitive, JsonValue, JudgeAdapter, NotificationAdapter, PreflightAdapter, PreflightAdapterInput, PreflightAdapterResult, ProofAdapter, ProofAdapterInput, ProofAdapterResult, RiddleProofArtifactRole, RiddleProofAssessment, RiddleProofBlocker, RiddleProofDecision, RiddleProofEvent, RiddleProofEvidenceBundle, RiddleProofPrLifecycleState, RiddleProofPrLifecycleStatus, RiddleProofRunParams, RiddleProofRunResult, RiddleProofRunState, RiddleProofRunStatusSnapshot, RiddleProofStage, RiddleProofStatus, RiddleProofTerminalMetadata, RiddleProofVerificationMode, RiddleProofVisualSession, RiddleProofVisualSessionFingerprintBasis, SetupAdapter, SetupAdapterInput, SetupAdapterResult, ShipAdapter } from './types.cjs';
2
2
  export { TerminalMetadataInput, applyTerminalMetadata, compactRecord, createRunResult, isSuccessfulStatus, isTerminalStatus, nonEmptyString, normalizeTerminalMetadata, recordValue } from './result.cjs';
3
3
  export { CreateRunStateInput, RIDDLE_PROOF_RUN_STATE_VERSION, RunEventInput, appendRunEvent, appendStageHeartbeat, applyPrLifecycleState, createRunState, createRunStatusSnapshot, normalizeIntegrationContext, normalizePrLifecycleState, normalizeRunParams, setRunStatus } from './state.cjs';
4
4
  export { RiddleProofRunnerAdapters, RunRiddleProofInput, runRiddleProof } from './runner.cjs';
5
5
  export { RiddleProofAgentAdapter, RiddleProofAgentPayload, RiddleProofEngine, RiddleProofEngineHarnessConfig, RiddleProofEngineHarnessContext, RiddleProofEngineResult, RiddleProofShipMode, RiddleProofWorkflowParams, RunRiddleProofEngineHarnessInput, createDisabledRiddleProofAgentAdapter, readRiddleProofRunStatus, runRiddleProofEngineHarness } from './engine-harness.cjs';
6
6
  export { CreateCaptureDiagnosticInput, DEFAULT_DIAGNOSTIC_ARRAY_LIMIT, DEFAULT_DIAGNOSTIC_HISTORY_LIMIT, DEFAULT_DIAGNOSTIC_STRING_LIMIT, RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION, RiddleProofArtifactSummary, RiddleProofCaptureArtifactSummary, RiddleProofCaptureDiagnostic, RiddleProofDiagnosticRedactionOptions, appendCaptureDiagnostic, createCaptureDiagnostic, redactForProofDiagnostics, summarizeCaptureArtifacts } from './diagnostics.cjs';
7
+ export { BuildVisualProofSessionInput, RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION, RIDDLE_PROOF_VISUAL_SESSION_VERSION, VisualProofSessionMismatch, buildVisualProofSession, compareVisualProofSessionFingerprint, parseVisualProofSession, visualSessionFingerprint, visualSessionFingerprintBasis } from './proof-session.cjs';
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export { EvidenceArtifact, EvidenceReference, ImplementationAdapter, ImplementationAdapterInput, ImplementationAdapterResult, IntegrationContext, JsonObject, JsonPrimitive, JsonValue, JudgeAdapter, NotificationAdapter, PreflightAdapter, PreflightAdapterInput, PreflightAdapterResult, ProofAdapter, ProofAdapterInput, ProofAdapterResult, RiddleProofArtifactRole, RiddleProofAssessment, RiddleProofBlocker, RiddleProofDecision, RiddleProofEvent, RiddleProofEvidenceBundle, RiddleProofPrLifecycleState, RiddleProofPrLifecycleStatus, RiddleProofRunParams, RiddleProofRunResult, RiddleProofRunState, RiddleProofRunStatusSnapshot, RiddleProofStage, RiddleProofStatus, RiddleProofTerminalMetadata, RiddleProofVerificationMode, SetupAdapter, SetupAdapterInput, SetupAdapterResult, ShipAdapter } from './types.js';
1
+ export { EvidenceArtifact, EvidenceReference, ImplementationAdapter, ImplementationAdapterInput, ImplementationAdapterResult, IntegrationContext, JsonObject, JsonPrimitive, JsonValue, JudgeAdapter, NotificationAdapter, PreflightAdapter, PreflightAdapterInput, PreflightAdapterResult, ProofAdapter, ProofAdapterInput, ProofAdapterResult, RiddleProofArtifactRole, RiddleProofAssessment, RiddleProofBlocker, RiddleProofDecision, RiddleProofEvent, RiddleProofEvidenceBundle, RiddleProofPrLifecycleState, RiddleProofPrLifecycleStatus, RiddleProofRunParams, RiddleProofRunResult, RiddleProofRunState, RiddleProofRunStatusSnapshot, RiddleProofStage, RiddleProofStatus, RiddleProofTerminalMetadata, RiddleProofVerificationMode, RiddleProofVisualSession, RiddleProofVisualSessionFingerprintBasis, SetupAdapter, SetupAdapterInput, SetupAdapterResult, ShipAdapter } from './types.js';
2
2
  export { TerminalMetadataInput, applyTerminalMetadata, compactRecord, createRunResult, isSuccessfulStatus, isTerminalStatus, nonEmptyString, normalizeTerminalMetadata, recordValue } from './result.js';
3
3
  export { CreateRunStateInput, RIDDLE_PROOF_RUN_STATE_VERSION, RunEventInput, appendRunEvent, appendStageHeartbeat, applyPrLifecycleState, createRunState, createRunStatusSnapshot, normalizeIntegrationContext, normalizePrLifecycleState, normalizeRunParams, setRunStatus } from './state.js';
4
4
  export { RiddleProofRunnerAdapters, RunRiddleProofInput, runRiddleProof } from './runner.js';
5
5
  export { RiddleProofAgentAdapter, RiddleProofAgentPayload, RiddleProofEngine, RiddleProofEngineHarnessConfig, RiddleProofEngineHarnessContext, RiddleProofEngineResult, RiddleProofShipMode, RiddleProofWorkflowParams, RunRiddleProofEngineHarnessInput, createDisabledRiddleProofAgentAdapter, readRiddleProofRunStatus, runRiddleProofEngineHarness } from './engine-harness.js';
6
6
  export { CreateCaptureDiagnosticInput, DEFAULT_DIAGNOSTIC_ARRAY_LIMIT, DEFAULT_DIAGNOSTIC_HISTORY_LIMIT, DEFAULT_DIAGNOSTIC_STRING_LIMIT, RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION, RiddleProofArtifactSummary, RiddleProofCaptureArtifactSummary, RiddleProofCaptureDiagnostic, RiddleProofDiagnosticRedactionOptions, appendCaptureDiagnostic, createCaptureDiagnostic, redactForProofDiagnostics, summarizeCaptureArtifacts } from './diagnostics.js';
7
+ export { BuildVisualProofSessionInput, RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION, RIDDLE_PROOF_VISUAL_SESSION_VERSION, VisualProofSessionMismatch, buildVisualProofSession, compareVisualProofSessionFingerprint, parseVisualProofSession, visualSessionFingerprint, visualSessionFingerprintBasis } from './proof-session.js';
package/dist/index.js CHANGED
@@ -1,3 +1,6 @@
1
+ import {
2
+ runRiddleProof
3
+ } from "./chunk-MQ2BHHLX.js";
1
4
  import "./chunk-6F4PWJZI.js";
2
5
  import {
3
6
  DEFAULT_DIAGNOSTIC_ARRAY_LIMIT,
@@ -13,10 +16,7 @@ import {
13
16
  createDisabledRiddleProofAgentAdapter,
14
17
  readRiddleProofRunStatus,
15
18
  runRiddleProofEngineHarness
16
- } from "./chunk-LIDYNU7Q.js";
17
- import {
18
- runRiddleProof
19
- } from "./chunk-F6VFKS7K.js";
19
+ } from "./chunk-7R6ZQE3X.js";
20
20
  import {
21
21
  RIDDLE_PROOF_RUN_STATE_VERSION,
22
22
  appendRunEvent,
@@ -28,7 +28,17 @@ import {
28
28
  normalizePrLifecycleState,
29
29
  normalizeRunParams,
30
30
  setRunStatus
31
- } from "./chunk-7ZJAUEUN.js";
31
+ } from "./chunk-OASB3CYU.js";
32
+ import "./chunk-4YCWZVBN.js";
33
+ import {
34
+ RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION,
35
+ RIDDLE_PROOF_VISUAL_SESSION_VERSION,
36
+ buildVisualProofSession,
37
+ compareVisualProofSessionFingerprint,
38
+ parseVisualProofSession,
39
+ visualSessionFingerprint,
40
+ visualSessionFingerprintBasis
41
+ } from "./chunk-ODORKNSO.js";
32
42
  import {
33
43
  applyTerminalMetadata,
34
44
  compactRecord,
@@ -38,19 +48,23 @@ import {
38
48
  nonEmptyString,
39
49
  normalizeTerminalMetadata,
40
50
  recordValue
41
- } from "./chunk-TMMKRKY5.js";
51
+ } from "./chunk-J2MERROF.js";
42
52
  export {
43
53
  DEFAULT_DIAGNOSTIC_ARRAY_LIMIT,
44
54
  DEFAULT_DIAGNOSTIC_HISTORY_LIMIT,
45
55
  DEFAULT_DIAGNOSTIC_STRING_LIMIT,
46
56
  RIDDLE_PROOF_CAPTURE_DIAGNOSTIC_VERSION,
47
57
  RIDDLE_PROOF_RUN_STATE_VERSION,
58
+ RIDDLE_PROOF_VISUAL_SESSION_FINGERPRINT_VERSION,
59
+ RIDDLE_PROOF_VISUAL_SESSION_VERSION,
48
60
  appendCaptureDiagnostic,
49
61
  appendRunEvent,
50
62
  appendStageHeartbeat,
51
63
  applyPrLifecycleState,
52
64
  applyTerminalMetadata,
65
+ buildVisualProofSession,
53
66
  compactRecord,
67
+ compareVisualProofSessionFingerprint,
54
68
  createCaptureDiagnostic,
55
69
  createDisabledRiddleProofAgentAdapter,
56
70
  createRunResult,
@@ -63,11 +77,14 @@ export {
63
77
  normalizePrLifecycleState,
64
78
  normalizeRunParams,
65
79
  normalizeTerminalMetadata,
80
+ parseVisualProofSession,
66
81
  readRiddleProofRunStatus,
67
82
  recordValue,
68
83
  redactForProofDiagnostics,
69
84
  runRiddleProof,
70
85
  runRiddleProofEngineHarness,
71
86
  setRunStatus,
72
- summarizeCaptureArtifacts
87
+ summarizeCaptureArtifacts,
88
+ visualSessionFingerprint,
89
+ visualSessionFingerprintBasis
73
90
  };
package/dist/openclaw.cjs CHANGED
@@ -64,6 +64,11 @@ function normalizeRunParams(input) {
64
64
  success_criteria: input.success_criteria,
65
65
  assertions: input.assertions,
66
66
  verification_mode: input.verification_mode,
67
+ resume_session: input.resume_session,
68
+ target_image_url: input.target_image_url,
69
+ target_image_hash: input.target_image_hash,
70
+ viewport_matrix: input.viewport_matrix,
71
+ deterministic_setup: input.deterministic_setup,
67
72
  reference: input.reference,
68
73
  base_branch: input.base_branch,
69
74
  before_ref: input.before_ref,
package/dist/openclaw.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  normalizeIntegrationContext,
3
3
  normalizeRunParams
4
- } from "./chunk-7ZJAUEUN.js";
4
+ } from "./chunk-OASB3CYU.js";
5
5
  import {
6
6
  compactRecord
7
- } from "./chunk-TMMKRKY5.js";
7
+ } from "./chunk-J2MERROF.js";
8
8
 
9
9
  // src/openclaw.ts
10
10
  function parseOpenClawAssertions(value) {