@penclipai/server 2026.507.0 → 2026.508.0-canary.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 (102) hide show
  1. package/dist/routes/issues.d.ts.map +1 -1
  2. package/dist/routes/issues.js +75 -5
  3. package/dist/routes/issues.js.map +1 -1
  4. package/dist/services/heartbeat.d.ts +57 -0
  5. package/dist/services/heartbeat.d.ts.map +1 -1
  6. package/dist/services/heartbeat.js +228 -58
  7. package/dist/services/heartbeat.js.map +1 -1
  8. package/dist/services/issues.d.ts +14 -0
  9. package/dist/services/issues.d.ts.map +1 -1
  10. package/dist/services/issues.js +38 -0
  11. package/dist/services/issues.js.map +1 -1
  12. package/dist/services/plugin-worker-manager.d.ts.map +1 -1
  13. package/dist/services/plugin-worker-manager.js +7 -1
  14. package/dist/services/plugin-worker-manager.js.map +1 -1
  15. package/dist/services/recovery/issue-graph-liveness.d.ts +1 -1
  16. package/dist/services/recovery/issue-graph-liveness.d.ts.map +1 -1
  17. package/dist/services/recovery/issue-graph-liveness.js +13 -0
  18. package/dist/services/recovery/issue-graph-liveness.js.map +1 -1
  19. package/dist/services/recovery/service.d.ts.map +1 -1
  20. package/dist/services/recovery/service.js +24 -1
  21. package/dist/services/recovery/service.js.map +1 -1
  22. package/package.json +15 -15
  23. package/ui-dist/assets/{_basePickBy-Cc3e8uUh.js → _basePickBy-5H35nb2M.js} +1 -1
  24. package/ui-dist/assets/{_baseUniq-Bj3oKOiD.js → _baseUniq-BqsDtPj4.js} +1 -1
  25. package/ui-dist/assets/{arc-CmlGGEQQ.js → arc-F3f4deZD.js} +1 -1
  26. package/ui-dist/assets/{architectureDiagram-VXUJARFQ-6wiV73R_.js → architectureDiagram-VXUJARFQ-pBm1fRMv.js} +1 -1
  27. package/ui-dist/assets/{blockDiagram-VD42YOAC-neQYARCK.js → blockDiagram-VD42YOAC-CGtc9RP7.js} +1 -1
  28. package/ui-dist/assets/{browser-ponyfill-BKEcbegq.js → browser-ponyfill-CkdJVj1i.js} +1 -1
  29. package/ui-dist/assets/{c4Diagram-YG6GDRKO-BZ3jkdeD.js → c4Diagram-YG6GDRKO-BXgVj8GH.js} +1 -1
  30. package/ui-dist/assets/channel-BklDDvhc.js +1 -0
  31. package/ui-dist/assets/{chunk-4BX2VUAB-B1rKvSqy.js → chunk-4BX2VUAB-Ds1Y5IYA.js} +1 -1
  32. package/ui-dist/assets/{chunk-55IACEB6-Ckcw6Bf6.js → chunk-55IACEB6-D8GwRmXK.js} +1 -1
  33. package/ui-dist/assets/{chunk-B4BG7PRW-BJRnvIqQ.js → chunk-B4BG7PRW-R_v5U6_B.js} +1 -1
  34. package/ui-dist/assets/{chunk-DI55MBZ5-DDB8J-zX.js → chunk-DI55MBZ5-DO4X9EFt.js} +1 -1
  35. package/ui-dist/assets/{chunk-FMBD7UC4-C3FbLQeU.js → chunk-FMBD7UC4-DUu61Scs.js} +1 -1
  36. package/ui-dist/assets/{chunk-QN33PNHL-Db4z6zv4.js → chunk-QN33PNHL-Bw2VuHcK.js} +1 -1
  37. package/ui-dist/assets/{chunk-QZHKN3VN-CmCfQp3B.js → chunk-QZHKN3VN-BMGdo5T7.js} +1 -1
  38. package/ui-dist/assets/{chunk-TZMSLE5B-Bd02qxRD.js → chunk-TZMSLE5B-Cj_cdifl.js} +1 -1
  39. package/ui-dist/assets/classDiagram-2ON5EDUG-gSWbQXsC.js +1 -0
  40. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-gSWbQXsC.js +1 -0
  41. package/ui-dist/assets/clone-BhrAR33H.js +1 -0
  42. package/ui-dist/assets/{cose-bilkent-S5V4N54A-BZgqrv1v.js → cose-bilkent-S5V4N54A-3YDaxa6o.js} +1 -1
  43. package/ui-dist/assets/{dagre-6UL2VRFP-CdFhYY96.js → dagre-6UL2VRFP-CmLvQKQL.js} +1 -1
  44. package/ui-dist/assets/{diagram-PSM6KHXK-DcQu3_SV.js → diagram-PSM6KHXK-vZK9KPBu.js} +1 -1
  45. package/ui-dist/assets/{diagram-QEK2KX5R-D8yVhwHS.js → diagram-QEK2KX5R-Bu9JBN1e.js} +1 -1
  46. package/ui-dist/assets/{diagram-S2PKOQOG-C7vdRNHD.js → diagram-S2PKOQOG-gPR1ps4Q.js} +1 -1
  47. package/ui-dist/assets/{erDiagram-Q2GNP2WA-CJ-XtPSD.js → erDiagram-Q2GNP2WA-BpqETGGN.js} +1 -1
  48. package/ui-dist/assets/{flowDiagram-NV44I4VS-DBm0hrt1.js → flowDiagram-NV44I4VS-B0iV5Bcy.js} +1 -1
  49. package/ui-dist/assets/{ganttDiagram-JELNMOA3-BHsqyCYA.js → ganttDiagram-JELNMOA3-BxQL_kP7.js} +1 -1
  50. package/ui-dist/assets/{gitGraphDiagram-V2S2FVAM-CYU3tbdA.js → gitGraphDiagram-V2S2FVAM-CSsc-XDT.js} +1 -1
  51. package/ui-dist/assets/{graph-DsOcrMN6.js → graph-DWnTQd3e.js} +1 -1
  52. package/ui-dist/assets/{index-R6JUHkIl.js → index-BEfD-NrI.js} +1 -1
  53. package/ui-dist/assets/{index-DNHOrPSc.js → index-Bw88aPGu.js} +1 -1
  54. package/ui-dist/assets/{index-B2Vy8olR.js → index-C24lwrRh.js} +1 -1
  55. package/ui-dist/assets/{index-BK9gNGf7.js → index-C3xGHm3G.js} +1 -1
  56. package/ui-dist/assets/{index-DXtZ8U34.js → index-CaFk2kgt.js} +1 -1
  57. package/ui-dist/assets/{index-CfEblEh3.js → index-Ckh-TE03.js} +1 -1
  58. package/ui-dist/assets/{index-BmlFyqQ5.js → index-CmZ6XLj-.js} +1 -1
  59. package/ui-dist/assets/{index-DpmD8VRC.js → index-CpOa4tDv.js} +1 -1
  60. package/ui-dist/assets/{index-B8uOww4a.js → index-CqFa1_Kx.js} +1 -1
  61. package/ui-dist/assets/{index-D6hvVXoM.js → index-CxnOSxK9.js} +1 -1
  62. package/ui-dist/assets/{index-CKEqu29s.js → index-CzxxXvnl.js} +1 -1
  63. package/ui-dist/assets/{index-BqIzGx9n.js → index-DNgm4Hx7.js} +1 -1
  64. package/ui-dist/assets/{index-BzzqlCwZ.js → index-DNyOAFyR.js} +1 -1
  65. package/ui-dist/assets/{index-CQMACb1T.js → index-DRqmQ4ym.js} +1 -1
  66. package/ui-dist/assets/{index-BwEKflez.js → index-DUerGXI8.js} +1 -1
  67. package/ui-dist/assets/{index-CZ2RjKgh.js → index-DbsPCpm_.js} +1 -1
  68. package/ui-dist/assets/{index-BOe0TL8n.js → index-DgU-HHpm.js} +1 -1
  69. package/ui-dist/assets/{index-Bczrgzxx.js → index-DiPyhXNL.js} +1 -1
  70. package/ui-dist/assets/{index-DBIHf78J.js → index-Dt3jXp2D.js} +1 -1
  71. package/ui-dist/assets/{index-zo9fGk82.js → index-DvOzQrgz.js} +1 -1
  72. package/ui-dist/assets/index-GwA57FCP.js +537 -0
  73. package/ui-dist/assets/index-RH-ttKJp.css +1 -0
  74. package/ui-dist/assets/{index-B9ynZO9k.js → index-h9lpZQKL.js} +1 -1
  75. package/ui-dist/assets/{index-B32UAAvC.js → index-mfdF2CPG.js} +1 -1
  76. package/ui-dist/assets/{infoDiagram-HS3SLOUP-IcL3xZGz.js → infoDiagram-HS3SLOUP-C9a-DRdF.js} +1 -1
  77. package/ui-dist/assets/{journeyDiagram-XKPGCS4Q-CMcHxEX2.js → journeyDiagram-XKPGCS4Q-Cu752PhZ.js} +1 -1
  78. package/ui-dist/assets/{kanban-definition-3W4ZIXB7-CpYaQyk1.js → kanban-definition-3W4ZIXB7-PXy7IffE.js} +1 -1
  79. package/ui-dist/assets/{layout-D03kDkvS.js → layout-Ci-UJJNd.js} +1 -1
  80. package/ui-dist/assets/{linear-D1O-sqwU.js → linear-D8Qy6J5I.js} +1 -1
  81. package/ui-dist/assets/{mermaid.core-BJ6aY0X4.js → mermaid.core-RTrr9erR.js} +4 -4
  82. package/ui-dist/assets/{mindmap-definition-VGOIOE7T-DURVQfPx.js → mindmap-definition-VGOIOE7T-Ad_ky9GS.js} +1 -1
  83. package/ui-dist/assets/{pieDiagram-ADFJNKIX-DoRGqNok.js → pieDiagram-ADFJNKIX-BPWjI8Sm.js} +1 -1
  84. package/ui-dist/assets/{quadrantDiagram-AYHSOK5B-MzEl7Xp-.js → quadrantDiagram-AYHSOK5B-DxY-Cew9.js} +1 -1
  85. package/ui-dist/assets/{requirementDiagram-UZGBJVZJ-Cw8vJE5_.js → requirementDiagram-UZGBJVZJ-BiUlKNuF.js} +1 -1
  86. package/ui-dist/assets/{sankeyDiagram-TZEHDZUN-rTR9Tdyj.js → sankeyDiagram-TZEHDZUN-t3mfJhUj.js} +1 -1
  87. package/ui-dist/assets/{sequenceDiagram-WL72ISMW-D0hFNrXV.js → sequenceDiagram-WL72ISMW-D90qw9a6.js} +1 -1
  88. package/ui-dist/assets/{stateDiagram-FKZM4ZOC-BhDSKl5C.js → stateDiagram-FKZM4ZOC-DB70vjUm.js} +1 -1
  89. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-WlT0xb9j.js +1 -0
  90. package/ui-dist/assets/{timeline-definition-IT6M3QCI-DaqMGJ5B.js → timeline-definition-IT6M3QCI-CYSOqO3s.js} +1 -1
  91. package/ui-dist/assets/{treemap-GDKQZRPO-Dor9Bfmj.js → treemap-GDKQZRPO-QqfwsQzN.js} +1 -1
  92. package/ui-dist/assets/{xychartDiagram-PRI3JC2R-Cb-LDQxA.js → xychartDiagram-PRI3JC2R-DZuSZ892.js} +1 -1
  93. package/ui-dist/index.html +2 -2
  94. package/ui-dist/locales/en/common.json +448 -8
  95. package/ui-dist/locales/zh-CN/common.json +423 -8
  96. package/ui-dist/assets/channel-qvsQC9QV.js +0 -1
  97. package/ui-dist/assets/classDiagram-2ON5EDUG-AZ89lcJJ.js +0 -1
  98. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-AZ89lcJJ.js +0 -1
  99. package/ui-dist/assets/clone-BwBpGb5M.js +0 -1
  100. package/ui-dist/assets/index-BjvSRpsd.js +0 -537
  101. package/ui-dist/assets/index-CdDgmC1g.css +0 -1
  102. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-BtP31YXf.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/routes/issues.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EA4BL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAG3B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA8C1D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,0CAA0C,CAAC;AASlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAuBhF,KAAK,oBAAoB,GAAG;IAC1B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACtF,CAAC;AA4lBF,wBAAgB,WAAW,CACzB,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE;IACJ,qBAAqB,CAAC,EAAE;QACtB,0BAA0B,CAAC,KAAK,CAAC,EAAE;YACjC,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,GAAG,CAAC,EAAE,IAAI,CAAC;SACZ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACtB,CAAC;IACF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CACtC,8CA6wHP"}
