reviewme 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,103 +1,15 @@
1
1
  # ReviewMe
2
2
 
3
- Local Git branch review in a browser, with persisted review state, inline
4
- comments, read-only Codex threads, and configurable file navigation.
3
+ High performance Github PR like reviewer.
5
4
 
6
5
  ## Usage
7
6
 
8
- ReviewMe requires Node.js 22.13 or newer and Git. Run it from the repository
9
- you want to inspect:
10
-
11
7
  ```sh
12
- npx reviewme main...HEAD
8
+ npx reviewme
13
9
  # or
14
- bunx reviewme main...HEAD
15
- ```
16
-
17
- `bunx` launches the same Node CLI and therefore also requires a compatible Node
18
- installation. Codex features additionally require an installed and authenticated
19
- Codex CLI; the rest of the review UI works without it.
20
-
21
- Open the cog menu to choose System, Light, or Dark appearance independently
22
- from the color theme. ReviewMe includes Default, GitHub, Nord, and Dracula
23
- presets. Import a custom JSON/YAML theme from the same menu, or provide one at
24
- startup:
25
-
26
- ```sh
27
- npx reviewme --color-theme ./theme.yml main...HEAD
28
- ```
29
-
30
- Each color theme contains both `light` and `dark` palettes. See
31
- [`examples/themes/custom.yml`](./examples/themes/custom.yml) for the version 1
32
- schema. UI-imported themes are saved in browser local storage; CLI themes are
33
- available for the lifetime of that server process.
34
-
35
- ## Development
36
-
37
- Install dependencies with Bun, then start a review from the repository you want
38
- to inspect:
39
-
40
- ```sh
41
- bun install
42
- npm run dev -- main...HEAD
43
- ```
44
-
45
- The default comparison is `main...HEAD` (merge-base semantics). Direct
46
- tip-to-tip comparisons use `main..HEAD`, or explicit endpoints:
47
-
48
- ```sh
49
- npm run dev -- --from v1.2.0 --to HEAD
10
+ bunx reviewme
50
11
  ```
51
12
 
52
- The server always binds to `127.0.0.1` and chooses a free port by default.
53
- Authentication is off by default. Pass `--auth` to require a per-process token;
54
- API requests can send it as a Bearer token, `X-Review-Token`, or the `token`
55
- query parameter. The browser
56
- frontend is served from the installed package; set `REVIEWME_STATIC_DIR`
57
- to use another built asset directory.
58
-
59
- Reviewed files, comments, drafts, and Codex session links are stored in a local
60
- SQLite database in the platform user-data directory. Codex owns its transcript;
61
- the app resumes it by external thread ID instead of duplicating messages.
62
-
63
- File opening defaults to macOS `open "$VR_FILE"` (or `xdg-open` elsewhere).
64
- Override it with `--open-command` or `REVIEWME_OPEN_COMMAND`. The command
65
- receives `VR_FILE`, `VR_REL_FILE`, `VR_FILE_EXISTS`, `VR_ROOT`, `VR_SIDE`,
66
- `VR_COMMIT`, `VR_BASE_SHA`, `VR_HEAD_SHA`, `VR_LINE`, and `VR_COLUMN`.
67
-
68
- Useful checks:
69
-
70
- ```sh
71
- bun test
72
- npm run typecheck
73
- ```
74
-
75
- The local API includes these core paths (authentication is required only when
76
- the server is started with `--auth`):
77
-
78
- ```text
79
- GET /api/repository repository and resolved SHA metadata
80
- GET /api/metadata repository metadata plus changed files
81
- GET /api/files changed-file metadata
82
- GET /api/refs local branches, remotes, and tags
83
- GET /api/revision current revision and dirty state
84
- GET /api/refresh refresh metadata (POST is also accepted)
85
- GET /api/patch?fileId=PATH complete Git patch for one changed file
86
- GET /api/files/PATH/diff same patch endpoint with a path in the URL
87
- GET /api/patch-stream complete comparison patch as a streamed Git response
88
- GET /api/events authenticated Server-Sent Events stream
89
- POST /api/open-working-file {"path":"src/file.ts","line":12,"column":1}
90
- ```
91
-
92
- Build the publishable Node CLI and browser frontend:
93
-
94
- ```sh
95
- npm run build
96
- ```
97
-
98
- Bun is currently used as the maintainer build and test tool, but it is not a
99
- runtime dependency of the published package.
100
-
101
13
  ## License and acknowledgements
102
14
 
103
15
  Licensed under the [Apache License 2.0](./LICENSE).
