@riddledc/riddle-proof 0.7.150 → 0.7.151

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/dist/cli.cjs CHANGED
@@ -15064,6 +15064,7 @@ function profileRiddleJobMarkdown(result) {
15064
15064
  const attempts = cliFiniteNumber(riddle.attempts);
15065
15065
  const submittedAt = cliString(riddle.submitted_at);
15066
15066
  const completedAt = cliString(riddle.completed_at);
15067
+ const artifactRecovery = riddle.artifact_recovery === true;
15067
15068
  const parts = [
15068
15069
  mode ? `mode ${markdownInlineCode(mode)}` : "",
15069
15070
  jobCount === void 0 ? "" : `jobs ${jobCount}`,
@@ -15080,6 +15081,9 @@ function profileRiddleJobMarkdown(result) {
15080
15081
  if (submittedAt || completedAt) {
15081
15082
  lines.push(`- timing:${submittedAt ? ` submitted ${markdownInlineCode(submittedAt)}` : ""}${completedAt ? ` completed ${markdownInlineCode(completedAt)}` : ""}`);
15082
15083
  }
15084
+ if (artifactRecovery) {
15085
+ lines.push("- artifact recovery: used artifacts endpoint after non-terminal poll");
15086
+ }
15083
15087
  const splitJobs = Array.isArray(riddle.split_jobs) ? riddle.split_jobs.map(cliRecord).filter((job) => Boolean(job)) : [];
15084
15088
  for (const job of splitJobs.slice(0, 12)) {
15085
15089
  const viewport = cliString(job.viewport) || "viewport";
@@ -15088,13 +15092,15 @@ function profileRiddleJobMarkdown(result) {
15088
15092
  const splitTerminal = typeof job.terminal === "boolean" ? job.terminal : void 0;
15089
15093
  const splitElapsedMs = cliFiniteNumber(job.elapsed_ms);
15090
15094
  const splitPreSubmissionElapsedMs = cliFiniteNumber(job.pre_submission_elapsed_ms);
15095
+ const splitArtifactRecovery = job.artifact_recovery === true;
15091
15096
  lines.push(
15092
15097
  `- ${viewport}: ${[
15093
15098
  splitJobId ? `job ${markdownInlineCode(splitJobId)}` : "",
15094
15099
  splitStatus ? `status ${markdownInlineCode(splitStatus)}` : "",
15095
15100
  splitTerminal === void 0 ? "" : `terminal ${splitTerminal ? "true" : "false"}`,
15096
15101
  splitElapsedMs === void 0 ? "" : `elapsed ${formatPollDuration(splitElapsedMs)}`,
15097
- splitPreSubmissionElapsedMs === void 0 || splitPreSubmissionElapsedMs < 1e3 ? "" : `pre-submit ${formatPollDuration(splitPreSubmissionElapsedMs)}`
15102
+ splitPreSubmissionElapsedMs === void 0 || splitPreSubmissionElapsedMs < 1e3 ? "" : `pre-submit ${formatPollDuration(splitPreSubmissionElapsedMs)}`,
15103
+ splitArtifactRecovery ? "artifact recovery" : ""
15098
15104
  ].filter(Boolean).join(", ") || "job metadata unavailable"}`
15099
15105
  );
15100
15106
  }
@@ -15734,7 +15740,8 @@ function withRiddleMetadata(result, input) {
15734
15740
  elapsed_ms: poll?.elapsed_ms ?? result.riddle?.elapsed_ms,
15735
15741
  attempt: poll?.attempt ?? result.riddle?.attempt,
15736
15742
  attempts: poll?.attempts ?? result.riddle?.attempts,
15737
- timed_out: poll?.timed_out ?? result.riddle?.timed_out
15743
+ timed_out: poll?.timed_out ?? result.riddle?.timed_out,
15744
+ artifact_recovery: input.artifactRecovery ?? result.riddle?.artifact_recovery
15738
15745
  },
15739
15746
  artifacts: {
15740
15747
  ...result.artifacts,
@@ -15742,6 +15749,52 @@ function withRiddleMetadata(result, input) {
15742
15749
  }
15743
15750
  };
15744
15751
  }
15752
+ function riddleArtifactsPayloadStatus(payload) {
15753
+ const record = cliRecord(payload);
15754
+ return cliString(record?.status) ?? cliString(cliRecord(record?.job)?.status);
15755
+ }
15756
+ async function recoverProfileResultFromRiddleArtifacts(profile, input) {
15757
+ if (input.poll.poll?.timed_out !== true) return void 0;
15758
+ let artifactPayload;
15759
+ try {
15760
+ artifactPayload = await input.client.requestJson(`/v1/jobs/${input.jobId}/artifacts`);
15761
+ } catch {
15762
+ return void 0;
15763
+ }
15764
+ const artifacts = collectRiddleProfileArtifactRefs(artifactPayload);
15765
+ if (!artifacts.length) return void 0;
15766
+ const artifactStatus = riddleArtifactsPayloadStatus(artifactPayload);
15767
+ const terminal = artifactStatus ? isTerminalRiddleJobStatus(artifactStatus) : true;
15768
+ const recoveredPoll = input.poll.poll ? {
15769
+ ...input.poll.poll,
15770
+ status: artifactStatus ?? input.poll.poll.status,
15771
+ terminal
15772
+ } : void 0;
15773
+ const artifactResult = await profileResultFromRiddleArtifacts(profile, artifacts, [artifactPayload, input.poll.job]);
15774
+ if (artifactResult) {
15775
+ return withRiddleMetadata(artifactResult, {
15776
+ job_id: input.jobId,
15777
+ status: artifactStatus ?? input.poll.status,
15778
+ terminal,
15779
+ poll: recoveredPoll,
15780
+ artifacts,
15781
+ artifactRecovery: true
15782
+ });
15783
+ }
15784
+ if (!terminal) return void 0;
15785
+ return createRiddleProofProfileInsufficientResult({
15786
+ profile,
15787
+ runner: input.runner,
15788
+ error: `Riddle job ${input.jobId} timed out in status ${input.poll.status || "unknown"}, but artifacts were recovered without a proof result.`,
15789
+ riddle: {
15790
+ ...riddleMetadataFromPoll(input.jobId, input.poll),
15791
+ status: artifactStatus ?? input.poll.status,
15792
+ terminal,
15793
+ artifact_recovery: true
15794
+ },
15795
+ artifacts
15796
+ });
15797
+ }
15745
15798
  function riddleMetadataFromPoll(jobId, poll) {
15746
15799
  return {
15747
15800
  job_id: jobId,
@@ -15804,13 +15857,15 @@ function splitViewportRiddleMetadata(childRuns) {
15804
15857
  elapsed_ms: result.riddle?.elapsed_ms,
15805
15858
  attempt: result.riddle?.attempt,
15806
15859
  attempts: result.riddle?.attempts,
15807
- timed_out: result.riddle?.timed_out
15860
+ timed_out: result.riddle?.timed_out,
15861
+ artifact_recovery: result.riddle?.artifact_recovery
15808
15862
  }));
15809
15863
  return {
15810
15864
  mode: "split-viewports",
15811
15865
  job_count: childRuns.length,
15812
15866
  status: "split-viewports",
15813
15867
  terminal: childRuns.every(({ result }) => result.riddle?.terminal !== false),
15868
+ artifact_recovery: childRuns.some(({ result }) => result.riddle?.artifact_recovery === true),
15814
15869
  queue_elapsed_ms: sumDefinedNumbers(splitJobs.map((job) => job.queue_elapsed_ms)),
15815
15870
  pre_submission_elapsed_ms: sumDefinedNumbers(splitJobs.map((job) => job.pre_submission_elapsed_ms)),
15816
15871
  elapsed_ms: sumDefinedNumbers(splitJobs.map((job) => job.elapsed_ms)),
@@ -15933,6 +15988,13 @@ async function runSingleRiddleProfileForCli(profile, options, input) {
15933
15988
  });
15934
15989
  const artifacts = collectRiddleProfileArtifactRefs(poll.artifacts);
15935
15990
  if (!poll.ok || !poll.terminal) {
15991
+ const recoveredResult = await recoverProfileResultFromRiddleArtifacts(profile, {
15992
+ client,
15993
+ runner,
15994
+ jobId,
15995
+ poll
15996
+ });
15997
+ if (recoveredResult) return recoveredResult;
15936
15998
  return createRiddleProofProfileEnvironmentBlockedResult({
15937
15999
  profile,
15938
16000
  runner,
package/dist/cli.js CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  } from "./chunk-QJJ3ISMK.js";
17
17
  import {
18
18
  createRiddleApiClient,
19
+ isTerminalRiddleJobStatus,
19
20
  parseRiddleViewport
20
21
  } from "./chunk-M3ZTY6PQ.js";
21
22
  import {
@@ -430,6 +431,7 @@ function profileRiddleJobMarkdown(result) {
430
431
  const attempts = cliFiniteNumber(riddle.attempts);
431
432
  const submittedAt = cliString(riddle.submitted_at);
432
433
  const completedAt = cliString(riddle.completed_at);
434
+ const artifactRecovery = riddle.artifact_recovery === true;
433
435
  const parts = [
434
436
  mode ? `mode ${markdownInlineCode(mode)}` : "",
435
437
  jobCount === void 0 ? "" : `jobs ${jobCount}`,
@@ -446,6 +448,9 @@ function profileRiddleJobMarkdown(result) {
446
448
  if (submittedAt || completedAt) {
447
449
  lines.push(`- timing:${submittedAt ? ` submitted ${markdownInlineCode(submittedAt)}` : ""}${completedAt ? ` completed ${markdownInlineCode(completedAt)}` : ""}`);
448
450
  }
451
+ if (artifactRecovery) {
452
+ lines.push("- artifact recovery: used artifacts endpoint after non-terminal poll");
453
+ }
449
454
  const splitJobs = Array.isArray(riddle.split_jobs) ? riddle.split_jobs.map(cliRecord).filter((job) => Boolean(job)) : [];
450
455
  for (const job of splitJobs.slice(0, 12)) {
451
456
  const viewport = cliString(job.viewport) || "viewport";
@@ -454,13 +459,15 @@ function profileRiddleJobMarkdown(result) {
454
459
  const splitTerminal = typeof job.terminal === "boolean" ? job.terminal : void 0;
455
460
  const splitElapsedMs = cliFiniteNumber(job.elapsed_ms);
456
461
  const splitPreSubmissionElapsedMs = cliFiniteNumber(job.pre_submission_elapsed_ms);
462
+ const splitArtifactRecovery = job.artifact_recovery === true;
457
463
  lines.push(
458
464
  `- ${viewport}: ${[
459
465
  splitJobId ? `job ${markdownInlineCode(splitJobId)}` : "",
460
466
  splitStatus ? `status ${markdownInlineCode(splitStatus)}` : "",
461
467
  splitTerminal === void 0 ? "" : `terminal ${splitTerminal ? "true" : "false"}`,
462
468
  splitElapsedMs === void 0 ? "" : `elapsed ${formatPollDuration(splitElapsedMs)}`,
463
- splitPreSubmissionElapsedMs === void 0 || splitPreSubmissionElapsedMs < 1e3 ? "" : `pre-submit ${formatPollDuration(splitPreSubmissionElapsedMs)}`
469
+ splitPreSubmissionElapsedMs === void 0 || splitPreSubmissionElapsedMs < 1e3 ? "" : `pre-submit ${formatPollDuration(splitPreSubmissionElapsedMs)}`,
470
+ splitArtifactRecovery ? "artifact recovery" : ""
464
471
  ].filter(Boolean).join(", ") || "job metadata unavailable"}`
465
472
  );
466
473
  }
@@ -1100,7 +1107,8 @@ function withRiddleMetadata(result, input) {
1100
1107
  elapsed_ms: poll?.elapsed_ms ?? result.riddle?.elapsed_ms,
1101
1108
  attempt: poll?.attempt ?? result.riddle?.attempt,
1102
1109
  attempts: poll?.attempts ?? result.riddle?.attempts,
1103
- timed_out: poll?.timed_out ?? result.riddle?.timed_out
1110
+ timed_out: poll?.timed_out ?? result.riddle?.timed_out,
1111
+ artifact_recovery: input.artifactRecovery ?? result.riddle?.artifact_recovery
1104
1112
  },
1105
1113
  artifacts: {
1106
1114
  ...result.artifacts,
@@ -1108,6 +1116,52 @@ function withRiddleMetadata(result, input) {
1108
1116
  }
1109
1117
  };
1110
1118
  }
1119
+ function riddleArtifactsPayloadStatus(payload) {
1120
+ const record = cliRecord(payload);
1121
+ return cliString(record?.status) ?? cliString(cliRecord(record?.job)?.status);
1122
+ }
1123
+ async function recoverProfileResultFromRiddleArtifacts(profile, input) {
1124
+ if (input.poll.poll?.timed_out !== true) return void 0;
1125
+ let artifactPayload;
1126
+ try {
1127
+ artifactPayload = await input.client.requestJson(`/v1/jobs/${input.jobId}/artifacts`);
1128
+ } catch {
1129
+ return void 0;
1130
+ }
1131
+ const artifacts = collectRiddleProfileArtifactRefs(artifactPayload);
1132
+ if (!artifacts.length) return void 0;
1133
+ const artifactStatus = riddleArtifactsPayloadStatus(artifactPayload);
1134
+ const terminal = artifactStatus ? isTerminalRiddleJobStatus(artifactStatus) : true;
1135
+ const recoveredPoll = input.poll.poll ? {
1136
+ ...input.poll.poll,
1137
+ status: artifactStatus ?? input.poll.poll.status,
1138
+ terminal
1139
+ } : void 0;
1140
+ const artifactResult = await profileResultFromRiddleArtifacts(profile, artifacts, [artifactPayload, input.poll.job]);
1141
+ if (artifactResult) {
1142
+ return withRiddleMetadata(artifactResult, {
1143
+ job_id: input.jobId,
1144
+ status: artifactStatus ?? input.poll.status,
1145
+ terminal,
1146
+ poll: recoveredPoll,
1147
+ artifacts,
1148
+ artifactRecovery: true
1149
+ });
1150
+ }
1151
+ if (!terminal) return void 0;
1152
+ return createRiddleProofProfileInsufficientResult({
1153
+ profile,
1154
+ runner: input.runner,
1155
+ error: `Riddle job ${input.jobId} timed out in status ${input.poll.status || "unknown"}, but artifacts were recovered without a proof result.`,
1156
+ riddle: {
1157
+ ...riddleMetadataFromPoll(input.jobId, input.poll),
1158
+ status: artifactStatus ?? input.poll.status,
1159
+ terminal,
1160
+ artifact_recovery: true
1161
+ },
1162
+ artifacts
1163
+ });
1164
+ }
1111
1165
  function riddleMetadataFromPoll(jobId, poll) {
1112
1166
  return {
1113
1167
  job_id: jobId,
@@ -1170,13 +1224,15 @@ function splitViewportRiddleMetadata(childRuns) {
1170
1224
  elapsed_ms: result.riddle?.elapsed_ms,
1171
1225
  attempt: result.riddle?.attempt,
1172
1226
  attempts: result.riddle?.attempts,
1173
- timed_out: result.riddle?.timed_out
1227
+ timed_out: result.riddle?.timed_out,
1228
+ artifact_recovery: result.riddle?.artifact_recovery
1174
1229
  }));
1175
1230
  return {
1176
1231
  mode: "split-viewports",
1177
1232
  job_count: childRuns.length,
1178
1233
  status: "split-viewports",
1179
1234
  terminal: childRuns.every(({ result }) => result.riddle?.terminal !== false),
1235
+ artifact_recovery: childRuns.some(({ result }) => result.riddle?.artifact_recovery === true),
1180
1236
  queue_elapsed_ms: sumDefinedNumbers(splitJobs.map((job) => job.queue_elapsed_ms)),
1181
1237
  pre_submission_elapsed_ms: sumDefinedNumbers(splitJobs.map((job) => job.pre_submission_elapsed_ms)),
1182
1238
  elapsed_ms: sumDefinedNumbers(splitJobs.map((job) => job.elapsed_ms)),
@@ -1299,6 +1355,13 @@ async function runSingleRiddleProfileForCli(profile, options, input) {
1299
1355
  });
1300
1356
  const artifacts = collectRiddleProfileArtifactRefs(poll.artifacts);
1301
1357
  if (!poll.ok || !poll.terminal) {
1358
+ const recoveredResult = await recoverProfileResultFromRiddleArtifacts(profile, {
1359
+ client,
1360
+ runner,
1361
+ jobId,
1362
+ poll
1363
+ });
1364
+ if (recoveredResult) return recoveredResult;
1302
1365
  return createRiddleProofProfileEnvironmentBlockedResult({
1303
1366
  profile,
1304
1367
  runner,
@@ -391,6 +391,7 @@ interface RiddleProofProfileResult {
391
391
  attempt?: number;
392
392
  attempts?: number;
393
393
  timed_out?: boolean;
394
+ artifact_recovery?: boolean;
394
395
  split_jobs?: Array<{
395
396
  viewport: string;
396
397
  job_id?: string;
@@ -402,6 +403,7 @@ interface RiddleProofProfileResult {
402
403
  attempt?: number;
403
404
  attempts?: number;
404
405
  timed_out?: boolean;
406
+ artifact_recovery?: boolean;
405
407
  }>;
406
408
  };
407
409
  environment_blocker?: Record<string, JsonValue>;
package/dist/profile.d.ts CHANGED
@@ -391,6 +391,7 @@ interface RiddleProofProfileResult {
391
391
  attempt?: number;
392
392
  attempts?: number;
393
393
  timed_out?: boolean;
394
+ artifact_recovery?: boolean;
394
395
  split_jobs?: Array<{
395
396
  viewport: string;
396
397
  job_id?: string;
@@ -402,6 +403,7 @@ interface RiddleProofProfileResult {
402
403
  attempt?: number;
403
404
  attempts?: number;
404
405
  timed_out?: boolean;
406
+ artifact_recovery?: boolean;
405
407
  }>;
406
408
  };
407
409
  environment_blocker?: Record<string, JsonValue>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.7.150",
3
+ "version": "0.7.151",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",