@paperclipai/server 2026.529.0-canary.4 → 2026.529.0

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 (79) hide show
  1. package/dist/services/heartbeat.d.ts +1 -1
  2. package/dist/services/recovery/service.d.ts.map +1 -1
  3. package/dist/services/recovery/service.js +124 -16
  4. package/dist/services/recovery/service.js.map +1 -1
  5. package/package.json +15 -15
  6. package/ui-dist/assets/{_basePickBy-C0PPL3f7.js → _basePickBy-CatIksFQ.js} +1 -1
  7. package/ui-dist/assets/{_baseUniq-CZCMD1kA.js → _baseUniq-dJHPUSv0.js} +1 -1
  8. package/ui-dist/assets/{arc-bfdqau9G.js → arc-CtH2CgKF.js} +1 -1
  9. package/ui-dist/assets/{architectureDiagram-VXUJARFQ-Svb7tcu-.js → architectureDiagram-VXUJARFQ-DCrIA2M9.js} +1 -1
  10. package/ui-dist/assets/{blockDiagram-VD42YOAC-CxJo3Rzq.js → blockDiagram-VD42YOAC-DwGQlH4Q.js} +1 -1
  11. package/ui-dist/assets/{c4Diagram-YG6GDRKO-Cf9m1S5T.js → c4Diagram-YG6GDRKO-CxQ57CU2.js} +1 -1
  12. package/ui-dist/assets/channel-ocvDhfob.js +1 -0
  13. package/ui-dist/assets/{chunk-4BX2VUAB-BLalIoTO.js → chunk-4BX2VUAB-x5ilG5bS.js} +1 -1
  14. package/ui-dist/assets/{chunk-55IACEB6-txgRHfAZ.js → chunk-55IACEB6-m4-ZL8HW.js} +1 -1
  15. package/ui-dist/assets/{chunk-B4BG7PRW-t3kQ5Ura.js → chunk-B4BG7PRW-CkhS1aBD.js} +1 -1
  16. package/ui-dist/assets/{chunk-DI55MBZ5-DeWGm9gt.js → chunk-DI55MBZ5-CIvY-YNj.js} +1 -1
  17. package/ui-dist/assets/{chunk-FMBD7UC4-BoMrZ2iV.js → chunk-FMBD7UC4-BmrTL91i.js} +1 -1
  18. package/ui-dist/assets/{chunk-QN33PNHL-C6IjB1l6.js → chunk-QN33PNHL-DR0iwv29.js} +1 -1
  19. package/ui-dist/assets/{chunk-QZHKN3VN-ChVV05mk.js → chunk-QZHKN3VN-DbrKL9B9.js} +1 -1
  20. package/ui-dist/assets/{chunk-TZMSLE5B-BzwZejIZ.js → chunk-TZMSLE5B-C2poxbQn.js} +1 -1
  21. package/ui-dist/assets/classDiagram-2ON5EDUG-CB95w61j.js +1 -0
  22. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-CB95w61j.js +1 -0
  23. package/ui-dist/assets/clone-jb5ZaBdh.js +1 -0
  24. package/ui-dist/assets/{cose-bilkent-S5V4N54A-bdqTQOLc.js → cose-bilkent-S5V4N54A-D84ykvZH.js} +1 -1
  25. package/ui-dist/assets/{dagre-6UL2VRFP-CCzfa2k1.js → dagre-6UL2VRFP-DRyzorVF.js} +1 -1
  26. package/ui-dist/assets/{diagram-PSM6KHXK-B_qKINV6.js → diagram-PSM6KHXK-C5wAgyx6.js} +1 -1
  27. package/ui-dist/assets/{diagram-QEK2KX5R-CoROGmQc.js → diagram-QEK2KX5R-CsvnTkVp.js} +1 -1
  28. package/ui-dist/assets/{diagram-S2PKOQOG-BYHf9S7Q.js → diagram-S2PKOQOG-Br9wqTRd.js} +1 -1
  29. package/ui-dist/assets/{erDiagram-Q2GNP2WA-BM2ZwXiE.js → erDiagram-Q2GNP2WA-De9pfq6t.js} +1 -1
  30. package/ui-dist/assets/{flowDiagram-NV44I4VS-Bvo96MkV.js → flowDiagram-NV44I4VS-DvpUOaBO.js} +1 -1
  31. package/ui-dist/assets/{ganttDiagram-JELNMOA3-C60UU2Dp.js → ganttDiagram-JELNMOA3-DEN8e2N4.js} +1 -1
  32. package/ui-dist/assets/{gitGraphDiagram-V2S2FVAM-BoOgDcMP.js → gitGraphDiagram-V2S2FVAM-B6ykMCWZ.js} +1 -1
  33. package/ui-dist/assets/{graph-ClwWvx1q.js → graph-CIjNMTg5.js} +1 -1
  34. package/ui-dist/assets/{index-x54OUiGf.js → index-B-7NLaC_.js} +1 -1
  35. package/ui-dist/assets/{index-BQqXsDOu.js → index-B7tc1Gsm.js} +1 -1
  36. package/ui-dist/assets/{index-k0YB50y5.js → index-BBoy4rd8.js} +1 -1
  37. package/ui-dist/assets/{index-D2GVLFm5.js → index-BJTuScfN.js} +1 -1
  38. package/ui-dist/assets/{index-BewquaVX.js → index-BPHfp057.js} +1 -1
  39. package/ui-dist/assets/{index-BPKSkPS0.js → index-BQG3y5iX.js} +1 -1
  40. package/ui-dist/assets/{index-CaKT511O.js → index-BVrF5LCL.js} +1 -1
  41. package/ui-dist/assets/{index-DjoB0qym.js → index-BW8cVFID.js} +1 -1
  42. package/ui-dist/assets/{index-BDNLnOqE.js → index-C2ybdFaK.js} +1 -1
  43. package/ui-dist/assets/{index-rQT_Rb1F.js → index-C5IuP2_1.js} +1 -1
  44. package/ui-dist/assets/{index-iJZ9TbSz.js → index-CBgD2e-L.js} +1 -1
  45. package/ui-dist/assets/{index-IlhRkaGD.js → index-CP_aXt53.js} +1 -1
  46. package/ui-dist/assets/{index-PuSj4nor.js → index-CjbsnQEI.js} +1 -1
  47. package/ui-dist/assets/{index-_RBYo8Sb.js → index-CuxdjvHM.js} +1 -1
  48. package/ui-dist/assets/{index-K2a4vV0T.js → index-D4-4-4PT.js} +1 -1
  49. package/ui-dist/assets/{index-CiPJkx9z.js → index-DbkwKO1Z.js} +1 -1
  50. package/ui-dist/assets/{index-LzAO_4cT.js → index-Dim4Fhke.js} +1 -1
  51. package/ui-dist/assets/{index-CUwCHG_e.js → index-Dm_8JsFk.js} +1 -1
  52. package/ui-dist/assets/{index--2lVWXG1.js → index-LZBbo_xD.js} +1 -1
  53. package/ui-dist/assets/{index-Bph57_Cz.js → index-Tn2KzsEq.js} +1 -1
  54. package/ui-dist/assets/{index-myc1DDxe.js → index-Ws6WWOnQ.js} +1 -1
  55. package/ui-dist/assets/{index-CCYrWJDo.js → index-XeITbZPL.js} +1 -1
  56. package/ui-dist/assets/{index-BlRedVpY.js → index-lmXzxmTa.js} +34 -34
  57. package/ui-dist/assets/{infoDiagram-HS3SLOUP-BFt3LDgG.js → infoDiagram-HS3SLOUP-BRRFAGiB.js} +1 -1
  58. package/ui-dist/assets/{journeyDiagram-XKPGCS4Q-MdBNCsFv.js → journeyDiagram-XKPGCS4Q-DY36NDPF.js} +1 -1
  59. package/ui-dist/assets/{kanban-definition-3W4ZIXB7-DA3DDn3p.js → kanban-definition-3W4ZIXB7-CYbMkFCf.js} +1 -1
  60. package/ui-dist/assets/{layout-D2INyHEm.js → layout-CDBT31XH.js} +1 -1
  61. package/ui-dist/assets/{linear-B2Z9caew.js → linear-CqB19941.js} +1 -1
  62. package/ui-dist/assets/{mermaid.core-C6pOAIVw.js → mermaid.core-Bc2eS_zN.js} +4 -4
  63. package/ui-dist/assets/{mindmap-definition-VGOIOE7T-Bb0mx1yf.js → mindmap-definition-VGOIOE7T-DYJLwXd1.js} +1 -1
  64. package/ui-dist/assets/{pieDiagram-ADFJNKIX-DS2355BD.js → pieDiagram-ADFJNKIX-nJIUXYcD.js} +1 -1
  65. package/ui-dist/assets/{quadrantDiagram-AYHSOK5B-DhCjhBGt.js → quadrantDiagram-AYHSOK5B-DfuqSIrq.js} +1 -1
  66. package/ui-dist/assets/{requirementDiagram-UZGBJVZJ-Dhdt-9jn.js → requirementDiagram-UZGBJVZJ-uGKVNEde.js} +1 -1
  67. package/ui-dist/assets/{sankeyDiagram-TZEHDZUN-BDIYHXoX.js → sankeyDiagram-TZEHDZUN-D0o0SvBR.js} +1 -1
  68. package/ui-dist/assets/{sequenceDiagram-WL72ISMW-ukbOp2zL.js → sequenceDiagram-WL72ISMW-D0txPBf9.js} +1 -1
  69. package/ui-dist/assets/{stateDiagram-FKZM4ZOC-CTvMmtos.js → stateDiagram-FKZM4ZOC-Dcs3VNuE.js} +1 -1
  70. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-B300Yqmh.js +1 -0
  71. package/ui-dist/assets/{timeline-definition-IT6M3QCI-D2_lavUk.js → timeline-definition-IT6M3QCI-Cv8FNUsa.js} +1 -1
  72. package/ui-dist/assets/{treemap-GDKQZRPO-BgKOOJTs.js → treemap-GDKQZRPO-C9RzZ78j.js} +1 -1
  73. package/ui-dist/assets/{xychartDiagram-PRI3JC2R-BlZt7-Bo.js → xychartDiagram-PRI3JC2R-Blrq3PpH.js} +1 -1
  74. package/ui-dist/index.html +1 -1
  75. package/ui-dist/assets/channel-DM-HbU51.js +0 -1
  76. package/ui-dist/assets/classDiagram-2ON5EDUG-HxBi2jTQ.js +0 -1
  77. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-HxBi2jTQ.js +0 -1
  78. package/ui-dist/assets/clone-B1YzKp4p.js +0 -1
  79. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-BvIavg8V.js +0 -1
