diff --git a/package.json b/package.json index 5a15b205..991d2041 100644 --- a/package.json +++ b/package.json @@ -508,8 +508,8 @@ "@types/ua-parser-js": "0.7.39", "@types/vscode": "^1.95.0", "@types/ws": "^8.18.1", - "@typescript-eslint/eslint-plugin": "^8.54.0", - "@typescript-eslint/parser": "^8.54.0", + "@typescript-eslint/eslint-plugin": "^8.55.0", + "@typescript-eslint/parser": "^8.55.0", "@vitejs/plugin-react": "catalog:", "@vitest/coverage-v8": "^4.0.18", "@vscode/test-cli": "^0.0.12", @@ -517,10 +517,10 @@ "@vscode/vsce": "^3.7.1", "babel-plugin-react-compiler": "catalog:", "bufferutil": "^4.1.0", - "coder": "github:coder/coder#main", + "coder": "catalog:", "concurrently": "^9.2.1", "dayjs": "^1.11.19", - "electron": "^40.2.1", + "electron": "^40.4.0", "esbuild": "^0.27.3", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", @@ -537,7 +537,7 @@ "react": "catalog:", "react-dom": "catalog:", "typescript": "catalog:", - "typescript-eslint": "^8.54.0", + "typescript-eslint": "^8.55.0", "utf-8-validate": "^6.0.6", "vite": "catalog:", "vitest": "^4.0.18" diff --git a/packages/shared/src/tasks/types.ts b/packages/shared/src/tasks/types.ts index 95654b5f..35a5ce63 100644 --- a/packages/shared/src/tasks/types.ts +++ b/packages/shared/src/tasks/types.ts @@ -37,7 +37,7 @@ export type LogsStatus = "ok" | "not_available" | "error"; */ export interface TaskDetails extends TaskPermissions { task: Task; - logs: TaskLogEntry[]; + logs: readonly TaskLogEntry[]; logsStatus: LogsStatus; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 192caac0..8f899cda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,9 @@ catalogs: babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 + coder: + specifier: github:coder/coder#main + version: 0.0.0 react: specifier: ^19.2.4 version: 19.2.4 @@ -144,11 +147,11 @@ importers: specifier: ^8.18.1 version: 8.18.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.54.0 - version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + specifier: ^8.55.0 + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.54.0 - version: 8.54.0(eslint@9.39.2)(typescript@5.9.3) + specifier: ^8.55.0 + version: 8.55.0(eslint@9.39.2)(typescript@5.9.3) '@vitejs/plugin-react': specifier: 'catalog:' version: 5.1.4(vite@7.3.1(@types/node@20.19.33)) @@ -171,8 +174,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 coder: - specifier: github:coder/coder#main - version: https://codeload.github.com/coder/coder/tar.gz/e27c4dcd92f2b3c90c2f7877c3a436a341d020a8 + specifier: 'catalog:' + version: https://codeload.github.com/coder/coder/tar.gz/ebd7ab11cbb5ff7dc6eacfd50e6d72e49eb85afd concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -180,8 +183,8 @@ importers: specifier: ^1.11.19 version: 1.11.19 electron: - specifier: ^40.2.1 - version: 40.2.1 + specifier: ^40.4.0 + version: 40.4.0 esbuild: specifier: ^0.27.3 version: 0.27.3 @@ -193,10 +196,10 @@ importers: version: 10.1.8(eslint@9.39.2) eslint-import-resolver-typescript: specifier: ^4.4.4 - version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2) + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2) eslint-plugin-import-x: specifier: ^4.16.1 - version: 4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2) + version: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2) eslint-plugin-package-json: specifier: ^0.88.2 version: 0.88.2(@types/estree@1.0.8)(eslint@9.39.2)(jsonc-eslint-parser@2.4.2) @@ -231,8 +234,8 @@ importers: specifier: 'catalog:' version: 5.9.3 typescript-eslint: - specifier: ^8.54.0 - version: 8.54.0(eslint@9.39.2)(typescript@5.9.3) + specifier: ^8.55.0 + version: 8.55.0(eslint@9.39.2)(typescript@5.9.3) utf-8-validate: specifier: ^6.0.6 version: 6.0.6 @@ -1338,39 +1341,39 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.54.0': - resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} + '@typescript-eslint/eslint-plugin@8.55.0': + resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.54.0 + '@typescript-eslint/parser': ^8.55.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.54.0': - resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} + '@typescript-eslint/parser@8.55.0': + resolution: {integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.54.0': - resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + '@typescript-eslint/project-service@8.55.0': + resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.54.0': - resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} + '@typescript-eslint/scope-manager@8.55.0': + resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.54.0': - resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + '@typescript-eslint/tsconfig-utils@8.55.0': + resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.54.0': - resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + '@typescript-eslint/type-utils@8.55.0': + resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1380,25 +1383,25 @@ packages: resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.54.0': - resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} + '@typescript-eslint/types@8.55.0': + resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.54.0': - resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + '@typescript-eslint/typescript-estree@8.55.0': + resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.54.0': - resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} + '@typescript-eslint/utils@8.55.0': + resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.54.0': - resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + '@typescript-eslint/visitor-keys@8.55.0': + resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typespec/ts-http-runtime@0.3.0': @@ -1932,8 +1935,8 @@ packages: resolution: {integrity: sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==} engines: {node: '>=16'} - coder@https://codeload.github.com/coder/coder/tar.gz/e27c4dcd92f2b3c90c2f7877c3a436a341d020a8: - resolution: {tarball: https://codeload.github.com/coder/coder/tar.gz/e27c4dcd92f2b3c90c2f7877c3a436a341d020a8} + coder@https://codeload.github.com/coder/coder/tar.gz/ebd7ab11cbb5ff7dc6eacfd50e6d72e49eb85afd: + resolution: {tarball: https://codeload.github.com/coder/coder/tar.gz/ebd7ab11cbb5ff7dc6eacfd50e6d72e49eb85afd} version: 0.0.0 color-convert@2.0.1: @@ -2148,8 +2151,8 @@ packages: electron-to-chromium@1.5.286: resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} - electron@40.2.1: - resolution: {integrity: sha512-0zOeyN8LB1KHIjVV5jyMmQmkqx3J8OkkVlab3p7vOM28jI46blxW7M52Tcdi6X2m5o2jj8ejOlAh5+boL3w8aQ==} + electron@40.4.0: + resolution: {integrity: sha512-31l4V7Ys4oUuXyaN/cCNnyBdDXN9RwOVOG+JhiHCf4zx5tZkHd43PKGY6KLEWpeYCxaphsuGSEjagJLfPqKj8g==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4169,8 +4172,8 @@ packages: typed-rest-client@1.8.9: resolution: {integrity: sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==} - typescript-eslint@8.54.0: - resolution: {integrity: sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ==} + typescript-eslint@8.55.0: + resolution: {integrity: sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5578,14 +5581,14 @@ snapshots: '@types/node': 20.19.33 optional: true - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.55.0 eslint: 9.39.2 ignore: 7.0.5 natural-compare: 1.4.0 @@ -5594,41 +5597,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/parser@8.55.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.55.0 debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.54.0': + '@typescript-eslint/scope-manager@8.55.0': dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 - '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.55.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.2 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -5638,14 +5641,14 @@ snapshots: '@typescript-eslint/types@8.52.0': {} - '@typescript-eslint/types@8.54.0': {} + '@typescript-eslint/types@8.55.0': {} - '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 9.0.5 semver: 7.7.3 @@ -5655,20 +5658,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/utils@8.55.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.54.0': + '@typescript-eslint/visitor-keys@8.55.0': dependencies: - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/types': 8.55.0 eslint-visitor-keys: 4.2.1 '@typespec/ts-http-runtime@0.3.0': @@ -6289,7 +6292,7 @@ snapshots: cockatiel@3.2.1: {} - coder@https://codeload.github.com/coder/coder/tar.gz/e27c4dcd92f2b3c90c2f7877c3a436a341d020a8: {} + coder@https://codeload.github.com/coder/coder/tar.gz/ebd7ab11cbb5ff7dc6eacfd50e6d72e49eb85afd: {} color-convert@2.0.1: dependencies: @@ -6499,7 +6502,7 @@ snapshots: electron-to-chromium@1.5.286: {} - electron@40.2.1: + electron@40.4.0: dependencies: '@electron/get': 2.0.3 '@types/node': 24.10.12 @@ -6701,7 +6704,7 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 - eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2): dependencies: debug: 4.4.3(supports-color@8.1.1) eslint: 9.39.2 @@ -6712,11 +6715,11 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2) transitivePeerDependencies: - supports-color - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2): dependencies: '@typescript-eslint/types': 8.52.0 comment-parser: 1.4.1 @@ -6729,7 +6732,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) transitivePeerDependencies: - supports-color @@ -9058,12 +9061,12 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.6 - typescript-eslint@8.54.0(eslint@9.39.2)(typescript@5.9.3): + typescript-eslint@8.55.0(eslint@9.39.2)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2)(typescript@5.9.3) eslint: 9.39.2 typescript: 5.9.3 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9691969f..ff3c5fd7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,30 +1,28 @@ packages: - packages/* -# Shared dependency versions (use "catalog:" in package.json to reference) catalog: "@tanstack/react-query": ^5.90.21 "@types/react": ^19.2.14 "@types/react-dom": ^19.2.3 + "@types/vscode-webview": ^1.57.5 "@vitejs/plugin-react": ^5.1.4 "@vscode-elements/react-elements": ^2.4.0 - "@types/vscode-webview": ^1.57.5 "@vscode/codicons": ^0.0.44 babel-plugin-react-compiler: ^1.0.0 + coder: github:coder/coder#main react: ^19.2.4 react-dom: ^19.2.4 typescript: ^5.9.3 vite: ^7.3.1 -# Enforce all shared deps come from catalog to prevent version drift catalogMode: strict -# Native modules allowed to run install scripts (pnpm blocks by default for security) onlyBuiltDependencies: - - "@vscode/vsce-sign" # vsce signing - - bufferutil # ws perf - - electron # tests - - esbuild # build - - keytar # vsce credentials - - unrs-resolver # eslint resolver - - utf-8-validate # ws validation + - "@vscode/vsce-sign" + - bufferutil + - electron + - esbuild + - keytar + - unrs-resolver + - utf-8-validate diff --git a/src/api/coderApi.ts b/src/api/coderApi.ts index 0ec05522..70a0c5cc 100644 --- a/src/api/coderApi.ts +++ b/src/api/coderApi.ts @@ -10,7 +10,6 @@ import { type ServerSentEvent, type GetInboxNotificationResponse, type ProvisionerJobLog, - type TaskLogEntry, type Workspace, type WorkspaceAgent, type WorkspaceAgentLog, @@ -193,13 +192,6 @@ export class CoderApi extends Api implements vscode.Disposable { }); } - getTaskLogs = async (user: string, taskId: string) => { - const response = await this.getAxiosInstance().get<{ - logs: TaskLogEntry[]; - }>(`/api/v2/tasks/${user}/${taskId}/logs`); - return response.data.logs ?? []; - }; - watchInboxNotifications = async ( watchTemplates: string[], watchTargets: string[], diff --git a/src/webviews/tasks/tasksPanel.ts b/src/webviews/tasks/tasksPanel.ts index 09803fa8..662df636 100644 --- a/src/webviews/tasks/tasksPanel.ts +++ b/src/webviews/tasks/tasksPanel.ts @@ -87,7 +87,7 @@ export class TasksPanel // Cache logs for last viewed task in stable state private cachedLogs?: { taskId: string; - logs: TaskLogEntry[]; + logs: readonly TaskLogEntry[]; status: LogsStatus; }; @@ -503,7 +503,7 @@ export class TasksPanel */ private async getLogsWithCache( task: Task, - ): Promise<{ logs: TaskLogEntry[]; logsStatus: LogsStatus }> { + ): Promise<{ logs: readonly TaskLogEntry[]; logsStatus: LogsStatus }> { const stable = isStableTask(task); // Use cache if same task in stable state @@ -523,10 +523,10 @@ export class TasksPanel private async fetchTaskLogs( taskId: string, - ): Promise<{ logs: TaskLogEntry[]; status: LogsStatus }> { + ): Promise<{ logs: readonly TaskLogEntry[]; status: LogsStatus }> { try { - const logs = await this.client.getTaskLogs("me", taskId); - return { logs, status: "ok" }; + const response = await this.client.getTaskLogs("me", taskId); + return { logs: response.logs, status: "ok" }; } catch (err) { if ( isAxiosError(err) && diff --git a/test/unit/webviews/tasks/tasksPanel.test.ts b/test/unit/webviews/tasks/tasksPanel.test.ts index c7cd9534..cc9928e4 100644 --- a/test/unit/webviews/tasks/tasksPanel.test.ts +++ b/test/unit/webviews/tasks/tasksPanel.test.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi, type Mock } from "vitest"; import * as vscode from "vscode"; import { TasksPanel } from "@/webviews/tasks/tasksPanel"; @@ -31,13 +31,13 @@ type TasksPanelClient = Pick< | "getHost" >; -type MockClient = { [K in keyof TasksPanelClient]: ReturnType }; +type MockClient = { [K in keyof TasksPanelClient]: Mock }; function createClient(baseUrl = "https://coder.example.com"): MockClient { return { getTasks: vi.fn().mockResolvedValue([]), getTask: vi.fn(), - getTaskLogs: vi.fn().mockResolvedValue([]), + getTaskLogs: vi.fn().mockResolvedValue({ logs: [] }), createTask: vi.fn(), deleteTask: vi.fn().mockResolvedValue(undefined), getTemplates: vi.fn().mockResolvedValue([]), @@ -45,7 +45,7 @@ function createClient(baseUrl = "https://coder.example.com"): MockClient { startWorkspace: vi.fn().mockResolvedValue(undefined), stopWorkspace: vi.fn().mockResolvedValue(undefined), getHost: vi.fn().mockReturnValue(baseUrl), - }; + } as MockClient; } interface ApiDef { @@ -247,9 +247,9 @@ describe("TasksPanel", () => { it("returns task with logs", async () => { const h = createHarness(); h.client.getTask.mockResolvedValue(task()); - h.client.getTaskLogs.mockResolvedValue([ - logEntry({ content: "Starting" }), - ]); + h.client.getTaskLogs.mockResolvedValue({ + logs: [logEntry({ content: "Starting" })], + }); const res = await h.request(TasksApi.getTaskDetails, { taskId: "task-1", @@ -306,7 +306,7 @@ describe("TasksPanel", () => { h.client.getTask.mockResolvedValue( task({ current_state: { timestamp: "", state, message: "", uri: "" } }), ); - h.client.getTaskLogs.mockResolvedValue([logEntry()]); + h.client.getTaskLogs.mockResolvedValue({ logs: [logEntry()] }); await h.request(TasksApi.getTaskDetails, { taskId: "task-1" }); await h.request(TasksApi.getTaskDetails, { taskId: "task-1" }); @@ -475,7 +475,7 @@ describe("TasksPanel", () => { describe("downloadLogs", () => { it("saves logs to file", async () => { const h = createHarness(); - h.client.getTaskLogs.mockResolvedValue([logEntry()]); + h.client.getTaskLogs.mockResolvedValue({ logs: [logEntry()] }); const saveUri = vscode.Uri.file("/downloads/logs.txt"); vi.mocked(vscode.window.showSaveDialog).mockResolvedValue(saveUri); h.ui.setResponse(`Logs saved to ${saveUri.fsPath}`, "Open File"); @@ -494,7 +494,7 @@ describe("TasksPanel", () => { it("does not open file when notification is dismissed", async () => { const h = createHarness(); - h.client.getTaskLogs.mockResolvedValue([logEntry()]); + h.client.getTaskLogs.mockResolvedValue({ logs: [logEntry()] }); const saveUri = vscode.Uri.file("/downloads/logs.txt"); vi.mocked(vscode.window.showSaveDialog).mockResolvedValue(saveUri); h.ui.setResponse(`Logs saved to ${saveUri.fsPath}`, undefined); @@ -513,7 +513,7 @@ describe("TasksPanel", () => { it("shows warning when no logs", async () => { const h = createHarness(); - h.client.getTaskLogs.mockResolvedValue([]); + h.client.getTaskLogs.mockResolvedValue({ logs: [] }); const res = await h.request(TasksApi.downloadLogs, { taskId: "task-1", @@ -545,7 +545,7 @@ describe("TasksPanel", () => { it("does nothing when user cancels", async () => { const h = createHarness(); - h.client.getTaskLogs.mockResolvedValue([logEntry()]); + h.client.getTaskLogs.mockResolvedValue({ logs: [logEntry()] }); vi.mocked(vscode.window.showSaveDialog).mockResolvedValue(undefined); const res = await h.request(TasksApi.downloadLogs, {