Fix final Greptile decomposition follow-ups

This commit is contained in:
Devin Foley committed 2026-05-27 23:39:06 -07:00
1 parent ac4dee8579
commit 85b9dfcaeb
4 files changed
+35 -22

No files matched your search

@@ -3456,6 +3456,7 @@ describeEmbeddedPostgres("accepted plan decomposition", () => {
actorAgentId: assigneeAgentId,
});
expect(first.decomposition).not.toHaveProperty("requestedChildren");
expect(first.childIssueIds).toHaveLength(2);
expect(first.newlyCreatedIssues).toHaveLength(2);
expect(first.decomposition.status).toBe("completed");
+30 -19
View File
@@ -32,6 +32,7 @@ import {
projects,
} from "@paperclipai/db";
import type {
AcceptedPlanDecomposition,
IssueCommentAuthorType,
IssueCommentMetadata,
IssueCommentPresentation,
@@ -288,6 +289,28 @@ type IssueLastActivityStat = {
latestCommentAt: Date | null;
latestLogAt: Date | null;
};
function serializeAcceptedPlanDecomposition(
decomposition: IssuePlanDecompositionRow,
): AcceptedPlanDecomposition {
return {
id: decomposition.id,
companyId: decomposition.companyId,
sourceIssueId: decomposition.sourceIssueId,
acceptedPlanRevisionId: decomposition.acceptedPlanRevisionId,
acceptedInteractionId: decomposition.acceptedInteractionId,
status: decomposition.status as AcceptedPlanDecomposition["status"],
requestFingerprint: decomposition.requestFingerprint,
requestedChildCount: decomposition.requestedChildCount,
childIssueIds: normalizeIssuePlanDecompositionChildIds(decomposition.childIssueIds),
ownerAgentId: decomposition.ownerAgentId,
ownerUserId: decomposition.ownerUserId,
ownerRunId: decomposition.ownerRunId,
completedAt: decomposition.completedAt,
createdAt: decomposition.createdAt,
updatedAt: decomposition.updatedAt,
};
}
type IssueUserContextInput = {
createdByUserId: string | null;
assigneeUserId: string | null;
@@ -4356,9 +4379,11 @@ export function issueService(db: Db) {
.map((childIssueId) => childIssueMap.get(childIssueId))
.filter((row): row is typeof issues.$inferSelect => Boolean(row));
const decomposition = serializeAcceptedPlanDecomposition(currentClaim);
return {
decomposition: currentClaim,
childIssueIds,
decomposition,
childIssueIds: decomposition.childIssueIds,
childIssues: orderedChildIssues,
newlyCreatedIssues,
};
@@ -4414,24 +4439,10 @@ export function issueService(db: Db) {
const childIssueMap = new Map(childIssueRows.map((row) => [row.id, row]));
return rows.map((row) => {
const decomposition = row.decomposition;
const childIds = normalizeIssuePlanDecompositionChildIds(decomposition.childIssueIds);
const decomposition = serializeAcceptedPlanDecomposition(row.decomposition);
const childIds = decomposition.childIssueIds;
return {
id: decomposition.id,
companyId: decomposition.companyId,
sourceIssueId: decomposition.sourceIssueId,
acceptedPlanRevisionId: decomposition.acceptedPlanRevisionId,
acceptedInteractionId: decomposition.acceptedInteractionId,
status: decomposition.status,
requestFingerprint: decomposition.requestFingerprint,
requestedChildCount: decomposition.requestedChildCount,
childIssueIds: childIds,
ownerAgentId: decomposition.ownerAgentId,
ownerUserId: decomposition.ownerUserId,
ownerRunId: decomposition.ownerRunId,
completedAt: decomposition.completedAt,
createdAt: decomposition.createdAt,
updatedAt: decomposition.updatedAt,
...decomposition,
acceptedPlanRevisionNumber: row.revisionNumber ?? null,
childIssues: childIds
.map((childId) => childIssueMap.get(childId) ?? null)
@@ -55,7 +55,7 @@ export function IssuePlanDecompositionsSection({
<ul className="space-y-3">
{items.map((record) => {
const requested = record.requestedChildCount ?? 0;
const created = record.childIssues?.length ?? 0;
const created = record.childIssueIds?.length ?? 0;
const ownerName = record.ownerAgentId
? agentMap?.get(record.ownerAgentId)?.name ?? "agent"
: null;
+3 -2
View File
@@ -897,8 +897,8 @@ describe("IssueDetail", () => {
acceptedInteractionId: null,
status: "completed",
requestFingerprint: "fingerprint-1",
requestedChildCount: 1,
childIssueIds: ["issue-2"],
requestedChildCount: 2,
childIssueIds: ["issue-2", "issue-3"],
childIssues: [
{
id: "issue-2",
@@ -932,6 +932,7 @@ describe("IssueDetail", () => {
expect(container.textContent).toContain("Plan decomposition");
expect(container.textContent).toContain("Plan revision 2");
expect(container.textContent).toContain("2 of 2 child issues created");
expect(container.textContent).toContain("First child issue");
expect(mockIssuesApi.listAcceptedPlanDecompositions).toHaveBeenCalledWith("issue-1");
});