@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.
- package/dist/routes/issues.d.ts.map +1 -1
- package/dist/routes/issues.js +75 -5
- package/dist/routes/issues.js.map +1 -1
- package/dist/services/heartbeat.d.ts +57 -0
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +228 -58
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/issues.d.ts +14 -0
- package/dist/services/issues.d.ts.map +1 -1
- package/dist/services/issues.js +38 -0
- package/dist/services/issues.js.map +1 -1
- package/dist/services/plugin-worker-manager.d.ts.map +1 -1
- package/dist/services/plugin-worker-manager.js +7 -1
- package/dist/services/plugin-worker-manager.js.map +1 -1
- package/dist/services/recovery/issue-graph-liveness.d.ts +1 -1
- package/dist/services/recovery/issue-graph-liveness.d.ts.map +1 -1
- package/dist/services/recovery/issue-graph-liveness.js +13 -0
- package/dist/services/recovery/issue-graph-liveness.js.map +1 -1
- package/dist/services/recovery/service.d.ts.map +1 -1
- package/dist/services/recovery/service.js +24 -1
- package/dist/services/recovery/service.js.map +1 -1
- package/package.json +15 -15
- package/ui-dist/assets/{_basePickBy-Cc3e8uUh.js → _basePickBy-5H35nb2M.js} +1 -1
- package/ui-dist/assets/{_baseUniq-Bj3oKOiD.js → _baseUniq-BqsDtPj4.js} +1 -1
- package/ui-dist/assets/{arc-CmlGGEQQ.js → arc-F3f4deZD.js} +1 -1
- package/ui-dist/assets/{architectureDiagram-VXUJARFQ-6wiV73R_.js → architectureDiagram-VXUJARFQ-pBm1fRMv.js} +1 -1
- package/ui-dist/assets/{blockDiagram-VD42YOAC-neQYARCK.js → blockDiagram-VD42YOAC-CGtc9RP7.js} +1 -1
- package/ui-dist/assets/{browser-ponyfill-BKEcbegq.js → browser-ponyfill-CkdJVj1i.js} +1 -1
- package/ui-dist/assets/{c4Diagram-YG6GDRKO-BZ3jkdeD.js → c4Diagram-YG6GDRKO-BXgVj8GH.js} +1 -1
- package/ui-dist/assets/channel-BklDDvhc.js +1 -0
- package/ui-dist/assets/{chunk-4BX2VUAB-B1rKvSqy.js → chunk-4BX2VUAB-Ds1Y5IYA.js} +1 -1
- package/ui-dist/assets/{chunk-55IACEB6-Ckcw6Bf6.js → chunk-55IACEB6-D8GwRmXK.js} +1 -1
- package/ui-dist/assets/{chunk-B4BG7PRW-BJRnvIqQ.js → chunk-B4BG7PRW-R_v5U6_B.js} +1 -1
- package/ui-dist/assets/{chunk-DI55MBZ5-DDB8J-zX.js → chunk-DI55MBZ5-DO4X9EFt.js} +1 -1
- package/ui-dist/assets/{chunk-FMBD7UC4-C3FbLQeU.js → chunk-FMBD7UC4-DUu61Scs.js} +1 -1
- package/ui-dist/assets/{chunk-QN33PNHL-Db4z6zv4.js → chunk-QN33PNHL-Bw2VuHcK.js} +1 -1
- package/ui-dist/assets/{chunk-QZHKN3VN-CmCfQp3B.js → chunk-QZHKN3VN-BMGdo5T7.js} +1 -1
- package/ui-dist/assets/{chunk-TZMSLE5B-Bd02qxRD.js → chunk-TZMSLE5B-Cj_cdifl.js} +1 -1
- package/ui-dist/assets/classDiagram-2ON5EDUG-gSWbQXsC.js +1 -0
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-gSWbQXsC.js +1 -0
- package/ui-dist/assets/clone-BhrAR33H.js +1 -0
- package/ui-dist/assets/{cose-bilkent-S5V4N54A-BZgqrv1v.js → cose-bilkent-S5V4N54A-3YDaxa6o.js} +1 -1
- package/ui-dist/assets/{dagre-6UL2VRFP-CdFhYY96.js → dagre-6UL2VRFP-CmLvQKQL.js} +1 -1
- package/ui-dist/assets/{diagram-PSM6KHXK-DcQu3_SV.js → diagram-PSM6KHXK-vZK9KPBu.js} +1 -1
- package/ui-dist/assets/{diagram-QEK2KX5R-D8yVhwHS.js → diagram-QEK2KX5R-Bu9JBN1e.js} +1 -1
- package/ui-dist/assets/{diagram-S2PKOQOG-C7vdRNHD.js → diagram-S2PKOQOG-gPR1ps4Q.js} +1 -1
- package/ui-dist/assets/{erDiagram-Q2GNP2WA-CJ-XtPSD.js → erDiagram-Q2GNP2WA-BpqETGGN.js} +1 -1
- package/ui-dist/assets/{flowDiagram-NV44I4VS-DBm0hrt1.js → flowDiagram-NV44I4VS-B0iV5Bcy.js} +1 -1
- package/ui-dist/assets/{ganttDiagram-JELNMOA3-BHsqyCYA.js → ganttDiagram-JELNMOA3-BxQL_kP7.js} +1 -1
- package/ui-dist/assets/{gitGraphDiagram-V2S2FVAM-CYU3tbdA.js → gitGraphDiagram-V2S2FVAM-CSsc-XDT.js} +1 -1
- package/ui-dist/assets/{graph-DsOcrMN6.js → graph-DWnTQd3e.js} +1 -1
- package/ui-dist/assets/{index-R6JUHkIl.js → index-BEfD-NrI.js} +1 -1
- package/ui-dist/assets/{index-DNHOrPSc.js → index-Bw88aPGu.js} +1 -1
- package/ui-dist/assets/{index-B2Vy8olR.js → index-C24lwrRh.js} +1 -1
- package/ui-dist/assets/{index-BK9gNGf7.js → index-C3xGHm3G.js} +1 -1
- package/ui-dist/assets/{index-DXtZ8U34.js → index-CaFk2kgt.js} +1 -1
- package/ui-dist/assets/{index-CfEblEh3.js → index-Ckh-TE03.js} +1 -1
- package/ui-dist/assets/{index-BmlFyqQ5.js → index-CmZ6XLj-.js} +1 -1
- package/ui-dist/assets/{index-DpmD8VRC.js → index-CpOa4tDv.js} +1 -1
- package/ui-dist/assets/{index-B8uOww4a.js → index-CqFa1_Kx.js} +1 -1
- package/ui-dist/assets/{index-D6hvVXoM.js → index-CxnOSxK9.js} +1 -1
- package/ui-dist/assets/{index-CKEqu29s.js → index-CzxxXvnl.js} +1 -1
- package/ui-dist/assets/{index-BqIzGx9n.js → index-DNgm4Hx7.js} +1 -1
- package/ui-dist/assets/{index-BzzqlCwZ.js → index-DNyOAFyR.js} +1 -1
- package/ui-dist/assets/{index-CQMACb1T.js → index-DRqmQ4ym.js} +1 -1
- package/ui-dist/assets/{index-BwEKflez.js → index-DUerGXI8.js} +1 -1
- package/ui-dist/assets/{index-CZ2RjKgh.js → index-DbsPCpm_.js} +1 -1
- package/ui-dist/assets/{index-BOe0TL8n.js → index-DgU-HHpm.js} +1 -1
- package/ui-dist/assets/{index-Bczrgzxx.js → index-DiPyhXNL.js} +1 -1
- package/ui-dist/assets/{index-DBIHf78J.js → index-Dt3jXp2D.js} +1 -1
- package/ui-dist/assets/{index-zo9fGk82.js → index-DvOzQrgz.js} +1 -1
- package/ui-dist/assets/index-GwA57FCP.js +537 -0
- package/ui-dist/assets/index-RH-ttKJp.css +1 -0
- package/ui-dist/assets/{index-B9ynZO9k.js → index-h9lpZQKL.js} +1 -1
- package/ui-dist/assets/{index-B32UAAvC.js → index-mfdF2CPG.js} +1 -1
- package/ui-dist/assets/{infoDiagram-HS3SLOUP-IcL3xZGz.js → infoDiagram-HS3SLOUP-C9a-DRdF.js} +1 -1
- package/ui-dist/assets/{journeyDiagram-XKPGCS4Q-CMcHxEX2.js → journeyDiagram-XKPGCS4Q-Cu752PhZ.js} +1 -1
- package/ui-dist/assets/{kanban-definition-3W4ZIXB7-CpYaQyk1.js → kanban-definition-3W4ZIXB7-PXy7IffE.js} +1 -1
- package/ui-dist/assets/{layout-D03kDkvS.js → layout-Ci-UJJNd.js} +1 -1
- package/ui-dist/assets/{linear-D1O-sqwU.js → linear-D8Qy6J5I.js} +1 -1
- package/ui-dist/assets/{mermaid.core-BJ6aY0X4.js → mermaid.core-RTrr9erR.js} +4 -4
- package/ui-dist/assets/{mindmap-definition-VGOIOE7T-DURVQfPx.js → mindmap-definition-VGOIOE7T-Ad_ky9GS.js} +1 -1
- package/ui-dist/assets/{pieDiagram-ADFJNKIX-DoRGqNok.js → pieDiagram-ADFJNKIX-BPWjI8Sm.js} +1 -1
- package/ui-dist/assets/{quadrantDiagram-AYHSOK5B-MzEl7Xp-.js → quadrantDiagram-AYHSOK5B-DxY-Cew9.js} +1 -1
- package/ui-dist/assets/{requirementDiagram-UZGBJVZJ-Cw8vJE5_.js → requirementDiagram-UZGBJVZJ-BiUlKNuF.js} +1 -1
- package/ui-dist/assets/{sankeyDiagram-TZEHDZUN-rTR9Tdyj.js → sankeyDiagram-TZEHDZUN-t3mfJhUj.js} +1 -1
- package/ui-dist/assets/{sequenceDiagram-WL72ISMW-D0hFNrXV.js → sequenceDiagram-WL72ISMW-D90qw9a6.js} +1 -1
- package/ui-dist/assets/{stateDiagram-FKZM4ZOC-BhDSKl5C.js → stateDiagram-FKZM4ZOC-DB70vjUm.js} +1 -1
- package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-WlT0xb9j.js +1 -0
- package/ui-dist/assets/{timeline-definition-IT6M3QCI-DaqMGJ5B.js → timeline-definition-IT6M3QCI-CYSOqO3s.js} +1 -1
- package/ui-dist/assets/{treemap-GDKQZRPO-Dor9Bfmj.js → treemap-GDKQZRPO-QqfwsQzN.js} +1 -1
- package/ui-dist/assets/{xychartDiagram-PRI3JC2R-Cb-LDQxA.js → xychartDiagram-PRI3JC2R-DZuSZ892.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/locales/en/common.json +448 -8
- package/ui-dist/locales/zh-CN/common.json +423 -8
- package/ui-dist/assets/channel-qvsQC9QV.js +0 -1
- package/ui-dist/assets/classDiagram-2ON5EDUG-AZ89lcJJ.js +0 -1
- package/ui-dist/assets/classDiagram-v2-WZHVMYZB-AZ89lcJJ.js +0 -1
- package/ui-dist/assets/clone-BwBpGb5M.js +0 -1
- package/ui-dist/assets/index-BjvSRpsd.js +0 -537
- package/ui-dist/assets/index-CdDgmC1g.css +0 -1
- 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,
|
|
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"}
|
package/dist/routes/issues.js
CHANGED
|
@@ -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);
|