From 70ff9c7a6951c9558bc91a2ab25de886ec0c3fae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:37:35 -0500 Subject: [PATCH 1/3] fix(portal): update module to download executable device agent file for windows (#1766) Co-authored-by: chasprowebdev Co-authored-by: Mariano Fuentes --- .../tasks/DeviceAgentAccordionItem.tsx | 38 +++------ .../src/app/api/download-agent/route.ts | 81 +++---------------- 2 files changed, 20 insertions(+), 99 deletions(-) diff --git a/apps/portal/src/app/(app)/(home)/[orgId]/components/tasks/DeviceAgentAccordionItem.tsx b/apps/portal/src/app/(app)/(home)/[orgId]/components/tasks/DeviceAgentAccordionItem.tsx index b5d80258e..458835282 100644 --- a/apps/portal/src/app/(app)/(home)/[orgId]/components/tasks/DeviceAgentAccordionItem.tsx +++ b/apps/portal/src/app/(app)/(home)/[orgId]/components/tasks/DeviceAgentAccordionItem.tsx @@ -9,7 +9,6 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@comp/ui/tooltip'; import type { Member } from '@db'; import { CheckCircle2, Circle, Download, HelpCircle, Loader2, XCircle } from 'lucide-react'; -import Image from 'next/image'; import { useEffect, useMemo, useState } from 'react'; import { toast } from 'sonner'; import type { FleetPolicy, Host } from '../../types'; @@ -43,7 +42,10 @@ export function DeviceAgentAccordionItem({ const hasInstalledAgent = host !== null; const failedPoliciesCount = useMemo(() => { - return fleetPolicies.filter((policy) => policy.response !== 'pass').length + (!isMacOS || mdmEnabledStatus.response === 'pass' ? 0 : 1); + return ( + fleetPolicies.filter((policy) => policy.response !== 'pass').length + + (!isMacOS || mdmEnabledStatus.response === 'pass' ? 0 : 1) + ); }, [fleetPolicies, mdmEnabledStatus, isMacOS]); const isCompleted = hasInstalledAgent && failedPoliciesCount === 0; @@ -84,7 +86,7 @@ export function DeviceAgentAccordionItem({ ? 'Comp AI Agent-1.0.0-arm64.dmg' : 'Comp AI Agent-1.0.0-intel.dmg'; } else { - a.download = 'compai-device-agent.zip'; + a.download = 'Comp AI Agent 1.0.0.exe'; } document.body.appendChild(a); @@ -189,35 +191,13 @@ export function DeviceAgentAccordionItem({ - {!isMacOS && ( -
  • - Run the "Install Me First" file -

    - After extracting the downloaded zip file, locate and run the "Install Me - First" file to prepare your system. -

    -
  • - )}
  • - - {isMacOS - ? 'Install the Comp AI Device Agent' - : 'Run the Comp AI Device Agent installer'} - + Install the Comp AI Device Agent

    {isMacOS ? 'Double-click the downloaded DMG file and follow the installation instructions.' - : 'Follow the installation wizard steps. When you reach the introduction screen (as shown below), click "Continue" to proceed through the installation.'} + : 'Double-click the downloaded EXE file and follow the installation instructions.'}

    - {!isMacOS && ( - Fleet osquery installer introduction screen - )}
  • {isMacOS ? (
  • @@ -283,7 +263,9 @@ export function DeviceAgentAccordionItem({
    diff --git a/apps/portal/src/app/api/download-agent/route.ts b/apps/portal/src/app/api/download-agent/route.ts index e342f1713..6e8ddaa61 100644 --- a/apps/portal/src/app/api/download-agent/route.ts +++ b/apps/portal/src/app/api/download-agent/route.ts @@ -2,16 +2,8 @@ import { logger } from '@/utils/logger'; import { s3Client } from '@/utils/s3'; import { GetObjectCommand } from '@aws-sdk/client-s3'; import { client as kv } from '@comp/kv'; -import archiver from 'archiver'; import { type NextRequest, NextResponse } from 'next/server'; -import { PassThrough, Readable } from 'stream'; -import { - generateWindowsScript, - getPackageFilename, - getReadmeContent, - getScriptFilename, -} from './scripts'; -import type { SupportedOS } from './types'; +import { Readable } from 'stream'; export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; @@ -41,15 +33,7 @@ export async function GET(req: NextRequest) { // Delete token after retrieval (one-time use) await kv.del(`download:${token}`); - const { orgId, employeeId } = downloadInfo as { - orgId: string; - employeeId: string; - userId: string; - }; - // Hardcoded device marker paths used by the setup scripts - const fleetDevicePathMac = '/Users/Shared/.fleet'; - const fleetDevicePathWindows = 'C:\\ProgramData\\CompAI\\Fleet'; const fleetBucketName = process.env.FLEET_AGENT_BUCKET_NAME; if (!fleetBucketName) { @@ -94,44 +78,9 @@ export async function GET(req: NextRequest) { } } - // Windows flow: Generate script and create zip - const fleetDevicePath = fleetDevicePathWindows; - const script = generateWindowsScript({ orgId, employeeId, fleetDevicePath }); - + // Windows flow: Generate script and create zip const fleetDevicePath = fleetDevicePathWindows; try { - // Create a passthrough stream for the response - const passThrough = new PassThrough(); - const archive = archiver('zip', { zlib: { level: 9 } }); - - // Pipe archive to passthrough - archive.pipe(passThrough); - - // Robust error handling for staging/prod reliability - archive.on('error', (err) => { - logger('archiver_error', { message: err?.message, stack: (err as Error)?.stack }); - passThrough.destroy(err as Error); - }); - archive.on('warning', (warn) => { - logger('archiver_warning', { message: (warn as Error)?.message }); - }); - passThrough.on('error', (err) => { - logger('download_stream_error', { - message: (err as Error)?.message, - stack: (err as Error)?.stack, - }); - }); - - // Add script file - const scriptFilename = getScriptFilename(os as SupportedOS); - archive.append(script, { name: scriptFilename, mode: 0o755 }); - - // Add README - const readmeContent = getReadmeContent(os as SupportedOS); - archive.append(readmeContent, { name: 'README.txt' }); - - // Get package from S3 and stream it - const packageFilename = getPackageFilename(os as SupportedOS); - const windowsPackageFilename = 'fleet-osquery.msi'; + const windowsPackageFilename = 'Comp AI Agent 1.0.0.exe'; const packageKey = `windows/${windowsPackageFilename}`; const getObjectCommand = new GetObjectCommand({ @@ -141,29 +90,19 @@ export async function GET(req: NextRequest) { const s3Response = await s3Client.send(getObjectCommand); - if (s3Response.Body) { - const s3Stream = s3Response.Body as Readable; - s3Stream.on('error', (err) => { - logger('s3_stream_error', { - message: (err as Error)?.message, - stack: (err as Error)?.stack, - }); - passThrough.destroy(err as Error); - }); - archive.append(s3Stream, { name: packageFilename, store: true }); + if (!s3Response.Body) { + return new NextResponse('Executable file not found', { status: 404 }); } - // Finalize the archive - archive.finalize(); - - // Convert Node.js stream to Web Stream for NextResponse - const webStream = Readable.toWeb(passThrough) as unknown as ReadableStream; + // Convert S3 stream to Web Stream for NextResponse + const s3Stream = s3Response.Body as Readable; + const webStream = Readable.toWeb(s3Stream) as unknown as ReadableStream; // Return streaming response with headers that trigger browser download return new NextResponse(webStream, { headers: { - 'Content-Type': 'application/zip', - 'Content-Disposition': `attachment; filename="compai-device-agent-${os}.zip"`, + 'Content-Type': 'application/octet-stream', + 'Content-Disposition': `attachment; filename="${windowsPackageFilename}"`, 'Cache-Control': 'no-cache, no-store, must-revalidate', 'X-Accel-Buffering': 'no', }, From 22fb0eb434250333ff7758d393f8d24bf13a0168 Mon Sep 17 00:00:00 2001 From: Min Chun Fu <70210356+Itsnotaka@users.noreply.github.com> Date: Wed, 19 Nov 2025 01:53:55 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix(api):=20update=20buildspec=20and=20Dock?= =?UTF-8?q?erfile=20to=20prepare=20workspace=20packag=E2=80=A6=20(#1775)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(api): update buildspec and Dockerfile to prepare workspace packages for Docker * chore: deslop * revert(api): update buildspec and Dockerfile to streamline Docker build process --- apps/api/Dockerfile | 7 ++----- apps/api/buildspec.yml | 34 +++++++++------------------------- bun.lock | 25 ++++--------------------- 3 files changed, 15 insertions(+), 51 deletions(-) diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile index daee02db9..1f0c0454f 100644 --- a/apps/api/Dockerfile +++ b/apps/api/Dockerfile @@ -15,15 +15,12 @@ RUN curl -fsSL https://bun.sh/install | bash \ && export PATH="/root/.bun/bin:$PATH" \ && bun install --production --ignore-scripts || true -# Copy pre-built workspace packages (must be before copying app contents) COPY node_modules/@trycompai ./node_modules/@trycompai +COPY node_modules/@prisma ./node_modules/@prisma +COPY node_modules/.prisma ./node_modules/.prisma -# Now copy the pre-built app contents (dist/, prisma/, etc.) COPY . . -# Generate Prisma client inside the image (ensures runtime client matches installed deps) -RUN npx prisma generate - # Set environment variables ENV NODE_ENV=production ENV PORT=3333 diff --git a/apps/api/buildspec.yml b/apps/api/buildspec.yml index bc6eeb720..e437147f9 100644 --- a/apps/api/buildspec.yml +++ b/apps/api/buildspec.yml @@ -32,67 +32,51 @@ phases: - echo "Installing API dependencies only..." - bun install --filter=@comp/api --frozen-lockfile || bun install --filter=@comp/api --ignore-scripts || bun install --ignore-scripts - # Build email package (required dependency for API) - echo "Building @trycompai/email package..." - cd packages/email - bun run build - cd ../.. - # Build NestJS application (prebuild automatically handles Prisma) - echo "Building NestJS application..." - echo "APP_NAME is set to $APP_NAME" - echo "Current directory $(pwd)" - echo "Available apps $(ls -la apps/)" - cd apps/api - echo "Changed to $(pwd)" - - echo "Running build (includes automatic prebuild db:generate)..." - bun run build - # Verify build output exists - echo "Checking build output..." - ls -la dist/ - ls -la dist/src/ - '[ -f "dist/src/main.js" ] || { echo "❌ main.js not found in dist/src"; exit 1; }' - # Create self-contained bundle for Docker (stay in apps/api) - - echo "Creating self-contained bundle..." - mkdir -p ../docker-build - - # Copy built application (preserves NestJS structure) - - echo "Copying built application..." - cp -r dist/* ../docker-build/ - - # Copy prisma folder (needed for runtime imports) - - echo "Copying prisma folder..." - cp -r prisma ../docker-build/ - # Verify files were copied correctly - echo "Verifying copied files..." - ls -la ../docker-build/ - ls -la ../docker-build/src/ - '[ -f "../docker-build/src/main.js" ] || { echo "❌ main.js not found in docker-build/src"; exit 1; }' - # Copy entire node_modules for runtime (includes @trycompai/db from npm) - - echo "Skipping host node_modules copy; Dockerfile installs prod deps inside image" - - # Copy built workspace packages (needed for runtime) - # Only copy packages that are actually imported at runtime - # Email package is already bundled, so only need its dist - - echo "Copying built workspace packages..." - mkdir -p ../docker-build/node_modules/@trycompai - # Email package - copy dist and package.json (needed at runtime) - mkdir -p ../docker-build/node_modules/@trycompai/email - cp -r ../../packages/email/dist ../docker-build/node_modules/@trycompai/email/ - cp ../../packages/email/package.json ../docker-build/node_modules/@trycompai/email/ + - mkdir -p ../docker-build/node_modules/@trycompai/ui + - cp -r ../../packages/ui/dist ../docker-build/node_modules/@trycompai/ui/ + - cp ../../packages/ui/package.json ../docker-build/node_modules/@trycompai/ui/ + - mkdir -p ../docker-build/node_modules/@trycompai/utils + - cp -r ../../packages/utils/src ../docker-build/node_modules/@trycompai/utils/ + - cp ../../packages/utils/package.json ../docker-build/node_modules/@trycompai/utils/ + + - cp -r ../../node_modules/@prisma ../docker-build/node_modules/@prisma + - cp -r ../../node_modules/.prisma ../docker-build/node_modules/.prisma - # Copy Dockerfile - - echo "Copying Dockerfile..." - cp Dockerfile ../docker-build/ - - echo "Copying package manifests for image install..." - cp package.json ../docker-build/ - cp ../../bun.lock ../docker-build/ || true - # Build Docker image - echo "Building Docker image..." - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t $ECR_REPOSITORY_URI:$IMAGE_TAG ../docker-build/ - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest diff --git a/bun.lock b/bun.lock index 60db05b40..68ac8e758 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "comp", @@ -1079,7 +1080,7 @@ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], "@jsonhero/path": ["@jsonhero/path@1.0.21", "", {}, "sha512-gVUDj/92acpVoJwsVJ/RuWOaHyG4oFzn898WNGQItLCTQ+hOaVlEaImhwE1WqOTf+l3dGOUkbSiVKlb3q1hd1Q=="], @@ -5349,8 +5350,6 @@ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -5383,6 +5382,8 @@ "@comp/app/resend": ["resend@4.8.0", "", { "dependencies": { "@react-email/render": "1.1.2" } }, "sha512-R8eBOFQDO6dzRTDmaMEdpqrkmgSjPpVXt4nGfWsZdYOet0kqra0xgbvTES6HmCriZEXbmGk3e0DiGIaLFTFSHA=="], + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "@discordjs/rest/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="], "@discordjs/rest/undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="], @@ -5421,28 +5422,16 @@ "@jest/core/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "@jest/reporters/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@jest/reporters/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "@jest/reporters/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], "@jest/reporters/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "@jest/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@jest/test-sequencer/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "@jest/transform/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@jest/transform/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - - "@jridgewell/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - - "@jridgewell/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@nangohq/types/type-fest": ["type-fest@4.32.0", "", {}, "sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw=="], "@nestjs/cli/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], @@ -5835,8 +5824,6 @@ "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "istanbul-lib-source-maps/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "its-fine/@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="], "jest-changed-files/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], @@ -6431,8 +6418,6 @@ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "terser-webpack-plugin/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "terser-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], "test-exclude/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -6457,8 +6442,6 @@ "uploadthing/effect": ["effect@3.17.7", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-dpt0ONUn3zzAuul6k4nC/coTTw27AL5nhkORXgTi6NfMPzqWYa1M05oKmOMTxpVSTKepqXVcW9vIwkuaaqx9zA=="], - "v8-to-istanbul/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], From dbc3d0b90298e09ce47939846d338081a0824e6b Mon Sep 17 00:00:00 2001 From: Min Chun Fu <70210356+Itsnotaka@users.noreply.github.com> Date: Wed, 19 Nov 2025 02:04:38 +0900 Subject: [PATCH 3/3] chore(api): remove UI package copying from buildspec (#1776) --- apps/api/buildspec.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/api/buildspec.yml b/apps/api/buildspec.yml index e437147f9..88c2bb282 100644 --- a/apps/api/buildspec.yml +++ b/apps/api/buildspec.yml @@ -63,9 +63,6 @@ phases: - mkdir -p ../docker-build/node_modules/@trycompai/email - cp -r ../../packages/email/dist ../docker-build/node_modules/@trycompai/email/ - cp ../../packages/email/package.json ../docker-build/node_modules/@trycompai/email/ - - mkdir -p ../docker-build/node_modules/@trycompai/ui - - cp -r ../../packages/ui/dist ../docker-build/node_modules/@trycompai/ui/ - - cp ../../packages/ui/package.json ../docker-build/node_modules/@trycompai/ui/ - mkdir -p ../docker-build/node_modules/@trycompai/utils - cp -r ../../packages/utils/src ../docker-build/node_modules/@trycompai/utils/ - cp ../../packages/utils/package.json ../docker-build/node_modules/@trycompai/utils/