1
+ {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/routes/issues.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EA6BL,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAG3B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA8C1D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,0CAA0C,CAAC;AASlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAuBhF,KAAK,oBAAoB,GAAG;IAC1B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACtF,CAAC;AAkoBF,wBAAgB,WAAW,CACzB,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE;IACJ,qBAAqB,CAAC,EAAE;QACtB,0BAA0B,CAAC,KAAK,CAAC,EAAE;YACjC,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,GAAG,CAAC,EAAE,IAAI,CAAC;SACZ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACtB,CAAC;IACF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CACtC,8CA2zHP"}
@@ -4,7 +4,7 @@ import multer from "multer";
4
4
  import { z } from "zod";
5
5
  import { and, desc, eq, inArray } from "drizzle-orm";
6
6
  import { activityLog, executionWorkspaces, issueExecutionDecisions, projectWorkspaces } from "@penclipai/db";
7
- import { addIssueCommentSchema, acceptIssueThreadInteractionSchema, cancelIssueThreadInteractionSchema, companySearchQuerySchema, createIssueAttachmentMetadataSchema, createIssueThreadInteractionSchema, createIssueWorkProductSchema, createIssueLabelSchema, checkoutIssueSchema, createChildIssueSchema, createIssueSchema, feedbackTargetTypeSchema, feedbackTraceStatusSchema, feedbackVoteValueSchema, upsertIssueFeedbackVoteSchema, linkIssueApprovalSchema, issueDocumentKeySchema, ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY, rejectIssueThreadInteractionSchema, restoreIssueDocumentRevisionSchema, respondIssueThreadInteractionSchema, updateIssueWorkProductSchema, upsertIssueDocumentSchema, updateIssueSchema, getClosedIsolatedExecutionWorkspaceMessage, isClosedIsolatedExecutionWorkspace, normalizeIssueIdentifier as normalizeIssueReferenceIdentifier, } from "@penclipai/shared";
7
+ import { addIssueCommentSchema, acceptIssueThreadInteractionSchema, cancelIssueThreadInteractionSchema, companySearchQuerySchema, createIssueAttachmentMetadataSchema, createIssueThreadInteractionSchema, createIssueWorkProductSchema, createIssueLabelSchema, checkoutIssueSchema, createChildIssueSchema, createIssueSchema, resolveCreateIssueStatusDefault, feedbackTargetTypeSchema, feedbackTraceStatusSchema, feedbackVoteValueSchema, upsertIssueFeedbackVoteSchema, linkIssueApprovalSchema, issueDocumentKeySchema, ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY, rejectIssueThreadInteractionSchema, restoreIssueDocumentRevisionSchema, respondIssueThreadInteractionSchema, updateIssueWorkProductSchema, upsertIssueDocumentSchema, updateIssueSchema, getClosedIsolatedExecutionWorkspaceMessage, isClosedIsolatedExecutionWorkspace, normalizeIssueIdentifier as normalizeIssueReferenceIdentifier, } from "@penclipai/shared";
8
8
  import { getTelemetryClient } from "../telemetry.js";
9
9
  import { trackAgentTaskCompleted } from "@penclipai/shared/telemetry";
10
10
  import { validate } from "../middleware/validate.js";
@@ -44,6 +44,36 @@ function normalizeStringQueryParam(value) {
44
44
  }
45
45
  return undefined;
46
46
  }
