diff --git a/apps/google-docs/package-lock.json b/apps/google-docs/package-lock.json index ee813f1a5f..0ea77b9acf 100644 --- a/apps/google-docs/package-lock.json +++ b/apps/google-docs/package-lock.json @@ -9,17 +9,17 @@ "version": "0.1.0", "dependencies": { "@ai-sdk/openai": "^2.0.56", - "@contentful/app-sdk": "^4.51.3", + "@contentful/app-sdk": "^4.55.1", "@contentful/f36-components": "^5.6.0", "@contentful/f36-icons": "^6.7.1", "@contentful/f36-multiselect": "^6.7.1", "@contentful/f36-tokens": "^5.1.0", "@contentful/field-editor-json": "^3.3.38", "@contentful/node-apps-toolkit": "^3.13.0", - "@contentful/react-apps-toolkit": "^1.2.16", + "@contentful/react-apps-toolkit": "^1.2.22", "@emotion/css": "^11.13.4", "ai": "^5.0.81", - "contentful-management": "^11.61.0", + "contentful-management": "^11.76.0", "googleapis": "^166.0.0", "mammoth": "^1.11.0", "react": "^18.3.1", @@ -533,12 +533,27 @@ } }, "node_modules/@contentful/app-sdk": { - "version": "4.51.3", - "resolved": "https://registry.npmjs.org/@contentful/app-sdk/-/app-sdk-4.51.3.tgz", - "integrity": "sha512-oYY593sFXsR47gP9Q+p6E+9EaH6SSa9dIs1kiekKT1NDdMMiAlgj7aXlaH/kau0GkR6XVxURSb9mD4I6gb6pCw==", - "license": "MIT", + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@contentful/app-sdk/-/app-sdk-4.55.1.tgz", + "integrity": "sha512-u/Z1ishBOGyXSq7E4T2wvEeS5FC83E5o/qYJXHWef99Dr/fYddFhILfj24ryfSCw0GNVnkL0yetxy5SxmB9gNQ==", "dependencies": { - "contentful-management": "^11.67.0" + "contentful-management": "^12.3.1" + } + }, + "node_modules/@contentful/app-sdk/node_modules/contentful-management": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/contentful-management/-/contentful-management-12.3.1.tgz", + "integrity": "sha512-Lnx6ieod2z88AhZwcV2kDhN5stctq+0ifflX+xepphPJ1a2RsPNonCAcySabPETuoNox8G0kXo5ebNybrPjOYw==", + "dependencies": { + "@contentful/rich-text-types": "^16.6.1", + "axios": "^1.15.0", + "contentful-sdk-core": "^9.4.4", + "fast-copy": "^3.0.0", + "globals": "^15.15.0", + "process": "^0.11.10" + }, + "engines": { + "node": ">=20" } }, "node_modules/@contentful/f36-accordion": { @@ -2177,9 +2192,9 @@ } }, "node_modules/@contentful/react-apps-toolkit": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@contentful/react-apps-toolkit/-/react-apps-toolkit-1.2.16.tgz", - "integrity": "sha512-vx7+T4h+w1XBbn7OfRoXr8YUTtiyRNLaltF2ziM4xMqBryu/3Y71nBbhbxD6NIfOui3QIo3TR9Q5sPTZvGbIVw==", + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/@contentful/react-apps-toolkit/-/react-apps-toolkit-1.2.22.tgz", + "integrity": "sha512-xlVHpHfUTQlwWqCfprJh9Q7nt/hRBNnhdaobyGBlVeiN7qPG4O0vsbIoDt86rB1uryki91g0uLtKLtQNdQWjeA==", "dependencies": { "contentful-management": ">=7.30.0" }, @@ -4639,13 +4654,13 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", - "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.1.tgz", + "integrity": "sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" } }, "node_modules/babel-plugin-emotion": { @@ -5127,13 +5142,13 @@ "dev": true }, "node_modules/contentful-management": { - "version": "11.67.0", - "resolved": "https://registry.npmjs.org/contentful-management/-/contentful-management-11.67.0.tgz", - "integrity": "sha512-Al6Dm9eBoLfBERl1nkYWLHGMSR98CCTPdsh466k2tjjlSGDAT3B2D/BnNTzpzidW5vYGIoVjRezGvcedV3vxfg==", + "version": "11.76.0", + "resolved": "https://registry.npmjs.org/contentful-management/-/contentful-management-11.76.0.tgz", + "integrity": "sha512-KsqIZ65q1A6IP55sxTfuAMhBTNJfgGxlVZBoV2ghBuR1LaZZyTqway5vj9KHRDl/Z1uOQQsYSiz+FayMxBXXEw==", "dependencies": { "@contentful/rich-text-types": "^16.6.1", - "axios": "^1.12.2", - "contentful-sdk-core": "^9.0.1", + "axios": "^1.15.0", + "contentful-sdk-core": "^9.4.4", "fast-copy": "^3.0.0", "globals": "^15.15.0" }, @@ -5142,15 +5157,14 @@ } }, "node_modules/contentful-sdk-core": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-9.2.1.tgz", - "integrity": "sha512-Y+Qz2tGYE2ia6o42R8DG4uFSMSLJ6qfAbKQLU6p2+KxsqvbK1Fg60wKVKF+FHMShuCnlg2EwToOvxVsM2N+BrQ==", + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/contentful-sdk-core/-/contentful-sdk-core-9.4.5.tgz", + "integrity": "sha512-8eGTMO11LXFAiosaiV38bjvW6cjoQFtNE38pNtVilZTXpmGFinClljihH0eriv11Ispd4q82TqtsXMJPYD/C+A==", "dependencies": { "fast-copy": "^3.0.2", - "lodash": "^4.17.21", - "p-throttle": "^6.1.0", + "lodash": "^4.17.23", "process": "^0.11.10", - "qs": "^6.12.3" + "qs": "^6.15.0" }, "engines": { "node": ">=18" @@ -5159,6 +5173,11 @@ "@rollup/rollup-linux-x64-gnu": "^4.18.0" } }, + "node_modules/contentful-sdk-core/node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -5839,9 +5858,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7380,17 +7399,6 @@ "node": ">=8" } }, - "node_modules/p-throttle": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-throttle/-/p-throttle-6.2.0.tgz", - "integrity": "sha512-NCKkOVj6PZa6NiTmfvGilDdf6vO1rFCD3KDnkHko8dTOtkpk4cSR/VTAhhLMG9aiQ7/A9HYgEDNmxzf6hxzR3g==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -7606,9 +7614,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } }, "node_modules/pump": { "version": "3.0.3", @@ -7630,9 +7641,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", "dependencies": { "side-channel": "^1.1.0" }, diff --git a/apps/google-docs/package.json b/apps/google-docs/package.json index fe7fca25c1..64c745ec4f 100644 --- a/apps/google-docs/package.json +++ b/apps/google-docs/package.json @@ -4,17 +4,17 @@ "private": true, "dependencies": { "@ai-sdk/openai": "^2.0.56", - "@contentful/app-sdk": "^4.51.3", + "@contentful/app-sdk": "^4.55.1", "@contentful/f36-components": "^5.6.0", "@contentful/f36-icons": "^6.7.1", "@contentful/f36-multiselect": "^6.7.1", "@contentful/f36-tokens": "^5.1.0", "@contentful/field-editor-json": "^3.3.38", "@contentful/node-apps-toolkit": "^3.13.0", - "@contentful/react-apps-toolkit": "^1.2.16", + "@contentful/react-apps-toolkit": "^1.2.22", "@emotion/css": "^11.13.4", "ai": "^5.0.81", - "contentful-management": "^11.61.0", + "contentful-management": "^11.76.0", "googleapis": "^166.0.0", "mammoth": "^1.11.0", "react": "^18.3.1", diff --git a/apps/google-docs/src/hooks/useWorkflowAgent.ts b/apps/google-docs/src/hooks/useWorkflowAgent.ts index d4a5b7807e..c008e5887c 100644 --- a/apps/google-docs/src/hooks/useWorkflowAgent.ts +++ b/apps/google-docs/src/hooks/useWorkflowAgent.ts @@ -118,6 +118,7 @@ const getWorkflowRunResult = ( switch (status) { case RunStatus.FAILED: + console.error('[getWorkflowRunResult] run FAILED. Full runData:', JSON.stringify(runData)); throw new Error(getRunErrorMessage(runData)); case RunStatus.PENDING_REVIEW: { diff --git a/apps/google-docs/src/locations/Page/components/mainpage/ModalOrchestrator.tsx b/apps/google-docs/src/locations/Page/components/mainpage/ModalOrchestrator.tsx index 4d9c1821e7..26e3b4b61e 100644 --- a/apps/google-docs/src/locations/Page/components/mainpage/ModalOrchestrator.tsx +++ b/apps/google-docs/src/locations/Page/components/mainpage/ModalOrchestrator.tsx @@ -181,9 +181,11 @@ export const ModalOrchestrator = forwardRef; } -function getJsonHeaders(): HeadersInit { - return { - ...AGENTS_API_HEADERS, - 'Content-Type': 'application/json', - }; -} - export async function getWorkflowRun( sdk: PageAppSDK, spaceId: string, environmentId: string, runId: string ): Promise { - if (LOCAL_AGENTS_API_BASE_URL) { + if (USE_LOCAL_AGENTS_API) { const response = await fetch( `${LOCAL_AGENTS_API_BASE_URL}/spaces/${spaceId}/environments/${environmentId}/ai_agents/runs/${runId}`, { @@ -79,12 +79,16 @@ export async function getWorkflowRun( } try { - return (await sdk.cma.agentRun.get({ + console.log('[getWorkflowRun] calling sdk.cma.agentRun.get for run', runId); + const result = (await sdk.cma.agentRun.get({ spaceId, environmentId, runId, })) as AgentRunData; + console.log('[getWorkflowRun] run status:', result?.sys?.status ?? result?.metadata?.status, 'full:', JSON.stringify(result)); + return result; } catch (error: unknown) { + console.error('[getWorkflowRun] error:', error); const err = error as { code?: string }; if (err?.code === 'NotFound') { return null; @@ -102,7 +106,7 @@ export async function startAgentRun( ): Promise { let runData: AgentRunData; - if (LOCAL_AGENTS_API_BASE_URL) { + if (USE_LOCAL_AGENTS_API) { const response = await fetch( `${LOCAL_AGENTS_API_BASE_URL}/spaces/${spaceId}/environments/${environmentId}/ai_agents/agents/${WORKFLOW_AGENT_ID}/generate`, { @@ -121,19 +125,24 @@ export async function startAgentRun( runData = (await response.json()) as AgentRunData; } else { try { + console.log('[startAgentRun] calling sdk.cma.agent.generate for agent', WORKFLOW_AGENT_ID, 'space', spaceId, 'env', environmentId, 'threadId', payload.threadId); runData = (await sdk.cma.agent.generate( { agentId: WORKFLOW_AGENT_ID, spaceId, environmentId }, payload )) as AgentRunData; + console.log('[startAgentRun] generate response:', JSON.stringify(runData)); } catch (error) { + console.error('[startAgentRun] sdk.cma.agent.generate failed:', error); throw new Error(`Failed to start workflow agent run: ${error as Error}`); } } if (!runData.sys?.id) { + console.error('[startAgentRun] no run ID in response:', JSON.stringify(runData)); throw new Error('Agent run started but no run ID was returned'); } + console.log('[startAgentRun] run started with ID', runData.sys.id); return runData.sys.id; } @@ -150,7 +159,7 @@ export async function resumeWorkflowRun( runId: string, resumePayload: ResumePayload ): Promise { - if (LOCAL_AGENTS_API_BASE_URL) { + if (USE_LOCAL_AGENTS_API) { const response = await fetch( `${LOCAL_AGENTS_API_BASE_URL}/spaces/${spaceId}/environments/${environmentId}/ai_agents/runs/${runId}/resume`, { @@ -167,16 +176,15 @@ export async function resumeWorkflowRun( return; } - const agentRunApi = sdk.cma.agentRun as { - resume?: ( - params: { spaceId: string; environmentId: string; runId: string }, - body: { resumePayload: ResumePayload } - ) => Promise; - }; - - if (!agentRunApi.resume) { - throw new Error('Agent run resume is not available in the current SDK.'); + try { + console.log('[resumeWorkflowRun] calling sdk.cma.agentRun.resumeRun for run', runId, 'payload:', resumePayload); + await sdk.cma.agentRun.resumeRun( + { spaceId, environmentId, runId }, + { resumePayload: resumePayload as Record } + ); + console.log('[resumeWorkflowRun] resumeRun succeeded'); + } catch (error) { + console.error('[resumeWorkflowRun] resumeRun failed:', error); + throw error; } - - await agentRunApi.resume({ spaceId, environmentId, runId }, { resumePayload }); } diff --git a/apps/google-docs/src/types/workflow.ts b/apps/google-docs/src/types/workflow.ts index a5730be0a2..8217a827c4 100644 --- a/apps/google-docs/src/types/workflow.ts +++ b/apps/google-docs/src/types/workflow.ts @@ -77,7 +77,7 @@ export interface CompletedWorkflowPayload { export interface TabsImagesSuspendPayload { reason?: string; - suspendStepId: 'select-tabs-images-step'; + suspendStepId: 'document-scope-selection'; documentId?: string; title?: string; requiresImageSelection?: boolean; diff --git a/apps/google-docs/src/utils/constants/agent.ts b/apps/google-docs/src/utils/constants/agent.ts index 2a1b13bfd4..c432097520 100644 --- a/apps/google-docs/src/utils/constants/agent.ts +++ b/apps/google-docs/src/utils/constants/agent.ts @@ -6,6 +6,8 @@ const MAX_POLL_TIME_MS = 5 * 60 * 1000 * 10; // 50 minutes export const MAX_POLL_ATTEMPTS = Math.floor(MAX_POLL_TIME_MS / POLL_INTERVAL_MS); -export const LOCAL_AGENTS_API_BASE_URL = 'http://localhost:4111'; - export const CONTENT_TYPE_SUBMIT_LOADING_DELAY_MS = 15000; // 15 seconds to wait for suspend payload + +export const LOCAL_AGENTS_API_BASE_URL = 'http://localhost:4111'; +// Set to true to route agent calls to the local dev server instead of the CMA +export const USE_LOCAL_AGENTS_API = false; diff --git a/apps/google-docs/test/locations/Page/components/mainpage/ModalOrchestrator.spec.tsx b/apps/google-docs/test/locations/Page/components/mainpage/ModalOrchestrator.spec.tsx index c588011209..4c342f748f 100644 --- a/apps/google-docs/test/locations/Page/components/mainpage/ModalOrchestrator.spec.tsx +++ b/apps/google-docs/test/locations/Page/components/mainpage/ModalOrchestrator.spec.tsx @@ -102,7 +102,7 @@ describe('ModalOrchestrator', () => { runId: 'run-123', messages: [], suspendPayload: { - suspendStepId: 'select-tabs-images-step', + suspendStepId: 'document-scope-selection', reason: 'Needs document scope review', documentId: 'mock-doc-id-123', requiresImageSelection: true, @@ -315,7 +315,7 @@ describe('ModalOrchestrator', () => { runId: 'run-123', messages: [], suspendPayload: { - suspendStepId: 'select-tabs-images-step', + suspendStepId: 'document-scope-selection', reason: 'Needs document scope review', documentId: 'mock-doc-id-123', requiresImageSelection: true,