@@ -1197,7 +1197,7 @@ export declare function heartbeatService(db: Db, options?: HeartbeatServiceOptio
1197
1197
  } | {
1198
1198
  outcome: "not_scheduled";
1199
1199
  reason: string;
1200
- errorCode: "agent_not_invokable" | "budget_blocked" | "issue_not_found" | "issue_reassigned" | "issue_cancelled" | "issue_terminal_status" | "issue_not_in_progress" | "issue_execution_lock_changed" | "issue_review_participant_changed" | "issue_paused" | "issue_dependencies_blocked";
1200
+ errorCode: "agent_not_invokable" | "budget_blocked" | "issue_paused" | "issue_dependencies_blocked" | "issue_not_found" | "issue_reassigned" | "issue_cancelled" | "issue_terminal_status" | "issue_not_in_progress" | "issue_execution_lock_changed" | "issue_review_participant_changed";
1201
1201
  issueId: string | null;
1202
1202
  attempt?: undefined;
1203
1203
  maxAttempts?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/recovery/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/recovery/service.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,43 @@ function didAutomaticRecoveryFail(latestRun, expectedRetryReason) {
57
57
  return latestRetryReason === expectedRetryReason &&
58
58
  UNSUCCESSFUL_HEARTBEAT_RUN_TERMINAL_STATUSES.includes(latestRun.status);
59
59
  }
60
+ const TRANSIENT_INFRA_CONTINUATION_ERROR_CODES = new Set([
61
+ "adapter_failed",
62
+ "codex_transient_upstream",
63
+ "claude_transient_upstream",
64
+ "timeout",
65
+ ]);
66
+ const NON_RETRYABLE_CONTINUATION_ERROR_CODES = new Set([
67
+ "agent_not_invokable",
68
+ "agent_not_found",
69
+ "budget_blocked",
70
+ "budget_exhausted",
71
+ "issue_paused",
72
+ "issue_dependencies_blocked",
73
+ ]);
74
+ const CONTINUATION_RECOVERY_TRANSIENT_MAX_ATTEMPTS = 3;
75
+ const CONTINUATION_RECOVERY_DEFAULT_MAX_ATTEMPTS = 1;
76
+ const CONTINUATION_RECOVERY_TRANSIENT_BASE_BACKOFF_MS = 60_000;
77
+ function classifyContinuationFailure(latestRun) {
78
+ const errorCode = readNonEmptyString(latestRun?.errorCode);
79
+ if (errorCode && NON_RETRYABLE_CONTINUATION_ERROR_CODES.has(errorCode)) {
80
+ return { kind: "non_retryable", maxAttempts: 0, baseBackoffMs: 0, errorCode };
81
+ }
82
+ if (errorCode && TRANSIENT_INFRA_CONTINUATION_ERROR_CODES.has(errorCode)) {
83
+ return {
84
+ kind: "transient_infra",
85
+ maxAttempts: CONTINUATION_RECOVERY_TRANSIENT_MAX_ATTEMPTS,
86
+ baseBackoffMs: CONTINUATION_RECOVERY_TRANSIENT_BASE_BACKOFF_MS,
87
+ errorCode,
88
+ };
89
+ }
90
+ return {
91
+ kind: "default",
92
+ maxAttempts: CONTINUATION_RECOVERY_DEFAULT_MAX_ATTEMPTS,
93
+ baseBackoffMs: 0,
94
+ errorCode,
95
+ };
96
+ }
60
97
  function successfulRunHandoffRecoveryEvidence(latestRun) {
61
98
  if (!latestRun)
62
99
  return null;
@@ -281,6 +318,39 @@ export function recoveryService(db, deps) {
281
318
  .limit(1)
282
319
  .then((rows) => rows[0] ?? null);
283
320
  }
321
+ async function summarizeRecentContinuationRetries(companyId, issueId, errorCodeToMatch) {
322
+ const rows = await db
323
+ .select({
324
+ id: heartbeatRuns.id,
325
+ status: heartbeatRuns.status,
326
+ errorCode: heartbeatRuns.errorCode,
327
+ contextSnapshot: heartbeatRuns.contextSnapshot,
328
+ finishedAt: heartbeatRuns.finishedAt,
329
+ })
330
+ .from(heartbeatRuns)
331
+ .where(and(eq(heartbeatRuns.companyId, companyId), sql `${heartbeatRuns.contextSnapshot} ->> 'issueId' = ${issueId}`))
332
+ .orderBy(desc(heartbeatRuns.createdAt), desc(heartbeatRuns.id))
333
+ .limit(10);
334
+ let consecutive = 0;
335
+ let latestFinishedAt = null;
336
+ for (const row of rows) {
337
+ const ctx = parseObject(row.contextSnapshot);
338
+ const retryReason = readNonEmptyString(ctx.retryReason);
339
+ if (retryReason !== "issue_continuation_needed")
340
+ break;
341
+ if (!UNSUCCESSFUL_HEARTBEAT_RUN_TERMINAL_STATUSES.includes(row.status)) {
342
+ break;
343
+ }
344
+ const rowErrorCode = readNonEmptyString(row.errorCode);
345
+ if (errorCodeToMatch !== rowErrorCode) {
346
+ break;
347
+ }
348
+ consecutive += 1;
349
+ if (latestFinishedAt === null)
350
+ latestFinishedAt = row.finishedAt ?? null;
351
+ }
352
+ return { consecutive, latestFinishedAt };
353
+ }
284
354
  async function hasActiveExecutionPath(companyId, issueId) {
285
355
  const [run, deferredWake] = await Promise.all([
286
356
  db
@@ -2046,24 +2116,62 @@ export function recoveryService(db, deps) {
2046
2116
  }
2047
2117
  continue;
2048
2118
  }
2049
- if (didAutomaticRecoveryFail(latestRun, "issue_continuation_needed")) {
2050
- const failureSummary = summarizeRunFailureForIssueComment(latestRun);
2051
- const updated = await escalateStrandedAssignedIssue({
2052
- issue,
2053
- previousStatus: "in_progress",
2054
- latestRun,
2055
- comment: "Paperclip automatically retried continuation for this assigned `in_progress` issue after its live " +
2056
- `execution disappeared, but it still has no live execution path.${failureSummary ?? ""} ` +
2057
- "Moving it to `blocked` so it is visible for intervention.",
2058
- });
2059
- if (updated) {
2060
- result.escalated += 1;
2061
- result.issueIds.push(issue.id);
2119
+ if (isUnsuccessfulTerminalIssueRun(latestRun)) {
2120
+ const classification = classifyContinuationFailure(latestRun);
2121
+ if (classification.kind === "non_retryable") {
2122
+ const failureSummary = summarizeRunFailureForIssueComment(latestRun);
2123
+ const updated = await escalateStrandedAssignedIssue({
2124
+ issue,
2125
+ previousStatus: "in_progress",
2126
+ latestRun,
2127
+ comment: "Paperclip detected a non-retryable failure on this issue's continuation run " +
2128
+ `(\`${classification.errorCode}\`). Skipping automatic retries and moving it to \`blocked\` ` +
2129
+ `so it is visible for intervention.${failureSummary ?? ""}`,
2130
+ });
2131
+ if (updated) {
2132
+ result.escalated += 1;
2133
+ result.issueIds.push(issue.id);
2134
+ }
2135
+ else {
2136
+ result.skipped += 1;
2137
+ }
2138
+ continue;
2062
2139
  }
2063
- else {
2064
- result.skipped += 1;
2140
+ if (didAutomaticRecoveryFail(latestRun, "issue_continuation_needed")) {
2141
+ const { consecutive, latestFinishedAt } = await summarizeRecentContinuationRetries(issue.companyId, issue.id, classification.errorCode);
2142
+ if (consecutive >= classification.maxAttempts) {
2143
+ const failureSummary = summarizeRunFailureForIssueComment(latestRun);
2144
+ const attemptCopy = consecutive <= 1 ? "" : ` (${consecutive}× attempts)`;
2145
+ const causeCopy = classification.errorCode
2146
+ ? ` Latest cause: \`${classification.errorCode}\`.`
2147
+ : "";
2148
+ const updated = await escalateStrandedAssignedIssue({
2149
+ issue,
2150
+ previousStatus: "in_progress",
2151
+ latestRun,
2152
+ comment: "Paperclip automatically retried continuation for this assigned `in_progress` issue after its live " +
2153
+ `execution disappeared, but it still has no live execution path${attemptCopy}.${causeCopy}${failureSummary ?? ""} ` +
2154
+ "Moving it to `blocked` so it is visible for intervention.",
2155
+ });
2156
+ if (updated) {
2157
+ result.escalated += 1;
2158
+ result.issueIds.push(issue.id);
2159
+ }
2160
+ else {
2161
+ result.skipped += 1;
2162
+ }
2163
+ continue;
2164
+ }
2165
+ if (classification.baseBackoffMs > 0 && latestFinishedAt) {
2166
+ const elapsed = Date.now() - latestFinishedAt.getTime();
2167
+ const requiredDelay = classification.baseBackoffMs *
2168
+ Math.pow(2, Math.max(0, consecutive - 1));
2169
+ if (elapsed < requiredDelay) {
2170
+ result.skipped += 1;
2171
+ continue;
2172
+ }
2173
+ }
2065
2174
  }
2066
- continue;
2067
2175
  }
2068
2176
  if (await isInvocationBudgetBlocked(issue, agentId)) {
2069
2177
  result.skipped += 1;