@@ -0,0 +1 @@
1
+ :root{--review-bg:#0d0f10;--review-sidebar:#111315;--review-panel:#151819;--review-panel-raised:#1b1f20;--review-border:#ffffff17;--review-border-strong:#ffffff26;--review-text:#e2e6e5;--review-muted:#8c9694;--review-subtle:#5e6967;--review-accent:#4c67dc;--review-brand-accent:#4c67dc;--review-brand-add:#5bc98a;--review-brand-delete:#f07979;--review-add:#5bc98a;--review-delete:#f07979;--review-blue:#7aa8ff;--review-sidebar-width:292px}:root[data-review-theme=light]{--review-bg:#f5f6f4;--review-sidebar:#eef0ed;--review-panel:#fff;--review-panel-raised:#e7eae6;--review-border:#161f1c1c;--review-border-strong:#161f1c33;--review-text:#202724;--review-muted:#64706b;--review-subtle:#89938f;--review-accent:#303ca9;--review-add:#16844b;--review-delete:#c13e45;--review-blue:#316fc1}*{box-sizing:border-box}html,body,#root{overflow:hidden;width:100%;height:100%;margin:0}.review-shell{position:relative;display:flex;overflow:hidden;color:var(--review-text);background:var(--review-bg);--buncss-light: ;--buncss-dark:initial;color-scheme:dark;-webkit-font-smoothing:antialiased;flex-direction:column;width:100%;height:100%;min-height:420px;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;line-height:1.4}:root[data-review-theme=light] .review-shell{--buncss-light:initial;--buncss-dark: ;color-scheme:light}:root[data-review-theme=light] .review-header{background:color-mix(in srgb,var(--review-sidebar)96%,#fff)}:root[data-review-theme=light] .review-ref-input,:root[data-review-theme=light] .review-ref-options>button{color:var(--review-text)}:root[data-review-theme=light] .review-ref-popover,:root[data-review-theme=light] .review-comment-composer,:root[data-review-theme=light] .review-agent-prompt,:root[data-review-theme=light] .review-thread-card,:root[data-review-theme=light] .review-agent-conversation-card,:root[data-review-theme=light] .review-toast{background:var(--review-panel);box-shadow:0 10px 30px #1b262229}:root[data-review-theme=light] .review-gutter-actions,:root[data-review-theme=light] .review-gutter-action-tray{border-color:var(--review-border-strong);color:var(--review-text);background:var(--review-panel);box-shadow:0 3px 10px #1b26222e}.review-shell button,.review-shell input{font:inherit}.review-gutter-actions{position:relative;z-index:2;display:inline-flex;overflow:visible;color:var(--review-text);background:#202526;border:1px solid #ffffff2e;border-radius:6px;align-items: center;width:23px;height:23px;box-shadow:0 3px 10px #0000006b}.review-gutter-action-launcher{display:grid;cursor:default;background:0 0;border:0;flex:none;place-items: center;width:21px;height:21px;padding:0;transition:color .12s,transform .14s;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:18px;font-weight:450;line-height:1}.review-gutter-action-plus{display:grid;place-items: center}.review-gutter-drag-icon{display:none;place-items: center}.review-gutter-actions[data-drag-mode=comment] .review-gutter-action-plus,.review-gutter-actions[data-drag-mode=agent] .review-gutter-action-plus{display:none}.review-gutter-actions[data-drag-mode=comment] .review-gutter-drag-comment,.review-gutter-actions[data-drag-mode=agent] .review-gutter-drag-agent{display:grid}.review-gutter-actions[data-drag-mode=comment] .review-gutter-action-launcher{color:var(--review-accent)!important;transform:none!important}.review-gutter-actions[data-drag-mode=agent] .review-gutter-action-launcher{color:var(--review-blue)!important;transform:none!important}.review-gutter-actions[data-drag-mode] .review-gutter-action-tray{opacity:0!important;pointer-events:none!important;transform:translate(-9px)scaleX(.78)!important}.review-gutter-action-tray{position:absolute;display:inline-flex;overflow:hidden;opacity:0;pointer-events:none;transform-origin:left center;background:#202526;border:1px solid #ffffff2e;border-left:0;border-radius:0 6px 6px 0;align-items: center;width:45px;height:23px;transition:opacity 90ms,transform .14s cubic-bezier(.2,.8,.2,1);left:20px;transform:translate(-9px)scaleX(.78);box-shadow:5px 3px 10px #00000052}.review-gutter-actions:hover .review-gutter-action-launcher,.review-gutter-actions:focus-within .review-gutter-action-launcher{color:var(--review-accent);transform:rotate(45deg)scale(.86)}.review-gutter-actions:hover .review-gutter-action-tray,.review-gutter-actions:focus-within .review-gutter-action-tray{opacity:1;pointer-events:auto;transform:translate(0)scaleX(1)}.review-gutter-action{color:var(--review-muted);transition:color .1s,background-color .1s}.review-gutter-comment{color:var(--review-accent)}.review-gutter-agent{color:var(--review-blue);border-left:1px solid #ffffff1f!important}.review-gutter-action:hover{color:var(--review-text);background:#ffffff1a!important}@media (prefers-reduced-motion:reduce){.review-gutter-action-launcher,.review-gutter-action-tray{transition:none}}.review-shell button{color:inherit}.review-shell button:focus-visible{outline:1px solid var(--review-accent);outline-offset:1px}.review-shell input:focus-visible{outline:1px solid var(--review-accent);outline-offset:1px}.review-resize-handle:focus-visible{outline:1px solid var(--review-accent);outline-offset:1px}.review-header{z-index:5;display:flex;border-bottom:1px solid var(--review-border);background:color-mix(in srgb,var(--review-sidebar)94%,#000);align-items: center;gap:12px;min-height:47px;padding:7px 14px 7px 12px}.review-brand{position:relative;isolation:isolate;display:flex;cursor:pointer;text-align:left;background:0 0;border:0;align-items: center;gap:8px;min-width:0;padding:0}.review-brand:before{position:absolute;z-index:0;background:linear-gradient(90deg,color-mix(in srgb,var(--review-brand-accent)28%,transparent)0%,color-mix(in srgb,var(--review-brand-accent)18%,transparent)28%,color-mix(in srgb,var(--review-brand-accent)8%,transparent)64%,transparent 100%);content:"";pointer-events:none;width:104px;height:46px;top:50%;left:-10px;transform:translateY(-50%)}.review-brand>*{position:relative;z-index:1}.review-brand-mark{flex:0 0 26px;width:26px;height:26px}.review-brand-mark-l{stroke:var(--review-brand-accent);stroke-width:2.7;stroke-linecap:round;stroke-linejoin:round}.review-brand-mark-add,.review-brand-mark-delete{stroke-width:1.5;stroke-linecap:round}.review-brand-mark-add{stroke:var(--review-brand-add)}.review-brand-mark-delete{stroke:var(--review-brand-delete)}.review-brand-copy{display:grid;gap:1px;min-width:0}.review-brand-copy strong{color:#f0f2f1;letter-spacing:.18em;text-transform:uppercase;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:700}.review-brand-toggle{display:grid;border:1px solid var(--review-border-strong);color:var(--review-muted);background:color-mix(in srgb,var(--review-panel-raised)78%,transparent);box-shadow:inset 0 1px 0 color-mix(in srgb,var(--review-text)7%,transparent),0 1px 2px #00000029;border-radius:6px;flex:0 0 22px;place-items: center;width:22px;height:22px;transition:color .1s,border-color .1s,background-color .1s,transform .1s}.review-brand-toggle svg{stroke-width:2;width:11px;height:11px}.review-brand:hover .review-brand-toggle{border-color:color-mix(in srgb,var(--review-brand-accent)58%,var(--review-border));color:var(--review-brand-accent);background:color-mix(in srgb,var(--review-brand-accent)12%,var(--review-panel-raised))}.review-brand:active .review-brand-toggle{transform:translateY(1px)}.review-github-identity{display:grid;gap:1px;min-width:0;max-width:180px;padding-left:2px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;line-height:1.08}.review-github-identity>span,.review-github-identity>strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.review-github-identity>span{color:var(--review-subtle)}.review-github-identity>strong{color:var(--review-text);padding-left:14px;font-size:10px;font-weight:650}.review-ref-form{display:flex;align-items: center;gap:5px;min-width:240px}.review-ref-form label{min-width:0}.review-ref-combobox{position:relative}.review-ref-input-wrap{position:relative;display:block}.review-ref-form input{border:1px solid var(--review-border);outline:none;color:#d9dfdd;background:#ffffff09;border-radius:5px;width:132px;padding:5px 24px 5px 7px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px}.review-ref-form input:hover{border-color:var(--review-border-strong)}.review-ref-form input:focus{border-color:#e3a65d9e;box-shadow:0 0 0 2px #e3a65d1a}.review-ref-form input::placeholder{color:var(--review-subtle);font-size:8px}.review-ref-disclosure{position:absolute;border:0;border-left:1px solid var(--review-border);color:var(--review-muted);cursor:pointer;display:grid;background:#ffffff06;border-radius:0 4px 4px 0;place-items: center;width:22px;padding:0;inset:1px 1px 1px auto}.review-ref-disclosure svg{display:block;fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;width:12px;height:12px}.review-ref-disclosure:hover{color:var(--review-text);background:#ffffff12}.review-ref-popover{position:absolute;z-index:50;display:block;overflow:hidden;border:1px solid var(--review-border-strong);background:#111614;border-radius:7px;width:min(290px,70vw);max-height:min(340px,55vh);padding:5px;top:calc(100% + 5px);left:0;box-shadow:0 14px 36px #00000073}.review-ref-description{display:block;color:var(--review-subtle);border-bottom:1px solid #ffffff12;padding:5px 7px 8px;font-size:9px;line-height:1.45}.review-ref-options{display:block;overflow-y:auto;max-height:min(292px,55vh - 48px);padding-top:4px}.review-ref-options>button{display:flex;color:#d9dfdd;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:4px;justify-content:space-between;align-items: center;gap:14px;width:100%;padding:6px 7px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px}.review-ref-options>button:hover,.review-ref-options>button.is-active{color:#eef5ff;background:#68a9ff1f}.review-ref-options>button span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.review-ref-options>button small{color:var(--review-subtle);letter-spacing:.08em;text-transform:uppercase;flex:none;font-size:8px}.review-ref-arrow{color:var(--review-subtle);font-size:13px}.review-header-meta{display:flex;overflow:hidden;color:var(--review-muted);text-transform:uppercase;white-space:nowrap;align-items: center;gap:6px;min-width:0;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.review-comparison-mode{color:inherit;cursor:pointer;font:inherit;text-transform:inherit;background:0 0;border:0;padding:0}.review-repository-context{position:relative;display:grid;text-transform:none;gap:2px;min-width:0;margin-inline-start:8px;margin-inline-end:8px;line-height:1.05}.review-repository-path,.review-branch{display:flex;align-items: center;gap:4px;min-width:0}.review-repository-tooltip{position:absolute;z-index:20;display:grid;border:1px solid var(--review-border-strong);color:var(--review-text);background:var(--review-panel-raised);opacity:0;pointer-events:none;text-transform:none;border-radius:4px;gap:7px;width:max-content;max-width:min(540px,80vw);padding:8px 9px;transition:opacity 60ms .1s,transform 60ms .1s;font-size:10px;font-weight:500;line-height:1.35;top:calc(100% + 7px);left:-6px;transform:translateY(-2px);box-shadow:0 5px 16px #00000059}.review-repository-context:hover .review-repository-tooltip{opacity:1;transform:translateY(0)}.review-repository-tooltip-row{display:flex;align-items: center;gap:7px;min-width:0}.review-repository-tooltip-row>svg{color:var(--review-accent);stroke-width:1.8;flex:0 0 12px;width:12px;height:12px}.review-repository-tooltip-row>span{display:grid;gap:2px;min-width:0}.review-repository-tooltip-row strong{color:var(--review-muted);letter-spacing:.04em;text-transform:uppercase;font-size:8px;font-weight:600}.review-repository-tooltip-row span span{overflow-wrap:anywhere}.review-repository-path{color:var(--review-muted)}.review-branch{color:var(--review-accent)}.review-repository-path>span,.review-branch>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.review-repository-path>svg,.review-branch>svg{stroke-width:1.8;flex:0 0 10px;width:10px;height:10px}.review-comparison-mode:hover{color:var(--review-text);text-decoration:underline;text-underline-offset:3px}.review-comparison-mode:focus-visible{outline:1px solid var(--review-accent);outline-offset:3px;border-radius:2px}.review-load-dot{background:var(--review-subtle);border-radius:50%;flex:none;width:6px;height:6px}.review-load-dot.loading{background:var(--review-accent);box-shadow:0 0 0 3px #e3a65d1f}.review-load-dot.ready{background:var(--review-add)}.review-load-dot.error{background:var(--review-delete)}.review-header-stats{display:flex;color:var(--review-muted);white-space:nowrap;flex:none;align-items: center;gap:8px;margin-left:auto;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px}.review-stat-files{color:var(--review-muted)}.review-stat-add{color:var(--review-add)}.review-stat-del{color:var(--review-delete)}.review-header-actions{display:flex;flex:none;align-items: center;gap:2px}.review-settings{position:relative}.review-settings-popover{position:absolute;z-index:80;display:grid;border:1px solid var(--review-border-strong);color:var(--review-text);background:var(--review-panel);border-radius:9px;gap:12px;width:min(270px,100vw - 16px);padding:14px;top:calc(100% + 7px);right:0;box-shadow:0 14px 36px #00000061}.review-settings-popover>strong{letter-spacing:.02em;font-size:12px}.review-settings-popover label{display:grid;color:var(--review-muted);gap:5px;font-size:10px}.review-settings-popover select{border:1px solid var(--review-border);outline:none;color:var(--review-text);background:var(--review-panel-raised);border-radius:5px;width:100%;padding:6px 8px}.review-settings-popover select:focus{border-color:var(--review-accent)}.review-theme-import{position:relative;border:1px dashed var(--review-border-strong);cursor:pointer;border-radius:6px;padding:7px 9px}.review-theme-import:hover{color:var(--review-text);border-color:var(--review-accent)}.review-theme-import>span{display:flex;justify-content:center;align-items: center;gap:6px}.review-theme-import svg{width:13px;height:13px}.review-theme-import input{position:absolute;opacity:0;pointer-events:none;width:1px;height:1px}.review-settings-error{color:var(--review-delete);margin:-3px 0 0;font-size:9px;line-height:1.45}.review-icon-button{position:relative;display:grid;color:var(--review-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:5px;place-items: center;width:27px;height:27px;padding:0}.review-icon-button svg{width:14px;height:14px}.review-icon-button:hover,.review-icon-button.is-active{border-color:var(--review-border);color:var(--review-text);background:#fff1}.review-workspace{display:flex;overflow:hidden;flex:1;min-height:0}.review-navigation-column.is-columns{display:contents}.review-navigation-column.is-stacked{display:flex;width:var(--review-sidebar-width);overflow:hidden;border-right:1px solid var(--review-border);flex-direction:column;flex:none;min-width:0;max-width:480px;min-height:0}.review-navigation-column.is-stacked.is-hidden{border:0;width:0;min-width:0}.review-shell.sidebars-are-animating .review-navigation-column.is-stacked,.review-shell.sidebars-are-animating .review-commit-sidebar,.review-shell.sidebars-are-animating .review-sidebar,.review-shell.sidebars-are-animating .review-resize-handle{transition:width .22s cubic-bezier(.22,1.25,.36,1),min-width .22s cubic-bezier(.22,1.25,.36,1),height .22s cubic-bezier(.22,1.25,.36,1),transform .18s}.review-commit-sidebar{display:flex;overflow:visible;border-right:1px solid var(--review-border);background:color-mix(in srgb,var(--review-sidebar)94%,var(--review-bg));flex-direction:column;flex:none;min-width:44px;max-width:360px;min-height:0;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace}.review-commit-sidebar.is-hidden{visibility:hidden;border-right:0;min-width:0}.review-commit-sidebar.is-stacked{overflow:hidden;border-right:0;border-bottom:1px solid var(--review-border);min-width:0;max-width:none;width:100%!important}.review-commit-sidebar.is-stacked.is-hidden{border-bottom:0;height:0!important}.review-commit-sidebar.is-height-animating{transition:height .22s cubic-bezier(.22,1.25,.36,1)}.review-commit-heading{display:flex;border-bottom:1px solid var(--review-border);color:var(--review-muted);text-transform:uppercase;justify-content:space-between;align-items: center;gap:6px;min-height:38px;padding:0 10px}.review-commit-heading strong{overflow:hidden;color:var(--review-text);letter-spacing:.08em;text-overflow:ellipsis;min-width:0;font-size:9px}.review-commit-heading small{color:var(--review-subtle);font-size:8px}.review-commit-heading-title{display:flex;flex:1;justify-content:center;align-items:baseline;gap:4px;min-width:0}.review-commit-heading.is-collapsed .review-commit-heading-title{flex:none}.review-commit-mini-graph{overflow-x:auto;overflow-y:hidden;mask-image:linear-gradient(90deg,#0000,#000 7px calc(100% - 7px),#0000);scrollbar-width:none;touch-action:pan-x;flex:1;min-width:0}.review-commit-mini-graph::-webkit-scrollbar{display:none}.review-commit-mini-track{position:relative;display:flex;align-items: center;gap:3px;width:max-content;padding:0 7px}.review-commit-mini-track:before{position:absolute;background:var(--review-border-strong);content:"";height:1px;left:15px;right:15px}.review-commit-mini-node{position:relative;z-index:1;display:grid;color:var(--review-subtle);cursor:pointer;background:0 0;border:0;flex:0 0 17px;place-items: center;width:17px;height:24px;padding:0}.review-commit-mini-node>span{display:grid;border:1px solid var(--review-border-strong);background:var(--review-sidebar);border-radius:50%;place-items: center;width:11px;height:11px;font-size:6px;line-height:1}.review-commit-mini-node:hover>span,.review-commit-mini-node.is-preview>span{border-color:var(--review-text)}.review-commit-mini-node.is-active>span{border-color:var(--review-accent);background:var(--review-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--review-accent)14%,transparent)}.review-commit-mini-node.is-working-tree>span{color:#efbd7b;border-style:dashed;border-color:#d49a52}.review-commit-mini-node.is-working-tree.is-active>span{color:#4a2d0e;background:#e3a65d;border-color:#e3a65d}:root[data-review-theme=light] .review-commit-mini-node.is-working-tree>span{color:#8a510e;border-color:#a86116}:root[data-review-theme=light] .review-commit-mini-node.is-working-tree.is-active>span{color:#f5f6f4;background:#a86116;border-color:#a86116}.review-commit-mini-node.is-working-tree svg{fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;width:7px;height:7px}.review-commit-mini-node:disabled{opacity:.4;cursor:default}.review-commit-mini-node:focus-visible{outline:1px solid var(--review-accent);outline-offset:-2px}.review-commit-layout{position:relative;display:grid;color:var(--review-muted);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:0 0 24px;place-items: center;width:24px;height:24px;padding:0}.review-commit-layout:after{position:absolute;z-index:100;color:var(--review-text);content:attr(data-tooltip);opacity:0;pointer-events:none;text-transform:none;white-space:nowrap;background:#242a28;border-radius:4px;width:max-content;max-width:190px;padding:5px 7px;transition:opacity 60ms .1s,transform 60ms .1s;font-size:8px;font-weight:500;line-height:1.3;top:calc(100% + 6px);left:0;transform:translateY(-2px);box-shadow:0 5px 16px #00000059}.review-commit-layout:hover:after{opacity:1;transform:translateY(0)}.review-commit-layout:focus-visible:after{opacity:1;transform:translateY(0)}.review-commit-layout:hover{color:var(--review-text);background:0 0}.review-commit-layout svg{stroke-width:2;width:12px;height:12px}.review-commit-expand{display:grid;color:var(--review-muted);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:0 0 22px;place-items: center;width:22px;height:22px;padding:0}.review-commit-expand:hover{color:var(--review-text);background:#ffffff0f}.review-commit-expand svg{stroke-width:2;width:12px;height:12px}.review-commit-heading-divider{background:var(--review-border-strong);flex:0 0 1px;width:1px;height:18px;margin-right:3px}.review-commit-list{overflow:auto;scrollbar-width:thin;min-height:0;padding:6px}.review-commit-item{position:relative;display:flex;color:var(--review-muted);cursor:pointer;text-align:left;user-select:none;background:0 0;border:0;border-radius:5px;align-items: center;gap:7px;width:100%;min-width:0;padding:6px 5px}.review-commit-item:hover,.review-commit-item.is-preview{color:var(--review-text);background:color-mix(in srgb,var(--review-blue)8%,transparent)}.review-commit-item.is-active{color:var(--review-accent);background:color-mix(in srgb,var(--review-accent)13%,transparent)}.review-commit-item.is-working-tree{color:#dca862;background:#b777300a;margin-bottom:3px}.review-commit-item.is-working-tree .review-commit-node{color:#efbd7b;background:#b7773024;border-style:dashed}.review-commit-item.is-working-tree .review-commit-node>svg{fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;width:12px;height:12px}.review-commit-item.is-working-tree .review-commit-node:after{background:repeating-linear-gradient(#d49a52b8 0 3px,#0000 3px 6px);height:18px;top:16px;left:7px}.review-commit-item.is-working-tree.is-active{color:#f1c387;background:#b7773024}.review-commit-item.is-working-tree.is-active .review-commit-node{color:#ffd39a;border-color:#e3a65d;box-shadow:0 0 0 3px #e3a65d1f}:root[data-review-theme=light] .review-commit-item.is-working-tree{color:#8a510e;background:#a861160b}:root[data-review-theme=light] .review-commit-item.is-working-tree.is-active{color:#74400a;background:#a861161f}:root[data-review-theme=light] .review-commit-item.is-working-tree .review-commit-node{color:#8a510e;background:#a861161a;border-color:#a86116}:root[data-review-theme=light] .review-commit-item.is-working-tree .review-commit-node:after{background:repeating-linear-gradient(#a8611699 0 3px,#0000 3px 6px)}.review-commit-item.is-working-tree:disabled{opacity:.42;cursor:default}.review-commit-item:focus-visible{outline:1px solid var(--review-accent);outline-offset:-1px}.review-commit-tooltip-layer{position:fixed;z-index:1000;overflow:hidden;pointer-events:none;contain:strict;inset:0}.review-commit-tooltip{position:absolute;display:grid;border:1px solid var(--review-border-strong);color:var(--review-text);animation:60ms 80ms both review-commit-tooltip-in;background:#242a28;border-radius:5px;gap:3px;width:max-content;min-width:280px;max-width:360px;padding:7px 9px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;box-shadow:0 7px 20px #0006}.review-commit-tooltip strong{overflow:hidden;text-overflow:ellipsis;white-space:normal;font-size:9px;font-weight:600;line-height:1.35}.review-commit-tooltip span{color:var(--review-muted);white-space:nowrap;font-size:8px}.review-commit-tooltip .review-commit-tooltip-instruction{border-top:1px solid var(--review-border);color:var(--review-text);margin-top:3px;padding-top:6px}@keyframes review-commit-tooltip-in{0%{opacity:0;transform:translate(-3px)}to{opacity:1;transform:translate(0)}}.review-commit-node{position:relative;z-index:1;display:grid;border:1px solid var(--review-border-strong);color:var(--review-subtle);background:var(--review-sidebar);border-radius:50%;flex:0 0 17px;place-items: center;width:17px;height:17px;font-size:6px;line-height:1}.review-commit-item:not(:last-child) .review-commit-node:after{position:absolute;z-index:-1;background:var(--review-border-strong);content:"";width:1px;height:18px;top:16px;left:7px}.review-commit-item.is-active .review-commit-node{border-color:var(--review-accent);color:var(--review-accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--review-accent)12%,transparent)}.review-commit-copy{display:grid;flex:1;gap:2px;min-width:0}.review-commit-copy strong,.review-commit-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.review-commit-copy strong{color:inherit;font-size:9px;font-weight:550}.review-commit-copy small{color:var(--review-subtle);font-size:7px}.review-commit-sidebar.is-dense .review-commit-heading{gap:2px;padding-inline-start:4px;padding-inline-end:4px}.review-commit-sidebar.is-compact .review-commit-heading{justify-content:center;padding-inline-start:4px;padding-inline-end:4px}.review-commit-sidebar.is-compact .review-commit-heading small,.review-commit-sidebar.is-compact .review-commit-heading-divider{display:none}.review-commit-sidebar.is-compact .review-commit-list{padding-inline-start:5px;padding-inline-end:5px}.review-commit-sidebar.is-compact .review-commit-item{justify-content:center;padding-inline-start:0;padding-inline-end:0}.review-commit-resize-handle{margin-right:-2px}.review-commit-resize-handle.is-stacked{cursor:row-resize;flex:0 0 4px;width:100%;height:4px;margin:-2px 0 0}.review-commit-resize-handle.is-hidden{pointer-events:none;flex-basis:0;width:0;height:0}.review-navigation-column.is-stacked .review-sidebar{border-right:0;flex:auto;min-width:220px;max-width:none;width:100%!important}.review-sidebar{container-name:review-sidebar;container-type:inline-size;display:flex;border-right:1px solid var(--review-border);background:var(--review-sidebar);flex-direction:column;flex:none;min-width:220px;max-width:480px;min-height:0;transition:transform .18s}.review-sidebar.is-hidden{overflow:hidden;border-right:0;min-width:0;width:0!important}.review-filter-wrap{display:flex;border:1px solid var(--review-border);color:var(--review-subtle);background:#00000029;border-radius:5px;align-items: center;gap:7px;height:29px;margin:10px 11px 6px;padding:0 7px}.review-filter-wrap>svg{flex:none;width:13px;height:13px}.review-filter-wrap input{outline:none;color:var(--review-text);background:0 0;border:0;flex:1;min-width:0;padding:0;font-size:11px}.review-filter-wrap input::placeholder{color:var(--review-subtle)}.review-filter-wrap.is-invalid{border-color:var(--review-delete);box-shadow:0 0 0 1px #f079791f}.review-filter-wrap button{color:var(--review-subtle);cursor:pointer;background:0 0;border:0;padding:0 2px;font-size:16px;line-height:1}.review-filter-wrap .review-regexp-toggle{display:inline-grid;border:1px solid #0000;border-radius:4px;flex:none;place-items: center;width:23px;height:21px;padding:0;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:650}.review-filter-wrap .review-regexp-toggle:hover{color:var(--review-text);background:#ffffff0f}.review-filter-wrap .review-regexp-toggle.is-active{color:var(--review-accent);background:#e3a65d1a;border-color:#e3a65d61}.review-filter-wrap.is-invalid .review-regexp-toggle{color:var(--review-delete)}.review-filter-row{display:flex;align-items: center;gap:3px;min-height:26px;padding:0 11px 7px}.review-filter-row button{display:inline-flex;color:var(--review-subtle);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;align-items: center;gap:3px;min-height:20px;padding:2px 6px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.review-filter-row button:hover,.review-filter-row button.is-active{border-color:var(--review-border);color:var(--review-text);background:#ffffff0e}.review-filter-row button small{display:inline-block;min-width:var(--review-filter-count-width,1ch);color:var(--review-muted);font-variant-numeric:tabular-nums;text-align:right;font-size:8px}.review-filter-row button.review-filter-modified,.review-filter-row button.review-filter-modified small{color:var(--buncss-light,#1ca1c7)var(--buncss-dark,#08c0ef)}.review-filter-row button.review-filter-added,.review-filter-row button.review-filter-added small{color:var(--buncss-light,#16a994)var(--buncss-dark,#5fd47a)}.review-filter-row button.review-filter-deleted,.review-filter-row button.review-filter-deleted small{color:var(--buncss-light,#ff2e3f)var(--buncss-dark,#ff6762)}.review-filter-divider{background:var(--review-border);flex:0 0 1px;width:1px;height:14px;margin:0 2px}.review-filter-row button.review-filter-uncommitted,.review-filter-row button.review-filter-uncommitted small{color:var(--buncss-light,#8a510e)var(--buncss-dark,#e3a65d)}.review-filter-row button.review-filter-uncommitted{min-width:0;padding-inline-start:5px;padding-inline-end:5px}.review-filter-uncommitted>svg{fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;flex:0 0 12px;width:12px;height:12px}.review-tree-wrap{overflow:hidden;flex:1;min-height:0}.review-file-tree{display:block;color-scheme:normal;--trees-density-override:.84;--trees-padding-inline-override:10px;width:100%;height:100%;min-height:0}.review-sidebar-footer{border-top:1px solid var(--review-border);color:var(--review-muted);padding:10px 12px 12px 14px}.review-progress-row{display:flex;text-transform:uppercase;justify-content:space-between;align-items: center;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.review-progress-row strong{color:var(--review-text);font-weight:500}.review-progress-track{overflow:hidden;background:#ffffff14;border-radius:3px;height:3px;margin:6px 0 0}.review-progress-track span{display:block;border-radius:inherit;background:var(--review-add);height:100%;transition:width .18s}.review-resize-handle{z-index:2;cursor:col-resize;touch-action:none;width:4px;margin-left:-2px}.review-resize-handle:hover,.review-resize-handle:active{background:#e3a65d52}.review-resize-handle.is-hidden{pointer-events:none;width:0}.review-code-pane{position:relative;background:var(--review-bg);flex:1;min-width:0;min-height:0}.review-code-view{overflow:auto;overscroll-behavior:contain;scrollbar-color:#3c4543 transparent;scrollbar-width:thin;width:100%;height:100%;min-height:0}.review-code-view::-webkit-scrollbar{width:10px;height:10px}.review-code-view::-webkit-scrollbar-track{background:0 0}.review-code-view::-webkit-scrollbar-thumb{background-color:#3c4543;background-clip:padding-box;border:3px solid #0000;border-radius:10px}.review-diff-collapse{display:inline-grid;color:var(--review-muted);cursor:pointer;background:0 0;border:0;border-radius:4px;place-items: center;width:22px;height:22px;margin-left:-5px;padding:0}.review-diff-collapse:hover{color:var(--review-text);background:#ffffff14}.review-diff-collapse svg{width:13px;height:13px;transition:transform .12s}.review-diff-collapse svg.is-collapsed{transform:rotate(-90deg)}.review-copy-path{display:inline-grid;color:var(--review-muted);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;place-items: center;width:22px;height:22px;margin-left:2px;padding:0}.review-copy-path:hover{color:var(--review-text);background:color-mix(in srgb,var(--review-text)8%,transparent)}.review-copy-path:focus-visible{outline:1px solid var(--review-accent);outline-offset:1px}.review-copy-path svg{width:13px;height:13px}.review-header-viewed{display:inline-flex;color:var(--review-muted);cursor:pointer;align-items: center;gap:5px;font-size:10px;line-height:1}.review-header-viewed:hover{color:var(--review-text)}.review-header-viewed input{accent-color:var(--review-accent);cursor:pointer;width:14px;height:14px;margin:0}.review-header-controls{display:inline-flex;vertical-align:middle;align-items: center;gap:5px;min-height:28px;margin-left:7px;line-height:1}.review-header-uncommitted{display:inline-flex;color:var(--buncss-light,#8a510e)var(--buncss-dark,#efbd7b);white-space:nowrap;background:var(--buncss-light,#a861161f)var(--buncss-dark,#d49a521f);border:1px solid var(--buncss-light,#a861168c)var(--buncss-dark,#d49a528c);border-radius:999px;align-items: center;gap:4px;height:20px;padding:0 6px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8px}.review-header-uncommitted>svg{fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;width:11px;height:11px}.review-header-comment{display:inline-grid;color:var(--review-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:5px;place-items: center;width:26px;height:26px;padding:0}.review-header-comment:hover{border-color:var(--review-border);color:var(--review-accent);background:#e3a65d17}.review-header-agent{color:#8eb4ff}.review-header-agent:hover{color:#b7d0ff;background:#7aa8ff1a;border-color:#7aa8ff57}.review-header-comment svg{width:16px;height:16px}.review-sidebar-tabs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:1px solid #ffffff0e;gap:1px;padding:5px 3px}.review-sidebar-tabs button{display:inline-flex;color:var(--review-subtle);cursor:pointer;white-space:nowrap;overflow:hidden;background:0 0;border:1px solid #0000;border-radius:5px;justify-content:center;align-items: center;gap:3px;min-width:0;height:27px;padding:0 3px;font-size:10px;font-weight:550}.review-sidebar-tabs button:focus-visible{outline:1px solid var(--review-accent);outline-offset:-2px}.review-sidebar-tabs button svg{width:13px;height:13px}.review-sidebar-tabs button:hover,.review-sidebar-tabs button.is-active{border-color:var(--review-border);color:var(--review-text);background:#ffffff12}.review-sidebar-tabs button.is-active{color:var(--review-accent)}.review-sidebar-tabs button small{color:var(--review-muted);font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}@container review-sidebar (width<=265px){.review-sidebar-tabs button{gap:4px}.review-sidebar-tab-label{display:none}}@container review-sidebar (width<=245px){.review-filter-uncommitted-label{display:none}}.review-comments-sidebar-wrap{overflow:hidden;flex:1;min-height:0}.review-comments-list{overflow:auto;scrollbar-color:#3c4543 transparent;scrollbar-width:thin;height:100%;padding:8px 8px 12px}.review-comment-list-row{position:relative;display:flex;border:1px solid var(--review-border);background:#ffffff06;border-radius:6px;margin-bottom:5px}.review-comment-list-row.is-active{background:#e3a65d14;border-color:#e3a65d8c}.review-comment-list-main{display:grid;color:var(--review-text);cursor:pointer;text-align:left;background:0 0;border:0;flex:1;gap:3px;min-width:0;padding:8px 7px 8px 9px}.review-comment-list-main:hover{background:#ffffff09}.review-comment-location{overflow:hidden;color:var(--review-blue);text-overflow:ellipsis;white-space:nowrap;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.review-comment-preview{display:-webkit-box;overflow:hidden;color:var(--review-text);-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:10px;line-height:1.35}.review-comment-agent-badge{color:var(--review-blue);text-transform:uppercase;border:1px solid #7aa8ff4d;border-radius:3px;width:-moz-fit-content;width:fit-content;padding:1px 4px;font-size:8px}.review-comment-list-actions{display:flex;align-items: flex-start;gap:1px;padding:6px 4px 0 0}.review-comment-list-actions button{color:var(--review-subtle);cursor:pointer;background:0 0;border:0;border-radius:3px;padding:2px 3px;font-size:9px}.review-comment-list-actions button:hover{color:var(--review-text);background:#ffffff14}.review-agent-list-row{position:relative;display:flex;border:1px solid var(--review-border);background:#ffffff06;border-radius:6px;margin-bottom:5px}.review-agent-list-row.is-active{background:#7aa8ff14;border-color:#7aa8ff8c}.review-agent-list-main{display:flex;color:var(--review-text);cursor:pointer;text-align:left;background:0 0;border:0;flex:1;align-items: center;gap:8px;min-width:0;padding:8px 7px 8px 9px}.review-agent-list-main:hover{background:#ffffff09}.review-agent-list-icon{color:var(--review-blue);flex:none}.review-agent-list-status{color:var(--review-muted);flex:none;font-size:9px}.review-agent-list-status.is-running{color:var(--review-blue)}.review-agent-list-delete{color:var(--review-subtle);cursor:pointer;background:0 0;border:0;border-radius:3px;align-self: flex-start;margin:6px 4px 0 0;padding:2px 4px;font-size:11px}.review-agent-list-delete:hover{color:var(--review-delete);background:#f0797914}.review-comments-empty{display:grid;color:var(--review-muted);text-align:center;align-content: center;height:100%;padding:24px;font-size:11px;line-height:1.6}.review-comments-empty span{color:var(--review-subtle);font-size:10px}.review-comment-card{overflow:visible;color:var(--review-text);background:#181c1d;border:1px solid #ffffff21;border-radius:7px;width:min(640px,100% - 22px);margin:7px 10px 9px;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;box-shadow:0 4px 14px #0003}.review-agent-prompt-composer{background:linear-gradient(135deg,#7aa8ff14,#0000 42%),#161b1f;border-color:#7aa8ff47;width:min(720px,100% - 22px);padding:12px;box-shadow:0 8px 26px #0000004d}.review-agent-prompt-heading{display:flex;align-items: center;gap:7px;min-width:0;margin-bottom:10px}.review-agent-prompt-heading strong{color:#dbe8ff;flex:none;font-size:11px;font-weight:650}.review-agent-prompt-heading small{overflow:hidden;color:var(--review-subtle);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.review-agent-prompt-mark{display:inline-grid;color:#a9c7ff;background:#7aa8ff1a;border:1px solid #7aa8ff61;border-radius:6px;flex:none;place-items: center;width:22px;height:22px;font-size:12px}.review-agent-prompt-composer textarea{display:block;resize:vertical;outline:none;color:var(--review-text);background:#05090d7a;border:1px solid #7aa8ff33;border-radius:7px;width:100%;min-height:86px;padding:10px 11px;font:11px/1.5 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}.review-agent-prompt-composer textarea:focus{border-color:#7aa8ff9e;box-shadow:0 0 0 2px #7aa8ff17}.review-agent-prompt-footer{display:flex;justify-content:space-between;align-items: end;gap:12px;margin-top:10px}.review-agent-prompt-options,.review-agent-prompt-actions{display:flex;align-items: end;gap:7px}.review-agent-prompt-options label{display:grid;color:var(--review-subtle);letter-spacing:.05em;text-transform:uppercase;gap:4px;font-size:8px;font-weight:650}.review-agent-prompt-options select{border:1px solid var(--review-border);outline:none;color:var(--review-text);background:#171c20;border-radius:5px;height:27px;padding:3px 25px 3px 8px;font-size:10px}.review-agent-prompt-options label:first-child select{min-width:170px}.review-agent-prompt-options label:nth-child(2) select{min-width:104px}.review-agent-prompt-options select:focus{border-color:#7aa8ff94}.review-agent-prompt-options .review-agent-fast-option{display:flex;border:1px solid var(--review-border);color:var(--review-muted);cursor:pointer;letter-spacing:0;text-transform:none;background:#0000001f;border-radius:5px;align-self: end;align-items: center;gap:6px;height:27px;padding:0 7px;font-size:9px}.review-agent-fast-option input{accent-color:var(--review-blue);width:12px;height:12px;margin:0}.review-agent-fast-option:has(input:checked){color:var(--review-blue);background:#7aa8ff14;border-color:#7aa8ff7a}@media (max-width:760px){.review-agent-prompt-footer{flex-direction:column;align-items:stretch}.review-agent-prompt-actions{justify-content:flex-end}}.review-comment-composer{padding:10px}.review-comment-composer-heading{display:flex;color:var(--review-muted);align-items: center;gap:7px;margin-bottom:7px;font-size:10px}.review-comment-avatar{display:inline-grid;color:#f4d4a8;text-transform:uppercase;background:#e3a65d21;border:1px solid #e3a65d80;border-radius:50%;flex:none;place-items: center;width:22px;height:22px;font-size:7px;font-weight:700}.review-comment-target{color:var(--review-muted)}.review-comment-composer textarea,.review-comment-expanded textarea,.review-agent-composer textarea{display:block;resize:vertical;border:1px solid var(--review-border);outline:none;color:var(--review-text);background:#0003;border-radius:5px;width:100%;min-height:54px;padding:8px 9px;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:11px;line-height:1.45}.review-comment-composer textarea:focus,.review-comment-expanded textarea:focus,.review-agent-composer textarea:focus{border-color:#e3a65d9e}.review-comment-composer-actions,.review-comment-inline-actions,.review-agent-composer-actions{display:flex;justify-content:flex-end;align-items: center;gap:5px;margin-top:7px}.review-button{cursor:pointer;border:1px solid #0000;border-radius:4px;min-height:24px;padding:3px 8px;font-size:10px;font-weight:600}.review-button:disabled{cursor:default;opacity:.45}.review-button-muted{border-color:var(--review-border);color:var(--review-muted);background:#ffffff09}.review-button-muted:hover:not(:disabled){color:var(--review-text);background:#ffffff14}.review-button-primary{color:#1a1410;background:var(--review-accent);border-color:#e3a65d94}.review-button-primary:hover:not(:disabled){background:#efb775}.review-button-danger{color:#f2a5a5;background:#f079790f;border-color:#f079794d}.review-button-agent{color:#b7d0ff;background:#7aa8ff1a;border-color:#7aa8ff73}.review-button-agent:hover:not(:disabled){background:#7aa8ff2e}.review-comment-shortcut-hint{display:block;color:var(--review-subtle);text-align:right;margin-top:6px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8px}.review-comment-annotation{margin-top:5px;margin-bottom:8px}.review-comment-annotation.is-expanded{border-color:#e3a65d57}.review-comment-summary{display:flex;color:var(--review-text);cursor:pointer;text-align:left;background:0 0;border:0;align-items: center;gap:8px;width:100%;min-height:42px;padding:7px 9px}.review-comment-summary:hover{background:#ffffff09}.review-comment-annotation.is-expanded .review-comment-summary{background:#e3a65d0b;border-bottom:1px solid #e3a65d38;min-height:36px}.review-comment-annotation.is-expanded .review-comment-preview{display:none}.review-comment-annotation.is-expanded .review-comment-location{color:#a8c8ff;font-weight:650}.review-comment-summary-body{display:grid;flex:1;gap:2px;min-width:0}.review-comment-chevron{color:var(--review-subtle);font-size:12px}.review-comment-expanded{padding:10px 10px 10px 39px}.review-comment-body{color:var(--review-text);white-space:pre-wrap;margin:0;font-size:11px;line-height:1.5}.review-comment-inline-actions{justify-content:flex-start}.review-agent-launcher{display:inline-flex;flex-wrap:wrap;align-items: center;gap:4px}.review-agent-select-label select{border:1px solid var(--review-border);color:var(--review-muted);background:#00000029;border-radius:4px;max-width:130px;height:24px;padding:2px 5px;font-size:9px}.review-agent-error{color:var(--review-delete);font-size:9px}.review-agent-empty{padding-top:8px}.review-agent-chat{overflow:hidden;background:#060c1347;border:1px solid #7aa8ff2e;border-radius:5px;margin-top:14px;padding-top:0}.review-agent-chat-heading{display:flex;color:var(--review-blue);letter-spacing:.06em;text-transform:uppercase;background:#7aa8ff11;border-bottom:1px solid #7aa8ff2e;justify-content:space-between;align-items: center;min-height:32px;margin-bottom:0;padding:0 10px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px}.review-agent-session-status{color:var(--review-add)}.review-agent-messages{display:grid;overflow:auto;gap:8px;max-height:280px;padding:10px}.review-agent-message{background:#7aa8ff0e;border-left:2px solid #7aa8ff75;border-radius:2px;width:min(88%,620px);padding:7px 9px}.review-agent-message.is-user{text-align:right;background:#e3a65d1b;border-left:0;border-right:2px solid #e3a65d94;margin-left:auto}.review-agent-message-role{display:block;color:var(--review-subtle);text-transform:uppercase;margin-bottom:2px;font-size:8px}.review-agent-message p{color:var(--review-text);white-space:pre-wrap;margin:0;font-size:10px;line-height:1.45}.review-agent-message.is-user .review-agent-message-role{color:#e8bd84}.review-agent-working{display:grid;grid-template-columns:8px minmax(0,1fr)auto;color:#b7d0ff;background:linear-gradient(90deg,#7aa8ff1c,#7aa8ff06);border-left:2px solid #7aa8ff9e;align-items: center;gap:9px;margin:0 10px 9px;padding:8px 10px}.review-agent-working-pulse{animation:1.6s ease-out infinite review-agent-pulse;background:#79b8ff;border-radius:50%;width:7px;height:7px;box-shadow:0 0 #79b8ff7a}.review-agent-working-copy{display:grid;gap:1px;min-width:0}.review-agent-working-copy strong{color:#d7e6ff;font-size:10px;font-weight:650}.review-agent-working-copy>span{overflow:hidden;color:var(--review-subtle);text-overflow:ellipsis;white-space:nowrap;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8px}.review-agent-working-dots{display:flex;align-items: center;gap:3px}.review-agent-working-dots i{animation:1.2s ease-in-out infinite review-agent-dot;background:currentColor;border-radius:50%;width:3px;height:3px}.review-agent-working-dots i:nth-child(2){animation-delay:.16s}.review-agent-working-dots i:nth-child(3){animation-delay:.32s}@keyframes review-agent-pulse{70%,to{box-shadow:0 0 0 6px #79b8ff00}}@keyframes review-agent-dot{0%,70%,to{opacity:.28;transform:translateY(0)}35%{opacity:1;transform:translateY(-2px)}}@media (prefers-reduced-motion:reduce){.review-agent-working-pulse,.review-agent-working-dots i{animation:none}}.review-agent-activity{color:var(--review-subtle);margin:0 10px 8px;font-size:9px}.review-agent-activity summary{cursor:pointer}.review-agent-activity ul{margin:4px 0 0;padding-left:17px}.review-agent-composer{border-top:1px solid #7aa8ff1f;margin:0;padding:9px 10px 10px}.review-state{display:flex;color:var(--review-muted);text-align:center;flex-direction:column;justify-content:center;align-items: center;gap:7px;width:min(390px,100% - 40px);height:100%;margin:auto}.review-worker-warning{position:fixed;z-index:30;display:flex;border:1px solid color-mix(in srgb,var(--review-uncommitted)48%,var(--review-border));color:var(--review-text);background:color-mix(in srgb,var(--review-uncommitted)12%,var(--review-panel));border-radius:8px;align-items: center;gap:12px;max-width:min(520px,100vw - 32px);padding:10px 12px;font-size:12px;bottom:16px;right:16px;box-shadow:0 12px 40px #00000047}.review-worker-warning button{border:1px solid var(--review-border);color:inherit;background:var(--review-panel);cursor:pointer;border-radius:6px;flex:none;padding:4px 8px}.review-state strong{color:var(--review-text);font-size:13px;font-weight:600}.review-state>span:not(.review-loader):not(.review-error-mark):not(.review-empty-glyph){color:var(--review-muted);max-width:330px;font-size:11px}.review-loader{border:2px solid #e3a65d2e;border-top-color:var(--review-accent);animation:.7s linear infinite review-spin;border-radius:50%;width:19px;height:19px;margin-bottom:6px}.review-error-mark,.review-empty-glyph{display:grid;color:var(--review-delete);border:1px solid #f0797973;border-radius:50%;place-items: center;width:27px;height:27px;margin-bottom:6px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}.review-empty-glyph{border-color:var(--review-border-strong);color:var(--review-subtle);font-size:17px}.review-state.is-error>span:not(.review-error-mark){overflow-wrap:anywhere;max-width:min(520px,100%)}.review-state.is-error button{color:#f4b3b3;cursor:pointer;background:#f0797914;border:1px solid #f0797961;border-radius:5px;margin-top:8px;padding:5px 10px;font-size:10px}.review-state.is-error button:hover{background:#f0797926}.review-toast{position:absolute;z-index:20;border:1px solid var(--review-border-strong);color:var(--review-text);background:#1d2222;border-radius:6px;max-width:min(420px,100% - 32px);padding:8px 11px;font-family:Berkeley Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;bottom:16px;right:16px;box-shadow:0 9px 30px #00000059}.mobile-only{display:none}.sr-only{position:absolute;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;padding:0}@keyframes review-spin{to{transform:rotate(360deg)}}@media (max-width:1200px){.review-github-identity,.review-repository-context{display:none}}@media (max-width:900px){.review-header{gap:8px;padding-right:8px}.review-brand{min-width:33px}.review-brand-copy,.review-header-meta,.review-stat-files{display:none}.review-ref-form{min-width:0}.review-ref-form input{width:74px}.review-header-stats{gap:5px}.review-header-actions>.review-icon-button:nth-last-child(-n+2){display:none}}@media (max-width:680px){.review-shell{min-height:360px}.review-header{min-height:44px}.review-brand{min-width:28px}.review-ref-form input{width:63px;padding-inline-start:5px;padding-inline-end:5px}.review-header-stats{margin-left:auto;font-size:9px}.review-settings>.review-icon-button,.mobile-only{display:grid}.review-sidebar{position:absolute;z-index:4;max-width:none;inset:0 auto 0 0;transform:translate(0);box-shadow:15px 0 35px #00000052;width:min(88vw,340px)!important}.review-sidebar.is-hidden{transform:translate(-102%);width:min(88vw,340px)!important}.review-resize-handle{display:none}}@media (prefers-reduced-motion:reduce){.review-shell *,.review-shell *:before,.review-shell *:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}