diff --git a/cli/src/__tests__/company-import-export-e2e.test.ts b/cli/src/__tests__/company-import-export-e2e.test.ts index c543249ea66..6d7ac1d4677 100644 --- a/cli/src/__tests__/company-import-export-e2e.test.ts +++ b/cli/src/__tests__/company-import-export-e2e.test.ts @@ -287,6 +287,11 @@ describeEmbeddedPostgres("paperclipai company import/export e2e", () => { headers: { "content-type": "application/json" }, body: JSON.stringify({ name: `CLI Export Source ${Date.now()}` }), }); + await api(apiBase, `/api/companies/${sourceCompany.id}`, { + method: "PATCH", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ requireBoardApprovalForNewAgents: false }), + }); const sourceAgent = await api<{ id: string; name: string }>( apiBase, diff --git a/server/src/routes/issues.ts b/server/src/routes/issues.ts index 49807016398..64bf785b02b 100644 --- a/server/src/routes/issues.ts +++ b/server/src/routes/issues.ts @@ -769,43 +769,6 @@ export function issueRoutes( res.json(removed); }); - router.get("/issues/:id", async (req, res) => { - const id = req.params.id as string; - const issue = await svc.getById(id); - if (!issue) { - res.status(404).json({ error: "Issue not found" }); - return; - } - assertCompanyAccess(req, issue.companyId); - const [{ project, goal }, ancestors, mentionedProjectIds, documentPayload, relations] = await Promise.all([ - resolveIssueProjectAndGoal(issue), - svc.getAncestors(issue.id), - svc.findMentionedProjectIds(issue.id, { includeCommentBodies: false }), - documentsSvc.getIssueDocumentPayload(issue), - svc.getRelationSummaries(issue.id), - ]); - const mentionedProjects = mentionedProjectIds.length > 0 - ? await projectsSvc.listByIds(issue.companyId, mentionedProjectIds) - : []; - const currentExecutionWorkspace = issue.executionWorkspaceId - ? await executionWorkspacesSvc.getById(issue.executionWorkspaceId) - : null; - const workProducts = await workProductsSvc.listForIssue(issue.id); - res.json({ - ...issue, - goalId: goal?.id ?? issue.goalId, - ancestors, - blockedBy: relations.blockedBy, - blocks: relations.blocks, - ...documentPayload, - project: project ?? null, - goal: goal ?? null, - mentionedProjects, - currentExecutionWorkspace, - workProducts, - }); - }); - router.get("/issues/:id/heartbeat-context", async (req, res) => { const id = req.params.id as string; const issue = await svc.getById(id); @@ -898,6 +861,43 @@ export function issueRoutes( }); }); + router.get("/issues/:id", async (req, res) => { + const id = req.params.id as string; + const issue = await svc.getById(id); + if (!issue) { + res.status(404).json({ error: "Issue not found" }); + return; + } + assertCompanyAccess(req, issue.companyId); + const [{ project, goal }, ancestors, mentionedProjectIds, documentPayload, relations] = await Promise.all([ + resolveIssueProjectAndGoal(issue), + svc.getAncestors(issue.id), + svc.findMentionedProjectIds(issue.id, { includeCommentBodies: false }), + documentsSvc.getIssueDocumentPayload(issue), + svc.getRelationSummaries(issue.id), + ]); + const mentionedProjects = mentionedProjectIds.length > 0 + ? await projectsSvc.listByIds(issue.companyId, mentionedProjectIds) + : []; + const currentExecutionWorkspace = issue.executionWorkspaceId + ? await executionWorkspacesSvc.getById(issue.executionWorkspaceId) + : null; + const workProducts = await workProductsSvc.listForIssue(issue.id); + res.json({ + ...issue, + goalId: goal?.id ?? issue.goalId, + ancestors, + blockedBy: relations.blockedBy, + blocks: relations.blocks, + ...documentPayload, + project: project ?? null, + goal: goal ?? null, + mentionedProjects, + currentExecutionWorkspace, + workProducts, + }); + }); + router.get("/issues/:id/work-products", async (req, res) => { const id = req.params.id as string; const issue = await svc.getById(id);