47
+ function applyCreateIssueStatusDefault(req, res, next) {
48
+ if (!req.body || typeof req.body !== "object" || Array.isArray(req.body)) {
49
+ next();
50
+ return;
51
+ }
52
+ const resolution = resolveCreateIssueStatusDefault(req.body);
53
+ res.locals.createIssueStatusDefault = resolution;
54
+ if (resolution.defaulted) {
55
+ req.body = {
56
+ ...req.body,
57
+ status: resolution.status,
58
+ };
59
+ }
60
+ next();
61
+ }
62
+ function buildCreateIssueActivityStatusDetails(issue, res) {
63
+ const statusDefault = res.locals.createIssueStatusDefault;
64
+ const assignmentWakeSkipped = !issue.assigneeAgentId || issue.status === "backlog";
65
+ return {
66
+ status: issue.status,
67
+ statusDefaulted: statusDefault?.defaulted ?? false,
68
+ statusDefaultReason: statusDefault?.reason ?? "explicit",
69
+ assignmentWakeSkipped,
70
+ assignmentWakeSkipReason: assignmentWakeSkipped
71
+ ? issue.assigneeAgentId
72
+ ? "assigned_backlog"
73
+ : "no_agent_assignee"
74
+ : null,
75
+ };
76
+ }
47
77
  const SUCCESSFUL_RUN_HANDOFF_ACTIONS = [
48
78
  "issue.successful_run_handoff_required",
49
79
  "issue.successful_run_handoff_resolved",
@@ -1141,7 +1171,7 @@ export function issueRoutes(db, storage, opts = {}) {
1141
1171
  const currentExecutionWorkspacePromise = issue.executionWorkspaceId
1142
1172
  ? executionWorkspacesSvc.getById(issue.executionWorkspaceId)
1143
1173
  : Promise.resolve(null);
1144
- const [{ project, goal }, ancestors, commentCursor, wakeComment, relations, blockerAttention, productivityReview, attachments, continuationSummary, currentExecutionWorkspace,] = await Promise.all([
1174
+ const [{ project, goal }, ancestors, commentCursor, wakeComment, relations, blockerAttention, productivityReview, scheduledRetry, attachments, continuationSummary, currentExecutionWorkspace,] = await Promise.all([
1145
1175
  resolveIssueProjectAndGoal(issue),
1146
1176
  svc.getAncestors(issue.id),
1147
1177
  svc.getCommentCursor(issue.id),
@@ -1149,6 +1179,7 @@ export function issueRoutes(db, storage, opts = {}) {
1149
1179
  svc.getRelationSummaries(issue.id),
1150
1180
  svc.listBlockerAttention(issue.companyId, [issue]).then((map) => map.get(issue.id) ?? null),
1151
1181
  svc.listProductivityReviews(issue.companyId, [issue.id]).then((map) => map.get(issue.id) ?? null),
1182
+ svc.getCurrentScheduledRetry(issue.id),
1152
1183
  svc.listAttachments(issue.id),
1153
1184
  documentsSvc.getIssueDocumentByKey(issue.id, ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY),
1154
1185
  currentExecutionWorkspacePromise,
@@ -1163,6 +1194,7 @@ export function issueRoutes(db, storage, opts = {}) {
1163
1194
  workMode: issue.workMode,
1164
1195
  ...(blockerAttention ? { blockerAttention } : {}),
1165
1196
  productivityReview,
1197
+ scheduledRetry,
1166
1198
  priority: issue.priority,
1167
1199
  projectId: issue.projectId,
1168
1200
  goalId: goal?.id ?? issue.goalId,
@@ -1232,7 +1264,7 @@ export function issueRoutes(db, storage, opts = {}) {
1232
1264
  return;
1233
1265
  }
1234
1266
  assertCompanyAccess(req, issue.companyId);
1235
- const [{ project, goal }, ancestors, mentionedProjectIds, documentPayload, relations, blockerAttention, productivityReview, referenceSummary, successfulRunHandoffStates,] = await Promise.all([
1267
+ const [{ project, goal }, ancestors, mentionedProjectIds, documentPayload, relations, blockerAttention, productivityReview, referenceSummary, successfulRunHandoffStates, scheduledRetry,] = await Promise.all([
1236
1268
  resolveIssueProjectAndGoal(issue),
1237
1269
  svc.getAncestors(issue.id),
1238
1270
  svc.findMentionedProjectIds(issue.id, { includeCommentBodies: false }),
@@ -1242,6 +1274,7 @@ export function issueRoutes(db, storage, opts = {}) {
1242
1274
  svc.listProductivityReviews(issue.companyId, [issue.id]).then((map) => map.get(issue.id) ?? null),
1243
1275
  issueReferencesSvc.listIssueReferenceSummary(issue.id),
1244
1276
  listSuccessfulRunHandoffStates(db, issue.companyId, [issue.id]),
1277
+ svc.getCurrentScheduledRetry(issue.id),
1245
1278
  ]);
1246
1279
  const mentionedProjects = mentionedProjectIds.length > 0
1247
1280
  ? await projectsSvc.listByIds(issue.companyId, mentionedProjectIds)
@@ -1257,6 +1290,7 @@ export function issueRoutes(db, storage, opts = {}) {
1257
1290
  ...(blockerAttention ? { blockerAttention } : {}),
1258
1291
  productivityReview,
1259
1292
  successfulRunHandoff: successfulRunHandoffStates.get(issue.id) ?? null,
1293
+ scheduledRetry,
1260
1294
  blockedBy: relations.blockedBy,
1261
1295
  blocks: relations.blocks,
1262
1296
  relatedWork: referenceSummary,
@@ -1830,7 +1864,7 @@ export function issueRoutes(db, storage, opts = {}) {
1830
1864
  });
1831
1865
  res.json({ ok: true });
1832
1866
  });
1833
- router.post("/companies/:companyId/issues", validate(createIssueSchema), async (req, res) => {
1867
+ router.post("/companies/:companyId/issues", applyCreateIssueStatusDefault, validate(createIssueSchema), async (req, res) => {
1834
1868
  const companyId = req.params.companyId;
1835
1869
  assertCompanyAccess(req, companyId);
1836
1870
  assertNoAgentHostWorkspaceCommandMutation(req, collectIssueWorkspaceCommandPaths(req.body));
@@ -1863,6 +1897,7 @@ export function issueRoutes(db, storage, opts = {}) {
1863
1897
  details: {
1864
1898
  title: issue.title,
1865
1899
  identifier: issue.identifier,
1900
+ ...buildCreateIssueActivityStatusDetails(issue, res),
1866
1901
  ...(Array.isArray(req.body.blockedByIssueIds) ? { blockedByIssueIds: req.body.blockedByIssueIds } : {}),
1867
1902
  ...summarizeIssueReferenceActivityDetails({
1868
1903
  addedReferencedIssues: referenceDiff.addedReferencedIssues.map(summarizeIssueRelationForActivity),
@@ -1909,7 +1944,7 @@ export function issueRoutes(db, storage, opts = {}) {
1909
1944
  referencedIssueIdentifiers: referenceSummary.outbound.map((item) => item.issue.identifier ?? item.issue.id),
1910
1945
  });
1911
1946
  });
1912
- router.post("/issues/:id/children", validate(createChildIssueSchema), async (req, res) => {
1947
+ router.post("/issues/:id/children", applyCreateIssueStatusDefault, validate(createChildIssueSchema), async (req, res) => {
1913
1948
  const parentId = req.params.id;
1914
1949
  const parent = await svc.getById(parentId);
1915
1950
  if (!parent) {
@@ -1946,6 +1981,7 @@ export function issueRoutes(db, storage, opts = {}) {
1946
1981
  parentId: parent.id,
1947
1982
  identifier: issue.identifier,
1948
1983
  title: issue.title,
1984
+ ...buildCreateIssueActivityStatusDetails(issue, res),
1949
1985
  inheritedExecutionWorkspaceFromIssueId: parent.id,
1950
1986
  ...(Array.isArray(req.body.blockedByIssueIds) ? { blockedByIssueIds: req.body.blockedByIssueIds } : {}),
1951
1987
  ...(parentBlockerAdded ? { parentBlockerAdded: true } : {}),
@@ -2003,6 +2039,40 @@ export function issueRoutes(db, storage, opts = {}) {
2003
2039
  });
2004
2040
  res.json({ ok: true });
2005
2041
  });
2042
+ router.post("/issues/:id/scheduled-retry/retry-now", async (req, res) => {
2043
+ assertBoard(req);
2044
+ const id = req.params.id;
2045
+ const issue = await svc.getById(id);
2046
+ if (!issue) {
2047
+ res.status(404).json({ error: "Issue not found" });
2048
+ return;
2049
+ }
2050
+ assertCompanyAccess(req, issue.companyId);
2051
+ const actor = getActorInfo(req);
2052
+ const result = await heartbeat.retryScheduledRetryNow({
2053
+ issueId: issue.id,
2054
+ actor: {
2055
+ actorType: actor.actorType,
2056
+ actorId: actor.actorId,
2057
+ },
2058
+ });
2059
+ await logActivity(db, {
2060
+ companyId: issue.companyId,
2061
+ actorType: actor.actorType,
2062
+ actorId: actor.actorId,
2063
+ action: "issue.scheduled_retry_retry_now",
2064
+ entityType: "issue",
2065
+ entityId: issue.id,
2066
+ agentId: result.scheduledRetry?.agentId ?? issue.assigneeAgentId ?? null,
2067
+ runId: result.scheduledRetry?.runId ?? null,
2068
+ details: {
2069
+ outcome: result.outcome,
2070
+ message: result.message,
2071
+ scheduledRetry: result.scheduledRetry,
2072
+ },
2073
+ });
2074
+ res.json(result);
2075
+ });
2006
2076
  router.patch("/issues/:id", validate(updateIssueRouteSchema), async (req, res) => {
2007
2077
  const id = req.params.id;
2008
2078
  const existing = await svc.getById(id);