From 72fc7e6b2eb9ae78a46cb1c4f2f5bb738f0ad720 Mon Sep 17 00:00:00 2001 From: Evan Feenstra Date: Wed, 2 Sep 2026 09:04:46 -0700 Subject: [PATCH] =?UTF-8?q?Revert=20"[Jamie]=20Wrap=20Stakwork=20/projects?= =?UTF-8?q?=20payload=20under=20`project`=20key=20so=20webhoo=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f14d1a38a957ae4b1ddb71771e6de09eadfb7cff. --- .../unit/api/api-chat-message.test.ts | 6 +-- .../unit/api/chat/call-stakwork.test.ts | 18 +++---- .../api/chat/message/call-stakwork.test.ts | 21 +++----- .../unit/api/chat/message/route.test.ts | 51 ++++++------------ .../unit/services/call-stakwork-api.test.ts | 39 +++++--------- ...reateChatMessageAndTriggerStakwork.test.ts | 9 ++-- .../unit/services/task-workflow.test.ts | 54 +++++++------------ src/services/task-workflow.ts | 2 +- 8 files changed, 67 insertions(+), 133 deletions(-) diff --git a/src/__tests__/unit/api/api-chat-message.test.ts b/src/__tests__/unit/api/api-chat-message.test.ts index c3069f61d5..207bab5548 100644 --- a/src/__tests__/unit/api/api-chat-message.test.ts +++ b/src/__tests__/unit/api/api-chat-message.test.ts @@ -582,8 +582,7 @@ describe("POST /api/chat/message", () => { expect(fetchCall).toBeTruthy(); - const _rawBody = JSON.parse(fetchCall![1]!.body as string); - const body = (_rawBody && typeof _rawBody === "object" && "project" in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall![1]!.body as string); expect(body.workflow_params.set_var.attributes.vars).toMatchObject({ alias: "testuser", username: "testuser", @@ -617,8 +616,7 @@ describe("POST /api/chat/message", () => { const fetchCall = mockFetch.mock.calls.find((call) => call[0].toString().includes("stakwork")); - const _rawBody = JSON.parse(fetchCall![1]!.body as string); - const body = (_rawBody && typeof _rawBody === "object" && "project" in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall![1]!.body as string); expect(body.workflow_id).toBe(parseInt(expectedWorkflowId)); }); }); diff --git a/src/__tests__/unit/api/chat/call-stakwork.test.ts b/src/__tests__/unit/api/chat/call-stakwork.test.ts index e063b4993c..72b7db14d8 100644 --- a/src/__tests__/unit/api/chat/call-stakwork.test.ts +++ b/src/__tests__/unit/api/chat/call-stakwork.test.ts @@ -206,15 +206,13 @@ const TestHelpers = { ); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.workflow_id).toBe(workflowId); }, expectFetchCalledWithVarsContaining: (expectedVars: Record) => { const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; Object.entries(expectedVars).forEach(([key, value]) => { @@ -502,8 +500,7 @@ describe("callStakwork Function Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.webhook_url).toBe("http://localhost:3000/api/stakwork/webhook?task_id=test-task-id"); }); @@ -722,8 +719,7 @@ describe("callStakwork Function Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload).toMatchObject({ name: expect.stringMatching(/^hive-task-/), @@ -749,8 +745,7 @@ describe("callStakwork Function Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.name).toBe("hive-task-test-task-id"); }); @@ -762,8 +757,7 @@ describe("callStakwork Function Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.workflow_params).toHaveProperty("set_var"); expect(payload.workflow_params.set_var).toHaveProperty("attributes"); diff --git a/src/__tests__/unit/api/chat/message/call-stakwork.test.ts b/src/__tests__/unit/api/chat/message/call-stakwork.test.ts index b9c1119f50..d7d57f23c8 100644 --- a/src/__tests__/unit/api/chat/message/call-stakwork.test.ts +++ b/src/__tests__/unit/api/chat/message/call-stakwork.test.ts @@ -588,8 +588,7 @@ describe("callStakwork Function - Chat Message Processing", () => { // Verify context tags were passed to Stakwork API const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.contextTags).toEqual(contextTags); @@ -1028,8 +1027,7 @@ describe("callStakwork Function - Chat Message Processing", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(101); // First ID from "101,102,103" }); @@ -1050,8 +1048,7 @@ describe("callStakwork Function - Chat Message Processing", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(103); // Third ID from "101,102,103" }); @@ -1072,8 +1069,7 @@ describe("callStakwork Function - Chat Message Processing", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(102); // Second ID from "101,102,103" }); @@ -1243,8 +1239,7 @@ describe("callStakwork Function - Chat Message Processing", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars).toMatchObject({ @@ -1314,8 +1309,7 @@ describe("callStakwork Function - Chat Message Processing", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.webhook_url).toBe( `http://localhost:3000/api/stakwork/webhook?task_id=${mockTaskId}` @@ -1392,8 +1386,7 @@ describe("callStakwork Function - Chat Message Processing", () => { expect(mockS3Service.generatePresignedDownloadUrl).toHaveBeenCalledWith("uploads/file2.jpg"); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.attachments).toEqual([ diff --git a/src/__tests__/unit/api/chat/message/route.test.ts b/src/__tests__/unit/api/chat/message/route.test.ts index dec6a43640..53186f4a3f 100644 --- a/src/__tests__/unit/api/chat/message/route.test.ts +++ b/src/__tests__/unit/api/chat/message/route.test.ts @@ -709,8 +709,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(101); // First workflow ID }); @@ -729,8 +728,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(103); // Third workflow ID }); @@ -749,8 +747,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(103); // Third workflow ID }); @@ -769,8 +766,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(102); // Second workflow ID (default) }); @@ -788,8 +784,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.workflow_id).toBe(102); // Second workflow ID (default) }); @@ -855,8 +850,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars).toMatchObject({ @@ -925,8 +919,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { expect(s3Service.generatePresignedDownloadUrl).toHaveBeenCalledWith("uploads/test/file.pdf"); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.attachments).toEqual(["https://s3.test.com/presigned-url"]); @@ -955,8 +948,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { expect(vi.mocked(getBaseUrl)).toHaveBeenCalledWith(); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.webhookUrl).toBe("https://production.example.com/api/chat/response"); @@ -977,8 +969,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.webhookUrl).toBe("https://custom-webhook.example.com"); @@ -999,8 +990,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); expect(requestBody.webhook_url).toBe(`http://localhost:3000/api/stakwork/webhook?task_id=${mockTaskId}`); }); @@ -1022,8 +1012,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { expect(vi.mocked(transformSwarmUrlToRepo2Graph)).toHaveBeenCalledWith("https://test-swarm.com/api"); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.repo2graph_url).toBe("https://custom-graph.com:3355"); @@ -1415,8 +1404,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.runBuild).toBe(false); @@ -1439,8 +1427,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.runTestSuite).toBe(false); @@ -1463,8 +1450,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.autoMergePr).toBe(true); @@ -1487,8 +1473,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { await POST(request); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.runBuild).toBe(false); @@ -1572,8 +1557,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { ]); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.contextTags).toEqual([ @@ -1695,8 +1679,7 @@ describe("POST /api/chat/message - callStakwork Unit Tests", () => { expect(s3Service.generatePresignedDownloadUrl).toHaveBeenCalledWith("uploads/file2.jpg"); const fetchCall = mockFetch.mock.calls[0]; - const _rawRequestBody = JSON.parse(fetchCall[1].body as string); - const requestBody = (_rawRequestBody && typeof _rawRequestBody === 'object' && 'project' in _rawRequestBody) ? _rawRequestBody.project : _rawRequestBody; + const requestBody = JSON.parse(fetchCall[1].body as string); const vars = requestBody.workflow_params.set_var.attributes.vars; expect(vars.attachments).toEqual(["https://s3.test.com/file1.pdf", "https://s3.test.com/file2.jpg"]); diff --git a/src/__tests__/unit/services/call-stakwork-api.test.ts b/src/__tests__/unit/services/call-stakwork-api.test.ts index cf53806b80..d045d0c0af 100644 --- a/src/__tests__/unit/services/call-stakwork-api.test.ts +++ b/src/__tests__/unit/services/call-stakwork-api.test.ts @@ -96,8 +96,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams()); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.tokenReference).toBe( "{{HIVE_STAGING}}" @@ -113,8 +112,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams()); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.tokenReference).toBe( "{{HIVE_PROD}}" @@ -273,8 +271,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(params); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars).toMatchObject({ message: "Test message content", @@ -298,8 +295,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams()); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body).toHaveProperty("name", "hive-task-test-task-123"); expect(body).toHaveProperty("workflow_id"); @@ -315,8 +311,7 @@ describe("callStakworkAPI", () => { ); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.taskSource).toBe( "codebase_recommendation" @@ -570,8 +565,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ mode: "plan_mode" })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.model).toBe( "claude-3-5-sonnet" @@ -594,8 +588,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ mode: "plan_mode" })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.model).toBeUndefined(); @@ -613,8 +606,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ contextTags: [] })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.contextTags).toEqual( [] @@ -627,8 +619,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ attachments: [] })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.attachments).toEqual( [] @@ -641,8 +632,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ userName: null })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.alias).toBeNull(); expect(body.workflow_params.set_var.attributes.vars.username).toBeNull(); @@ -654,8 +644,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ accessToken: null })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.accessToken).toBeNull(); }); @@ -666,8 +655,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ swarmSecretAlias: null })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect( body.workflow_params.set_var.attributes.vars.swarmSecretAlias @@ -680,8 +668,7 @@ describe("callStakworkAPI", () => { await callStakworkAPI(createTestParams({ poolName: null })); const fetchCall = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(fetchCall[1]?.body as string); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(fetchCall[1]?.body as string); expect(body.workflow_params.set_var.attributes.vars.poolName).toBeNull(); }); diff --git a/src/__tests__/unit/services/task-workflow-createChatMessageAndTriggerStakwork.test.ts b/src/__tests__/unit/services/task-workflow-createChatMessageAndTriggerStakwork.test.ts index 870b315c21..9e88d415ed 100644 --- a/src/__tests__/unit/services/task-workflow-createChatMessageAndTriggerStakwork.test.ts +++ b/src/__tests__/unit/services/task-workflow-createChatMessageAndTriggerStakwork.test.ts @@ -321,8 +321,7 @@ describe("createChatMessageAndTriggerStakwork", () => { ); const call = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(call[1].body); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(call[1].body); expect(body.workflow_id).toBeDefined(); expect(body.webhook_url).toContain("/api/stakwork/webhook"); }); @@ -357,8 +356,7 @@ describe("createChatMessageAndTriggerStakwork", () => { // Assert const call = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(call[1].body); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(call[1].body); expect(body.workflow_id).toBeDefined(); if (mode === "live") { @@ -601,8 +599,7 @@ describe("createChatMessageAndTriggerStakwork", () => { // Assert - Feature context should be included in the Stakwork API call expect(mockFetch).toHaveBeenCalled(); const call = mockFetch.mock.calls[0]; - const _rawBody = JSON.parse(call[1].body); - const body = (_rawBody && typeof _rawBody === 'object' && 'project' in _rawBody) ? _rawBody.project : _rawBody; + const body = JSON.parse(call[1].body); expect(body.workflow_params.set_var.attributes.vars.featureContext).toEqual(featureContext); }); }); diff --git a/src/__tests__/unit/services/task-workflow.test.ts b/src/__tests__/unit/services/task-workflow.test.ts index 67d2595b28..b95f8d9685 100644 --- a/src/__tests__/unit/services/task-workflow.test.ts +++ b/src/__tests__/unit/services/task-workflow.test.ts @@ -297,8 +297,7 @@ const TestHelpers = { expectStakworkCalledWithVars: (expectedVars: Record) => { const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; Object.entries(expectedVars).forEach(([key, value]) => { @@ -312,8 +311,7 @@ const TestHelpers = { vars?: Record; }) => { const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); if (expectedPayload.workflow_id !== undefined) { expect(payload.workflow_id).toBe(expectedPayload.workflow_id); @@ -703,8 +701,7 @@ describe("createChatMessageAndTriggerStakwork (via sendMessageToStakwork)", () = }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.webhook_url).toBe( "http://localhost:3000/api/stakwork/webhook?task_id=test-task-id" @@ -732,8 +729,7 @@ describe("createChatMessageAndTriggerStakwork (via sendMessageToStakwork)", () = }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.workflow_id).toBe(123); // First ID in "123,456,789" for live mode }); @@ -1032,8 +1028,7 @@ describe("createChatMessageAndTriggerStakwork (via createTaskWithStakworkWorkflo }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.workflow_id).toBe(123); // First ID in "123,456,789" for live mode TestHelpers.expectStakworkCalledWithVars({ taskMode: "live", @@ -1053,8 +1048,7 @@ describe("createChatMessageAndTriggerStakwork (via createTaskWithStakworkWorkflo }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.workflow_id).toBe(456); // Second ID for default mode TestHelpers.expectStakworkCalledWithVars({ taskMode: "default", @@ -1075,8 +1069,7 @@ describe("createChatMessageAndTriggerStakwork (via createTaskWithStakworkWorkflo }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.workflow_id).toBe(789); // Third ID for unit mode }); @@ -1094,8 +1087,7 @@ describe("createChatMessageAndTriggerStakwork (via createTaskWithStakworkWorkflo }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.workflow_id).toBe(789); // Third ID for integration mode }); }); @@ -1509,8 +1501,7 @@ describe("Feature Context Integration", () => { }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; expect(vars.featureContext).toBeUndefined(); @@ -1946,8 +1937,7 @@ describe("generateChatTitle Parameter Handling", () => { }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; expect(vars.generateChatTitle).toBeUndefined(); @@ -2200,8 +2190,7 @@ describe("Feature Context Integration", () => { }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; expect(vars.featureContext).toBeUndefined(); @@ -2636,8 +2625,7 @@ describe("generateChatTitle Parameter Handling", () => { }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; expect(vars.generateChatTitle).toBeUndefined(); @@ -2794,8 +2782,7 @@ describe("callStakworkAPI - Direct Unit Tests", () => { await callStakworkAPI(params); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.name).toBe("hive-task-test-task-id"); }); @@ -2817,8 +2804,7 @@ describe("callStakworkAPI - Direct Unit Tests", () => { await callStakworkAPI(params); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); expect(payload.name).toBe(`hive-plan-${featureId}`); }); @@ -3104,8 +3090,7 @@ describe("callStakworkAPI - Direct Unit Tests", () => { const body = fetchCall[1]?.body as string; expect(() => JSON.parse(body)).not.toThrow(); - const _rawPayload = JSON.parse(body); - const payload = (_rawPayload && typeof _rawPayload === "object" && "project" in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(body); expect(payload).toHaveProperty("workflow_id"); expect(payload).toHaveProperty("workflow_params"); }); @@ -4891,8 +4876,7 @@ describe("startTaskWorkflow with includeHistory", () => { }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; expect(vars).not.toHaveProperty("podId"); @@ -4939,8 +4923,7 @@ describe("startTaskWorkflow - featureId forwarding", () => { }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; expect(vars.featureId).toBe("feature-123"); @@ -4971,8 +4954,7 @@ describe("startTaskWorkflow - featureId forwarding", () => { }); const fetchCall = mockFetch.mock.calls[0]; - const _rawPayload = JSON.parse(fetchCall[1]?.body as string); - const payload = (_rawPayload && typeof _rawPayload === 'object' && 'project' in _rawPayload) ? _rawPayload.project : _rawPayload; + const payload = JSON.parse(fetchCall[1]?.body as string); const vars = payload.workflow_params.set_var.attributes.vars; expect(vars).not.toHaveProperty("featureId"); diff --git a/src/services/task-workflow.ts b/src/services/task-workflow.ts index 337992fe80..4c576db1c6 100644 --- a/src/services/task-workflow.ts +++ b/src/services/task-workflow.ts @@ -991,7 +991,7 @@ export async function callStakworkAPI(params: { try { const response = await fetch(stakworkURL, { method: "POST", - body: JSON.stringify({ project: stakworkPayload }), + body: JSON.stringify(stakworkPayload), headers: { Authorization: `Token token=${config.STAKWORK_API_KEY}`, "Content-Type": "application/json",