Commit Graph
4045 Commits
Author SHA1 Message Date
Kacper Sawicki 6ca70d3618 feat(cli): add --no-build flag to state push for state-only updates (#21374)
## Summary

Adds a `--no-build` flag to `coder state push` that updates the
Terraform state directly without triggering a workspace build.

## Use Case

This enables state-only migrations, such as migrating Kubernetes
resources from deprecated types (e.g., `kubernetes_config_map`) to
versioned types (e.g., `kubernetes_config_map_v1`):

```bash
coder state pull my-workspace > state.json
terraform init
terraform state rm -state=state.json kubernetes_config_map.example
terraform import -state=state.json kubernetes_config_map_v1.example default/example
coder state push --no-build my-workspace state.json
```

## Changes

- Add `PUT /api/v2/workspacebuilds/{id}/state` endpoint to update state
without triggering a build
- Add `UpdateWorkspaceBuildState` SDK method
- Add `--no-build`/`-n` flag to `coder state push`
- Add confirmation prompt (can be skipped with `--yes`/`-y`) since this
is a potentially dangerous operation
- Add test for `--no-build` functionality

Fixes #21336
2026-01-12 15:16:59 +01:00
Ehab Younes a581431bc8 fix(site): show apps with disabled health status on workspaces list (#21428)
- Fix to display apps with disabled health status on workspaces list
- Migrate WorkspacesPage jest test into vitest
- Modularize vitest setup into separate files:
  - setup/polyfills.ts: Blob, ResizeObserver polyfills
  - setup/domStubs.ts: Radix UI pointer capture stubs
  - setup/mocks.ts: useProxyLatency mock
  - setup/msw.ts: MSW server lifecycle

Fixed #20319
2026-01-12 13:37:30 +03:00
Steven Masley d2044c2ee9 chore: update protobuf to reuse file request (#21447)
**This is just the protobuf changes for the PR https://github.com/coder/coder/pull/21398**

Moved `UploadFileRequest` from `provisionerd.proto` -> `provisioner.proto`.

Renamed to `FileUpload` because it is now bi-directional.

This **is backwards compatible**. I tested it to confirm the payloads are identical.  Types were just renamed and moved around.

```golang
func TestTypeUpgrade(t *testing.T) {
	t.Parallel()

	x := &proto2.UploadFileRequest{
		Type: &proto2.UploadFileRequest_ChunkPiece{
			ChunkPiece: &proto.ChunkPiece{
				Data:         []byte("Hello World!"),
				FullDataHash: []byte("Foobar"),
				PieceIndex:   42,
			},
		},
	}

	data, err := protobuf.Marshal(x)
	require.NoError(t, err)

	// Exactly the same output
	// EhgKDEhlbGxvIFdvcmxkIRIGRm9vYmFyGCo= on `main`
	// EhgKDEhlbGxvIFdvcmxkIRIGRm9vYmFyGCo= on this branch
	fmt.Println(base64.StdEncoding.EncodeToString(data))
}
```


# What this does

This allows provisioner daemons to download files from `coderd`'s `files` table. This is used to send over cached module files and prevent the need of downloading these modules on each workspace build.
2026-01-09 11:23:32 -06:00
Steven Masley 89f4d60e7b chore: remove experiment "terraform-directory-reuse" (#21397)
Experiment is no longer required, the new method will be released without an experiment and without a toggle

Main PR is: https://github.com/coder/coder/pull/21398
2026-01-09 11:13:16 -06:00
Spike Curtis bddb808b25 chore: arrange imports in a standard way (#21452)
Fixes all our Go file imports to match the preferred spec that we've _mostly_ been using. For example:

```
import (
	"context"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"golang.org/x/xerrors"
	"gopkg.in/natefinch/lumberjack.v2"

	"cdr.dev/slog/v3"
	"github.com/coder/coder/v2/codersdk/agentsdk"
	"github.com/coder/serpent"
)
```

3 groups: standard library, 3rd partly libs, Coder libs.

This PR makes the change across the codebase. The PR in the stack above modifies our formatting to maintain this state of affairs, and is a separate PR so it's possible to review that one in detail.
2026-01-08 15:24:11 +04:00
b20d1bf159 fix: use square icon for stop button instead of pause icon (#21386)
The pause icon (`||`) for the Stop button was confusing as it suggests
pause/resume functionality. Changed to a square icon (`□`) which is the
standard icon for stop in media players and interfaces.

### Before
<img width="100" alt="before"
src="https://github.com/user-attachments/assets/77e2fee5-cb66-4b47-9a2a-0dccce5c28ca"
/>

### After
The button will now display a square (⬛) stop icon instead of the pause
(⏸) icon.

---------

Co-authored-by: blink-so[bot] <211532188+blink-so[bot]@users.noreply.github.com>
Co-authored-by: Jaayden Halko <jaayden@coder.com>
2026-01-08 05:41:08 -05:00
Spike Curtis 49b34a716a fix: fix slog to always use array of Fields (#21426)
Upgrades to slog v3 which includes a small, but backward incompatible API change to the acceptible call arguments when logging. This change allows us to verify via compile time type checking that arguments are correct and won't cause a panic, as was possible in slog v1, which this replaces (v2 was tagged but never used in coder/coder).

It also updates dependencies that also use slog and were updated.

I've left the `aibridge` dependency as a commit SHA, under the assumption that the team there (cc @pawbana @dannykopping ) will tag and update the dependency soon and on their own schedule.

Other dependencies, I pushed new tags.
2026-01-08 10:29:41 +04:00
Jake Howell d1b0722034 feat: standardise sizes of ./site/static/icon/*.svg (#21347)
Related to #21320

This pull-request ensures that all the icons are now `256px * 256px` so
that they're standardised across all rendering situations.

| Previous | Now |
| --- | --- |
| <img width="886" height="1652" alt="CleanShot 2025-12-21 at 12 25
03@2x"
src="https://github.com/user-attachments/assets/c298325c-4419-485b-97e2-bb54e6ccc8c0"
/> | <img width="962" height="980" alt="CleanShot 2025-12-21 at 12 26
35@2x"
src="https://github.com/user-attachments/assets/c9cef5ee-115d-4318-8e12-188ea79cc88b"
/> |

* All `*.svg` files are now `256px * 256px` and..
  * Added a `do.svg` file.
  * Added a `ruby.svg` file.
  * Added a `gcp.svg` file.
* All `*.png` files are now `256px * 256px` and..
  * Updated the `aws.png` file to match `aws.svg` (deprecated).
  * Updated the `azure.png` file to match `azure.svg` (deprecated).
  * Updated the `docker.png` file to match `docker.svg` (deprecated).
  * Updated the `do.png` file to fill the full `256px` width.
  * Deprecated the `do.png`.
  * Deprecated the `ruby.png`.
  * Deprecated the `gcp.png`.
2026-01-08 13:39:31 +11:00
Jake Howell 1a9a1106ca feat: implement customised formatDate() function (#21423)
Closes #21301

This pull-request adds a very simple `function formatDate(date: Date,
options: Intl.DateTimeFormatOptions)` function which will allow us to
standardise the rendering of dates across the application. This is
inline with the content of #21252.
2026-01-08 10:52:23 +11:00
Atif Ali 17ba151ed2 chore(site): update mux icon (#21450) 2026-01-08 00:13:20 +05:00
Jake Howell c3e3249a2a fix: manually override pagination sizes (#21424)
Closes #21260

Pagination buttons could overflow their container on narrower pages
(e.g. audit / logs) because the page button was effectively fixed-width.
This updates the pagination button styling to allow it to expand with
its content (`min-w-8 w-auto`), preventing overflow while keeping the
same icon-button look.

| Previously | Now |
| --- | --- | 
| <img width="451" height="118" alt="pagination-old-treatment"
src="https://github.com/user-attachments/assets/ae77e604-89fb-4dc3-9233-d103494e1906"
/> | <img width="451" height="118" alt="pagination-new-treatment"
src="https://github.com/user-attachments/assets/5a948d8a-4643-4eff-95b9-4c2852850447"
/> |
2026-01-06 23:46:04 +00:00
Danielle Maywood fa561bcd0a feat(site): support deleting dev containers (#21249)
Closes https://github.com/coder/coder/issues/19062

Add logic to the frontend to allow deleting Dev Containers
2026-01-06 22:49:17 +00:00
Asher 4a97df3768 chore: rename flag to disable template insights (#21329)
Because this affects more than just the template insights
page (specifically it also affects the deployment stats endpoint which
is shown on bottom bar and Prometheus), the group is being renamed
generically to just "stats collection".  In the future if we need to
affect the other stats we can put those options here.

Then, because this change only affects a portion of stats, specifically
usage stats like connection and application time, bytes sent, etc, add a
new sub-group called "usage stats".

Then finally add back the "enable" flag.  This also gives us a place to
one day place an "anonymize" flag if we need to go that route.
2026-01-05 11:44:06 -09:00
ケイラ 5691d38db7 chore: migrate tar tests to vitest (#21406) 2026-01-05 13:18:04 -07:00
Jake Howell f524e00df7 feat: implement DEPRECATED_ICONS (#21346)
Closes #21320

This PR introduces a list of deprecated icons that should no longer be displayed in the UI. These icons are kept for backward compatibility but are now filtered out from:

1. The emoji picker component
2. The icons page listing

The deprecated icons include:
- Duplicate icons that have better alternatives (e.g., `apple-grey.svg` → `apple-black.svg`)
- PNG versions of icons that already have SVG versions (e.g., `aws.png` → `aws.svg`)
- Monochrome variants that are no longer needed (e.g., `docker-white.svg`)
2026-01-05 11:20:23 +11:00
William Burton 21241abc4e chore: add airflow icon (#21401) 2025-12-31 14:00:31 +00:00
Danny Kopping a173c38715 chore: remove experimental endpoints (#21390)
This should've been removed when we cut the Beta release, but we missed it. Adding as a drive-by.
2025-12-29 16:17:46 +00:00
Susana Ferreira b97572285a feat: add core AI MITM proxy daemon (#21296)
## Description

Adds the core AI Bridge MITM proxy daemon. This proxy intercepts HTTPS traffic, decrypts it using a configured CA certificate, and forwards requests to AIBridge for processing.

## Changes

* Added `aibridgeproxyd` package with the core proxy server implementation
* Added configuration options: `CODER_AIBRIDGE_PROXY_ENABLED`, `CODER_AIBRIDGE_PROXY_LISTEN_ADDR`, `CODER_AIBRIDGE_PROXY_CERT_FILE`, `CODER_AIBRIDGE_PROXY_KEY_FILE`
* Added tests for server initialization and MITM functionality

Closes https://github.com/coder/internal/issues/1180
2025-12-29 15:31:51 +00:00
Jake Howell df6b316772 feat: extend biome.jsonc with "useConsistentCurlyBraces": "error" (#21379) 2025-12-24 12:08:13 +11:00
Marcin Tojek 923c04e3e3 fix(site): add defensive access to entitlement features (#21381)
Fixes #14784
2025-12-23 16:00:36 +01:00
Steven Masley 61d7d2983f fix: remove state information from apply (#21373)
Delete builds were not deleting resources as the tf state being sent in the apply request was empty.
State removed from apply request and read from the session instead.
2025-12-22 16:18:53 +00:00
5448a2645d feat: migrate Alert component from MUI to shadcn and update to new Alert designs (#18412)
--- Although originally created with Blink most of the PR has been
re-written since then

## Summary

This PR migrates the Alert component from MUI to shadcn implementation
while maintaining full backward compatibility with the existing API.
Updates Alerts to new design in Figma.

Figma design:
https://www.figma.com/design/WfqIgsTFXN2BscBSSyXWF8/Coder-kit?node-id=3522-3005&m=dev

<img width="1008" height="623" alt="Screenshot 2025-12-18 at 20 37 32"
src="https://github.com/user-attachments/assets/8b2077f1-f746-4a9a-8b58-3ec3477c247b"
/>

---------

Co-authored-by: blink-so[bot] <211532188+blink-so[bot]@users.noreply.github.com>
Co-authored-by: jaaydenh <1858163+jaaydenh@users.noreply.github.com>
Co-authored-by: Jaayden Halko <jaayden@coder.com>
2025-12-22 11:52:40 +00:00
Danielle Maywood 44a46db487 feat(agent): support deleting dev containers (#21247)
Add logic to the agent, and an endpoint, to allow requesting and then deleting a Dev Container and its related agent.
2025-12-22 11:28:31 +00:00
Jaayden Halko 59959e0add fix: use correct error color (#21355)
fix styling to use destructive instead of danger
2025-12-22 09:58:58 +00:00
Cian Johnston 1de952b556 fix(site): allow updating workspace in TaskPage (#21316)
Relates to #20925 

This PR modifies TaskPage to update an outdated workspace instead of
starting it. Before, starting an outdated workspace where the template
required the active version would fail with the error "cannot use
non-active version: rbac: forbidden".

For the case of a dormant workspace, I deemed it safe enough to simply
unset dormancy on an attempted start (ref:
https://github.com/coder/coder/pull/21306). However, automatically
updating a workspace is a more risky option, so I instead elected to
give the user the option of updating their workspace using the existing
tooltip.


**Note:** I made a change to the `WorkspaceOutdatedTooltip` components
to allow it to have children so that the tooltip could trigger over a
wider element instead of just the info icon.

```
<🤖 AI Disclaimer>I got some help from Gemini 3 Flash in "Ask" mode.</🤖 AI Disclaimer>
```
2025-12-19 11:33:07 +00:00
Jaayden Halko 4ad653a9bd chore: add storybook tests for WorkspaceSharingPageView (#21261) 2025-12-18 21:26:27 +00:00
Jake Howell 7fb9d517af fix: increase workspace <Avatar /> size props (#21321) 2025-12-19 08:22:50 +11:00
Jaayden Halko 2de2cd5513 feat: add workspace filter for shared workspaces (#21310)
resolves coder/internal#1129

<img width="361" height="462" alt="Screenshot 2025-12-17 at 20 49 07"
src="https://github.com/user-attachments/assets/e06843f0-15e4-41fc-b736-ccfaa303ee74"
/>
2025-12-18 14:46:19 -05:00
Jake Howellandケイラ ca971dda29 fix: improve AI Bridge request logs UI/UX (#21252)
Closes #21052 and is related to #21218 

This pull request implements a bunch of changes the team requested to
improve the overall user experience when navigating to the Request Logs
page. Since these are mostly UI changes, screenshots do a much better
job of showing what's different than me trying to explain everything in
words, so I've included them below.

> [!WARNING]  
> More globally we've changed how we're rendering `<PaginationHeader
/>`, therefore we've renamed it to `<PaginationAmount />`. This will
effect multiple layouts however its a global improvement we're
intentionally looking to make.

### Preview 


![ai-bridge-improvements](https://github.com/user-attachments/assets/ce92852e-d0fc-4268-b52b-9aefd431033b)

### Changes

1. Date formatting set to a standardised way including the month as a
`MMM` (i.e `Dec`)
2. Names and avatars are now rendered larger, furthermore they render
the `.name` field falling back on `.username`.
3. Font-size increased from `text-xs` to `text-sm` to increase overall
legibility globally.
4. Initiator is now rendered inside of a `<Badge />` and gives longer
names a chance to render.
5. Models are now rendered in a `<Badge />` alongside their icons.
6. Input/Output tokens are in a shared `<Badge />`-group alongside
truncation (when necessary).
7. Badge from `5` is rendered with the proper name being visible on
hover (for use if truncated).
8. Move globally the `Showing X of X` counts to the bottom of the tables
(effects other components outside of AI Bridge).
9. Icons are now included within the dropdown for the `Provider` filter.
10. Truncation of elements is now handled so larger prompts don't cause
the table to require further scrolling.
11. New merged Input/Output `<dt>` element with the badge 

| Position | Pull-request |
| -------- | ------------ |
| ✅ | [fix: improve AI Bridge request logs
UI/UX](https://github.com/coder/coder/pull/21252) |
| | [feat: add AI Bridge request logs model
filter](https://github.com/coder/coder/pull/21259) |
| | [chore!: promote AIBridge from
`ExperimentalHandler`](https://github.com/coder/coder/pull/21278) |
| | [feat: implement request log collapsing prompt (`<RequestLogsPrompt
/>`)](https://github.com/coder/coder/pull/21313) |

---------

Co-authored-by: ケイラ <mckayla@hey.com>
2025-12-19 00:47:20 +11:00
Dean Sheather b187d33a78 fix: show exclamation mark on negated permissions in org custom roles page (#21314)
Some permissions (in built-in roles only) have `Negated: true`, so the
UI was misleading users by showing that they had those permissions when
they really didn't.

<img width="1053" height="81" alt="image"
src="https://github.com/user-attachments/assets/ccf072ed-5821-4eb6-ac75-a1a563cf55c5"
/>
2025-12-18 05:04:03 +00:00
Jaayden Halko e4a06f842a feat: add workspace share button and dialog (#21299)
resolves coder/internal#1074

<img width="621" height="421" alt="Screenshot 2025-12-16 at 20 31 33"
src="https://github.com/user-attachments/assets/c886d261-1e98-444b-9346-5f30055772ae"
/>
<img width="648" height="483" alt="Screenshot 2025-12-16 at 20 31 16"
src="https://github.com/user-attachments/assets/c247cef2-38b0-4255-b41b-cc91de2cdf2b"
/>
2025-12-17 20:29:34 +00:00
Jaayden Halko 9f34a1dbad chore: create Workspace sharing form component using workspace sharing hook (#21276)
This PR separate the data retrieval for workspace sharing ACL into a
custom hook and creates a separate form component. This is in
preparation for reusing the workspace sharing form from a new share
button on the workspace page.
2025-12-17 16:39:27 +00:00
Jake Howell e4f87d5edc feat: output cached tokens for <RequestLogsRow /> (#20974)
Closes #21217 

This pull-request traverses the `token_usages.metadata[...]` fields and
merges them into a single consumable object so that we're able discern
information about the metadata within the token usages at a glance. Its
not the be-all end-all implementation of this feature but its a stepping
stone in order to render more useful data to the frontend.

These are currently mergable because they only contain `number` based
fields. When it encounters something within the object that can't be
merged (minus empty objects `{}`) it will simply return them as an
array.

### Preview

<img width="2682" height="1360" alt="CleanShot 2025-11-28 at 15 30
09@2x"
src="https://github.com/user-attachments/assets/e07e6515-4b8e-4169-841c-38fd83c434f9"
/>

### Logic breakdown

<img width="914" height="1016" alt="CleanShot 2025-11-28 at 15 11 13@2x"
src="https://github.com/user-attachments/assets/34b78fe1-3b58-4b78-a552-028ea5a88dc4"
/>
2025-12-17 00:21:30 +00:00
Jaayden Halko 5092645e40 feat: add radix autocomplete component (#21262)
<img width="339" height="330" alt="Screenshot 2025-12-13 at 18 39 30"
src="https://github.com/user-attachments/assets/41bade09-1e2e-4ff4-9b27-a3bdc9cb07f2"
/>
2025-12-16 16:15:06 -05:00
Mathias Fredriksson dac822b7f4 refactor: remove deprecated AITaskPromptParameterName constant (#21023)
This removes the deprecated AITaskPromptParameterName constant and all
backward compatibility code that was added for v2.28.

- Remove AITaskPromptParameterName constant from codersdk/aitasks.go
- Remove backward compatibility code in coderd/aitasks.go that populated
  the "AI Prompt" parameter for templates that defined it
- Remove the backward compatibility test (OK AIPromptBackCompat)
- Update dbfake to no longer set the AI Prompt parameter
- Remove AITaskPromptParameterName from frontend TypeScript types
- Remove preset prompt read-only feature from TaskPrompt component
- Update docs to reflect that pre-2.28 definition is no longer supported

Task prompts are now exclusively stored in the tasks.prompt database
column, as introduced in the migration that added the tasks table.
2025-12-16 15:14:59 +00:00
Marcin Tojek e740872272 chore: add perplexica icon (#21289)
Related: https://github.com/coder/registry/pull/596
2025-12-16 13:58:03 +01:00
Jaayden HalkoandGeorge Katsitadze 547e53f557 feat: add workspace sharing indicator (#21222)
<img width="320" height="263" alt="Screenshot 2025-12-11 at 13 10 01"
src="https://github.com/user-attachments/assets/496a420b-788c-4d7a-ae2d-8f203ea33971"
/>

---------

Co-authored-by: George Katsitadze <george@coder.com>
2025-12-15 20:20:17 +00:00
Steven Masley 8fefd91e4a feat!: support PKCE in the oauth2 client's auth/exchange flow (#21215)
**Breaking Change:** Existing oauth apps might now use PKCE. If an
unknown IdP type was being used, and it does not support PKCE, it will
break.

To fix, set the PKCE methods on the external auth to `none`
```
export CODER_EXTERNAL_AUTH_1_PKCE_METHODS=none
```
2025-12-15 17:41:47 +00:00
Steven Masley 3194bcfc9e chore: distinct operations for provisioner's 'parse', 'init', 'plan', 'apply', 'graph' (#21064)
Provisioner steps broken into smaller granular actions.
Changes:
- `ExtractArchive` moved to `init` request (was in `configure`)
- Writing `tfstate` moved to `plan` (was in `configure`)
- Moved most plan/apply outputs to `GraphComplete`
2025-12-15 11:26:41 -06:00
George K 103967ed02 feat: add sharing info to /workspaces endpoint (#21049)
closes: https://github.com/coder/internal/issues/858

Similar to https://github.com/coder/coder/pull/19375, this one uses
system permissions for fetching actual user and group data.

Modifies the `workspaces_expanded` view to fetch the required data; this way it's made available to all code paths that make use of it.  

Also fixes a bug in a test helper function that can result in `null` being saved to the DB for `user_acl` or `group_acl` and break tests; a defensive check constraint that prevents this is worth a PR, e.g:

`ALTER TABLE workspaces
   ADD CONSTRAINT group_acl_is_object CHECK (jsonb_typeof(group_acl) = 'object');`

Also adds missing  `OwnerName` in `ConvertWorkspaceRows`.
2025-12-15 08:42:08 -08:00
Andrew Aquino 13fbbcd279 refactor: replace remaining MUI tooltips (#20938)
closes #19974 

This PR replaces all remaining MUI tooltips with our shadcn tooltip
component, and uncomments the linter restriction on importing the MUI
tooltip
2025-12-15 08:12:27 -08:00
Asher 27f0413347 feat: add flag to disable template insights (#20940)
Closes #20399 

To summarize the original commit messages:

- Do not log stats to the database.
- Return errors on the insight endpoints.
- Update the frontend to show those errors.
- Also fixes an issue with getting the user status count via codersdk,
since I added a test to ensure it was not disabled by this flag and it
was sending the wrong payload.
2025-12-14 03:00:03 +00:00
Jaayden Halko b9f8295845 feat: add workspace sharing page (#20931)
resolves coder/internal#849

<img width="870" height="554" alt="Screenshot 2025-12-10 at 20 37 38"
src="https://github.com/user-attachments/assets/8712bf81-dc6f-4645-9e32-65eee7882e76"
/>
2025-12-12 21:07:35 +00:00
Danielle Maywood e7bbfe2ee7 feat(site): allow modifying task prompts for starting tasks (#20812)
Closes https://github.com/coder/internal/issues/1084

This PR adds the frontend implementation for modifying task prompts.

---

🤖 PR was initially written by Claude Sonnet 4.5 Thinking using [Coder
Mux](https://github.com/coder/cmux) and then heavily modified by a human
👩
2025-12-11 23:20:49 +00:00
Andrew Aquino 6fa58c9999 chore: upgrade react to apply patch for CVE-2025-55184 and CVE-2025-55183 (#21239)
Reference:
https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components
2025-12-11 15:21:31 -07:00
Andrew Aquino a87a44412f feat: show sharing info at bottom of AppLink's tooltip (#21197)
for #19974 

`ShareIcon`, which returns a MUI tooltip, had these problems:

1. There was no Storybook story which rendered the "Open external URL"
tooltip
2. `AppLink` renders a button. If it has tooltip text, this button is
also a Radix `TooltipTrigger`. Since `ShareIcon` is rendered as a child
of the `AppLink` button, `ShareIcon`'s tooltip (a nested tooltip) was
never appearing. I did try turning `ShareIcon` into a Radix tooltip as
well, but I still couldn't get the nested tooltip's text to appear, and
nested tooltips are not very accessible. AFAIK there's no way to focus a
child element of a button.

I've deleted the separate `ShareIcon` component and moved `ShareIcon`'s
tooltip text to the bottom of `AppLink`'s tooltip:

## before

<img width="175" height="121" alt="image"
src="https://github.com/user-attachments/assets/ad17927e-c3d1-499b-83f8-a5832b777305"
/>

^The `UsersIcon` on the right is a MUI tooltip trigger, but it can't
receive focus. It's supposed to show the text "Shared with all
authenticated users" when focused

## after

<img width="228" height="121" alt="image"
src="https://github.com/user-attachments/assets/adc202c1-57cd-4a80-8f94-f7f32897d286"
/>
2025-12-11 13:30:16 -08:00
Andrew Aquino 36311e5293 refactor: remove disabled tooltip from PaginationNavButton (#21199)
for #19974 

The MUI tooltip inside `PaginationNavButton` was a controlled component.
This + the stateful logic inside `PaginationNavButtonCore` meant that
`showDisabledMessage` would never be set to true. I.e., the "You are
already on the first page" tooltip if on the first page and the "You are
already on the last page" tooltip if on the last page would never show
up.

The `PaginationNavButton`s gets disabled if we're at either the
first/last page, and disabled buttons can't receive focus, so there's no
way to open the MUI tooltips with keyboard navigation.

Removing the MUI tooltip + related props from `PaginationNavButton` has
no effect on my screen reader UX with macOS VoiceOver; it's entirely
unchanged
2025-12-11 10:43:25 -08:00
Kacper Sawicki 6f86f67754 feat(coderd): add overload protection with rate limiting and concurrency control (#21161)
## Summary

This adds configurable overload protection to the AI Bridge daemon to
prevent the server from being overwhelmed during periods of high load.

Partially addresses coder/internal#1153 (rate limits and concurrency
control; circuit breakers are deferred to a follow-up).

## New Configuration Options

| Option | Environment Variable | Description | Default |
|--------|---------------------|-------------|---------|
| `--aibridge-max-concurrency` | `CODER_AIBRIDGE_MAX_CONCURRENCY` |
Maximum number of concurrent AI Bridge requests. Set to 0 to disable
(unlimited). | `0` |
| `--aibridge-rate-limit` | `CODER_AIBRIDGE_RATE_LIMIT` | Maximum number
of AI Bridge requests per second. Set to 0 to disable rate limiting. |
`0` |

## Behavior

When limits are exceeded:
- **Concurrency limit**: Returns HTTP `503 Service Unavailable` with
message "AI Bridge is currently at capacity. Please try again later."
- **Rate limit**: Returns HTTP `429 Too Many Requests` with
`Retry-After` header.

Both protections are optional and disabled by default (0 values).

## Implementation

The overload protection is implemented as reusable middleware in
`coderd/httpmw/ratelimit.go`:

1. **`RateLimitByAuthToken`**: Per-user rate limiting that uses
`APITokenFromRequest` to extract the authentication token, with fallback
to `X-Api-Key` header for AI provider compatibility (e.g., Anthropic).
Falls back to IP-based rate limiting if no token is present. Includes
`Retry-After` header for backpressure signaling.
2. **`ConcurrencyLimit`**: Uses an atomic counter to track in-flight
requests and reject when at capacity.

The middleware is applied in `enterprise/coderd/aibridge.go` via
`r.Group` in the following order:
1. Concurrency check (faster rejection for load shedding)
2. Rate limit check

**Note**: Rate limiting currently applies to all AI Bridge requests,
including pass-through requests. Ideally only actual interceptions
should count, but this would require changes in the aibridge library.

## Testing

Added comprehensive tests for:
- Rate limiting by auth token (Bearer token, X-Api-Key, no token
fallback to IP)
- Different tokens not rate limited against each other
- Disabled when limit is zero
- Retry-After header is set on 429 responses
- Concurrency limiting (allows within limit, rejects over limit,
disabled when zero)
2025-12-11 16:38:54 +01:00
Ben PotterandClaude Sonnet 4.5 8e460ca865 feat(site): add cmd+enter to submit tasks immediately (#21182)
Implements cmd+enter (Mac) / ctrl+enter (Windows/Linux) keyboard
shortcut for submitting tasks on the tasks page. Regular enter key still
creates new lines as expected.

Fixes #21179

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-10 22:00:24 +00:00
Atif Ali ed3bb76c9b feat(site): add icons for .sh, .json, and .y[a]ml files in template editor (#21171)
Added specific icons for common file types in the template file tree:
- **.sh files**: TerminalIcon (terminal/shell scripts)
- **.json files**: BracesIcon (JSON data files)  
- **.yaml/.yml files**: FileCodeIcon (YAML configuration files)

<img width="260" height="290" alt="image"
src="https://github.com/user-attachments/assets/a470f4bc-fc2c-4e2d-8067-a9fbbfe32e42"
/>

These icons help users quickly identify file types at a glance in the
template editor.
2025-12-10 21:19:25 +01:00