ur-agent 1.36.1 → 1.37.1

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.
@@ -44,6 +44,7 @@ Provider configuration commands:
44
44
  ur provider list
45
45
  ur provider doctor
46
46
  ur provider status
47
+ ur provider models [provider] --json
47
48
  ur config set provider ollama
48
49
  ur config set provider openai-api
49
50
  ur config set provider anthropic-api
@@ -53,6 +54,7 @@ ur config set provider openai-compatible
53
54
  ur provider doctor agy
54
55
  ur config set provider.fallback ollama
55
56
  ur config set model <model>
57
+ ur provider select-model <provider> <model> --json
56
58
  ur config set base_url <url>
57
59
  ```
58
60
 
package/docs/IDE.md CHANGED
@@ -1,44 +1,63 @@
1
1
  # IDE Integration
2
2
 
3
- UR integrates with editors through three mechanisms, chosen per editor and stated
4
- honestly nothing claims support it does not have:
5
-
6
- - **Native extension** a UR extension/plugin runs inside the editor (VS Code
7
- family, JetBrains). UR connects to it via the `/ide` flow.
8
- - **Stdio ACP** the editor launches UR as an [Agent Client Protocol](ACP.md)
9
- agent over stdio (`ur acp stdio`). Used by Zed and ACP-capable Neovim clients.
3
+ UR's professional IDE integration is the **UR Inline Diffs** VS Code extension,
4
+ bundled in this repository (`extensions/vscode-ur-inline-diffs`). It gives VS
5
+ Code, Cursor, and Windsurf a chat panel, inline diff review, an actions panel,
6
+ an agent status card, a searchable command palette, and an agent options
7
+ panel all driven by the same `ur` CLI you already use from a terminal, with
8
+ no separate server process and no new network surface.
9
+
10
+ Other editors connect through different mechanisms, chosen per editor and
11
+ stated honestly — nothing here claims support that does not exist:
12
+
13
+ - **VS Code extension** — the professional integration described in full
14
+ below. Ships to VS Code, Cursor, and Windsurf (one extension; Cursor and
15
+ Windsurf are VS Code forks). This is the integration everything else on
16
+ this page is compared against.
17
+ - **Stdio ACP** (`ur acp stdio`) — the real, spec-compliant
18
+ [Agent Client Protocol](ACP.md) over stdio, used by Zed and ACP-capable
19
+ Neovim clients. This remains a separate transport from the VS Code
20
+ extension's chat bridge below; the two are independent and neither depends
21
+ on the other.
10
22
  - **Manual** — no auto-config; install a plugin and connect via `/ide`.
23
+ **JetBrains is not implemented in this repository.** UR can detect whether
24
+ a plugin named `ur-jetbrains-plugin` is installed
25
+ (`src/utils/jetbrains.ts`), but this repo does not build, ship, or publish
26
+ that plugin. Nothing in this document should be read as "install our
27
+ JetBrains plugin today" — there isn't one yet.
11
28
 
12
29
  ## Supported targets
13
30
 
14
- | Editor | Mechanism | Auto config | Apply/reject | Notes |
15
- | --- | --- | --- | --- | --- |
16
- | VS Code | native extension | `.vscode/settings.json` | via UR extension | Install the UR Inline Diffs extension. |
17
- | Cursor | native extension (VS Code fork) | `.vscode/settings.json` | via UR extension | Same extension as VS Code. |
18
- | Windsurf | native extension (VS Code fork) | `.vscode/settings.json` | via UR extension | Same extension as VS Code. |
19
- | Zed | stdio ACP | `.zed/settings.json` | in-editor (ACP) | Real Agent Client Protocol over stdio. |
20
- | JetBrains | manual plugin | none | via plugin | Install the UR JetBrains plugin, then `/ide`. |
21
- | Neovim | stdio ACP | snippet | client-dependent | Requires a third-party ACP client plugin. |
22
- | Generic ACP | stdio ACP / HTTP | snippet | client-dependent | `ur acp stdio` (native ACP) or `ur acp serve` (HTTP JSON-RPC). |
31
+ | Editor | Mechanism | Auto config | Notes |
32
+ | --- | --- | --- | --- |
33
+ | VS Code | UR Inline Diffs extension | `.vscode/settings.json` | Full chat, diff, actions, status, and search integration see below. |
34
+ | Cursor | UR Inline Diffs extension (VS Code fork) | `.vscode/settings.json` | Same extension as VS Code. |
35
+ | Windsurf | UR Inline Diffs extension (VS Code fork) | `.vscode/settings.json` | Same extension as VS Code. |
36
+ | Zed | stdio ACP | `.zed/settings.json` | Real Agent Client Protocol over stdio. |
37
+ | JetBrains | not implemented | none | Detection code exists; no plugin ships from this repo. Use the CLI directly in the meantime. |
38
+ | Neovim | stdio ACP | snippet | Requires a third-party ACP client plugin. |
39
+ | Generic ACP | stdio ACP / HTTP | snippet | `ur acp stdio` (native ACP) or `ur acp serve` (HTTP JSON-RPC; not a streaming transport — see Known limitations). |
23
40
 
24
41
  ## Commands
25
42
 
26
43
  ```sh
27
- ur ide status # workspace, ACP server, provider/model, plugin count, warnings
28
- ur ide doctor # pass/warn/fail checks; reports missing config clearly
29
- ur ide config <editor> # print setup + config snippet for the chosen editor
30
- ur ide open # open the current project/worktree in a detected IDE
31
- ur ide diff capture # capture the current diff as a review bundle
32
- ur ide diff list|show <id> # inspect captured bundles
44
+ ur ide status # workspace, ACP server, provider/model, sandbox/verifier mode, plugin count, warnings
45
+ ur ide doctor # pass/warn/fail checks; reports missing config clearly
46
+ ur ide config <editor> # print setup + config snippet for the chosen editor
47
+ ur ide open # open the current project/worktree in a detected IDE
48
+ ur ide diff capture # capture the current diff as a review bundle
49
+ ur ide diff list|show <id> # inspect captured bundles
33
50
  ur ide diff approve|reject <id>
34
51
  ```
35
52
 
36
53
  `ur ide config` targets: `vscode`, `cursor`, `windsurf`, `zed`, `jetbrains`,
37
54
  `neovim`, `generic-acp` (aliases like `nvim`, `intellij`, `code` also resolve).
38
55
 
39
- `ur ide status` reports the active workspace, whether the ACP server is running
40
- and on which port, the active provider/model and runtime backend, the number of
41
- loaded plugins, and any warnings. Add `--json` for machine-readable output.
56
+ `ur ide status` reports the active workspace, whether the ACP server is
57
+ running and on which port, the active provider/model and runtime backend,
58
+ sandbox mode, verifier mode, the number of loaded plugins, and any warnings.
59
+ Add `--json` for machine-readable output — this is the same JSON surface the
60
+ VS Code extension's status card and actions panel read from.
42
61
 
43
62
  ## Patch / diff workflow
44
63
 
@@ -47,23 +66,154 @@ under `.ur/ide/diffs/` (`ur ide diff capture`), then previewed and explicitly
47
66
  applied or rejected:
48
67
 
49
68
  - **CLI:** `ur ide diff show <id>`, `ur ide diff approve <id>`, `ur ide diff reject <id>`.
50
- - **VS Code:** the UR Inline Diffs view lists bundles; right-click a bundle to
51
- Open (preview), Apply (`git apply`, with a confirmation prompt), Reject, or
52
- Comment. Applying is always an explicit, confirmed action.
69
+ - **VS Code:** the **Inline Diffs** view (and the **Actions** view they show
70
+ the same bundles) lists bundles; right-click one to Open (preview), Apply,
71
+ Reject, or Comment. Apply asks for confirmation, runs `git apply`, then
72
+ records the approval through `ur ide diff approve` — the same command the
73
+ terminal workflow uses, so the status VS Code shows always matches what
74
+ `ur ide diff list` reports. The extension never writes a diff status value
75
+ the CLI does not recognize.
53
76
 
54
77
  ## VS Code extension
55
78
 
56
- The bundled `UR Inline Diffs` extension (`extensions/vscode-ur-inline-diffs`)
57
- provides:
79
+ The bundled **UR Inline Diffs** extension is the professional IDE integration
80
+ for VS Code, Cursor, and Windsurf. It adds a UR container to the Activity Bar
81
+ with three views, **Chat**, **Inline Diffs**, and **Actions**, plus a chat
82
+ panel, a status card, an agent options panel, a provider/model picker, and a
83
+ searchable command palette.
84
+
85
+ Install it with `ur ide install` (offers the bundled VSIX) or from the
86
+ packaged `.vsix`. The extension is bundled inside this repository and
87
+ packaged as a local VSIX when installed from UR-AGENT; the public install
88
+ path does not depend on an unpublished marketplace extension ID. Every
89
+ feature below requires the UR CLI on your `PATH` — the extension calls `ur`
90
+ as a local subprocess and never talks to a model provider or network service
91
+ directly.
92
+
93
+ ### Chat panel
58
94
 
59
- - a tree view of captured diff bundles;
60
- - a read-only webview preview of each patch and its comments;
61
- - **Apply** (confirmed `git apply`) and **Reject** actions;
62
- - **UR: Show Status**, which runs `ur ide status` and prints provider/model and
63
- plugin information to the UR output channel.
95
+ **UR: New Chat** and **UR: Open Chat** open a chat panel that streams
96
+ responses over the same headless contract the CLI itself uses for scripted
97
+ runs:
98
+
99
+ ```
100
+ ur -p --output-format stream-json --verbose --permission-prompt-tool stdio [--resume <id>] "<prompt>"
101
+ ```
64
102
 
65
- Install it with `ur ide install` (offers the bundled VSIX) or from the packaged
66
- `.vsix`. Apply/reject and status require the UR CLI on your `PATH`.
103
+ Output is NDJSON one JSON object per line. Assistant text and tool-use/
104
+ tool-result blocks render as they arrive; nothing is buffered and dumped only
105
+ at the end. If the underlying `ur` process exits with an error, the panel
106
+ shows an error banner — it never fabricates a success message when the run
107
+ failed.
108
+
109
+ The **Chat** view in the UR sidebar exposes **New Chat**, **Open Chat**,
110
+ **Search Actions**, **Pick Model**, and editor-context actions when an editor
111
+ or selection is available. **UR: Pick Model** uses the provider-first model
112
+ catalog from the CLI and saves the selected provider/model pair through the
113
+ same validation path as `/model`.
114
+
115
+ **Permission prompts.** When a turn wants to use a tool that needs approval,
116
+ UR emits a `control_request` message in the same stream. The chat panel shows
117
+ an inline Allow/Deny prompt and writes the decision back as a
118
+ `control_response` on the child process's stdin. The default posture is to
119
+ ask, not to silently auto-approve; canceling a request denies it safely
120
+ rather than leaving it hanging.
121
+
122
+ **Session persistence.** Each chat is a session persisted under
123
+ `.ur/ide/chat/` in the workspace (a manifest plus one file per session).
124
+ **UR: Open Chat** can resume a previous session — using the CLI's own
125
+ `--resume` — or start a new one; sessions survive closing and reopening VS
126
+ Code.
127
+
128
+ **File and selection context.** **UR: Add Current File to Chat** and
129
+ **UR: Add Selection to Chat** attach the active file or selection as explicit
130
+ context. Nothing is sent to UR until one of these actions is taken or a
131
+ message is sent — the extension never silently uploads file content in the
132
+ background.
133
+
134
+ **Editor actions.** **UR: Explain Selection**, **UR: Fix Selection**, and
135
+ **UR: Generate Tests for Selection** (also on the editor right-click menu)
136
+ open the same chat panel with a structured prompt built from the current
137
+ selection. There is no separate backend path for these — they reuse the chat
138
+ pathway above.
139
+
140
+ ### Actions panel
141
+
142
+ The **Actions** view lists diff bundles from `.ur/ide/diffs/` and background
143
+ tasks (`ur bg list --json`) together in one place, with its own refresh
144
+ button and a clear empty state when there is nothing captured yet. Diff rows
145
+ support the same Open/Apply/Reject/Comment actions as the Inline Diffs view
146
+ (routed through the CLI, as described above). Background task rows are
147
+ read-only in this release — click one to open its log file; starting or
148
+ canceling a task from the panel is not implemented yet, use
149
+ `ur bg run|kill` from a terminal.
150
+
151
+ ### Agent status card
152
+
153
+ **UR: Agent Status** opens a panel assembled from `ur ide status --json` and
154
+ `ur provider status --json`: UR version, workspace root, provider, model,
155
+ provider kind (UR-native, subscription CLI, or subscription placeholder),
156
+ native tool-call support, native streaming support, multimodal support, the
157
+ active provider's safety-boundary description, sandbox mode, verifier mode,
158
+ ACP status, plugin count, and warnings, with a refresh button. Any field the
159
+ CLI does not report renders as the literal word **unknown** — never a guess.
160
+
161
+ ### Search actions
162
+
163
+ **UR: Search Actions** is a single searchable palette covering every stable
164
+ action the extension exposes: New Chat, Open Chat, Explain Selection, Fix
165
+ Selection, Generate Tests, Review Current Diff, Run Verifier, Provider
166
+ Status, Agent Status, Agent Options, Open Settings, Open Docs, Open
167
+ Artifacts, Run Spec, Run Workflow, and Refresh IDE Actions.
168
+
169
+ ### Agent options panel
170
+
171
+ **UR: Agent Options** shows recommendations for privacy, speed, multimodal
172
+ support, tool calling, native streaming, subscription CLI access, local/
173
+ offline use, complex refactors, and docs/review work. **This panel is built
174
+ from local, curated data and the UR CLI's own provider registry
175
+ (`ur provider list --json`) only — it is not live market research and does
176
+ not rank model quality.** Every provider is labeled by kind (UR-native,
177
+ subscription CLI, local, or API), and a capability renders as **unknown**
178
+ rather than a guess whenever the CLI does not expose it — for example,
179
+ multimodal support for local/self-hosted models, which depends on whichever
180
+ model happens to be loaded rather than being a fixed provider fact.
181
+
182
+ ### Review Current Diff and Run Verifier
183
+
184
+ **UR: Review Current Diff** reads the current `git diff` directly through a
185
+ safe subprocess call (no shell interpolation), asks for confirmation before
186
+ sending a large diff, then opens chat with a structured review prompt — the
187
+ diff is never sent without that explicit action.
188
+
189
+ **UR: Run Verifier** opens chat and asks UR to run its real verification
190
+ subagent (the same mechanism behind the `/verify` prompt command) and report
191
+ a verdict. There is no standalone `ur verify` CLI command today, so this
192
+ always goes through chat rather than a direct CLI call; if the underlying
193
+ `ur` process fails, the panel shows the failure clearly and never reports a
194
+ success it did not observe.
195
+
196
+ ## Known limitations
197
+
198
+ - **JetBrains is not implemented.** No JetBrains plugin ships from this
199
+ repository; see "Supported targets" above.
200
+ - **The lockfile/MCP IDE bridge is Phase 2 and not part of this MVP.** The
201
+ CLI already implements the *client* half of a lockfile-discovered MCP
202
+ connection to a running IDE (`src/utils/ide.ts`), used by the terminal
203
+ `/ide` connect flow for live diagnostics and native diff tabs from a
204
+ terminal-hosted `ur` session. The VS Code extension's chat panel does not
205
+ use this bridge — it talks to UR entirely through the `stream-json`
206
+ subprocess contract described above.
207
+ - **The ACP HTTP server (`ur acp serve`) is not the VS Code chat streaming
208
+ transport.** It is a separate, non-streaming JSON-RPC endpoint intended for
209
+ scripts and other clients; the VS Code extension does not route chat
210
+ through it, and `ur acp stdio` (used by Zed and ACP Neovim clients) is
211
+ unaffected by any of the VS Code work described here.
212
+ - **Background task actions are read-only** in the Actions panel — no start
213
+ or cancel from the panel yet.
214
+ - **Run Spec / Run Workflow** open chat with a prompt asking UR to list and
215
+ run the relevant items, rather than shelling out directly — `ur spec` and
216
+ `ur workflow` are full agentic commands, not one-shot JSON lookups.
67
217
 
68
218
  ## Troubleshooting
69
219
 
@@ -75,3 +225,6 @@ Install it with `ur ide install` (offers the bundled VSIX) or from the packaged
75
225
  `agent_servers.UR` block from `ur ide config zed`, then reload Zed.
76
226
  - **Apply fails in VS Code:** the patch may not match the current tree; re-capture
77
227
  with `ur ide diff capture`.
228
+ - **Chat panel shows an error banner:** the underlying `ur` process failed or
229
+ exited non-zero; check that the UR CLI is on your `PATH` and that a
230
+ provider/model is configured (`ur provider status`).
package/docs/providers.md CHANGED
@@ -88,6 +88,7 @@ ur provider status
88
88
  ur provider doctor
89
89
  ur provider doctor codex-cli
90
90
  ur provider doctor agy
91
+ ur provider models [provider] --json
91
92
  # Subscription CLI logins (official vendor CLIs):
92
93
  ur auth chatgpt
93
94
  ur auth claude
@@ -100,6 +101,7 @@ ur config set provider gemini-api
100
101
  ur config set provider openrouter
101
102
  ur config set provider openai-compatible
102
103
  ur config set model <model>
104
+ ur provider select-model <provider> <model> --json
103
105
  ur config set base_url <url>
104
106
  ur config set provider.fallback ollama
105
107
  ```
@@ -44,7 +44,7 @@
44
44
  <main id="content" class="content">
45
45
  <header class="topbar">
46
46
  <div>
47
- <p class="eyebrow">Version 1.36.1</p>
47
+ <p class="eyebrow">Version 1.37.0</p>
48
48
  <h1>UR-AGENT Documentation</h1>
49
49
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-AGENT.</p>
50
50
  </div>
@@ -159,7 +159,7 @@ ur config set provider.fallback ollama</code></pre>
159
159
  </article>
160
160
  <article>
161
161
  <h3>Status bar and updates</h3>
162
- <pre><code>Ollama | llama3 | ask | main | update 1.36.1 available</code></pre>
162
+ <pre><code>Ollama | llama3 | ask | main | update 1.37.0 available</code></pre>
163
163
  <p>The interactive status bar shows only important runtime state: provider, model, mode, branch, active tasks, checks status when known, and update availability. It is hidden in CI, dumb terminals, and non-interactive mode.</p>
164
164
  </article>
165
165
  </div>
@@ -1,12 +1,48 @@
1
1
  # UR Inline Diffs for VS Code
2
2
 
3
- Native VS Code surface for UR inline diff bundles.
3
+ The professional UR IDE integration for VS Code, Cursor, and Windsurf: chat,
4
+ inline diff review, an actions panel, an agent status card, a searchable
5
+ command palette, a provider/model picker, and an agent options panel — all
6
+ backed by the `ur` CLI already on your machine.
4
7
 
5
8
  UR-AGENT packages this extension from the repository as a local VSIX when the
6
9
  CLI installs the public IDE integration. It does not depend on an unpublished
7
10
  marketplace extension ID.
8
11
 
9
- ## Workflow
12
+ The extension never talks to a model provider or network service directly —
13
+ every AI request goes through your local `ur` CLI, the same way `ur` behaves
14
+ in a terminal. Everything below requires the UR CLI on your `PATH`.
15
+
16
+ ## Chat
17
+
18
+ The UR Activity Bar contains a **Chat** view with visible buttons for **New
19
+ Chat**, **Open Chat**, **Pick Model**, and editor-context actions when a file
20
+ or selection is active. You do not need to know command palette commands to
21
+ start a conversation.
22
+
23
+ **UR: New Chat** / **UR: Open Chat** open a chat panel that streams UR's
24
+ response as it's generated, over the same NDJSON `stream-json` contract the
25
+ CLI uses for scripted runs. Tool calls, tool results, and permission prompts
26
+ (`control_request`/`control_response`) render inline as they arrive; nothing
27
+ is buffered and shown only at the end, and a failed run shows an error
28
+ banner rather than a fabricated success message.
29
+
30
+ Each chat is a session persisted under `.ur/ide/chat/` in the workspace, so
31
+ sessions survive closing and reopening VS Code and can be resumed (via the
32
+ CLI's own `--resume`) from **UR: Open Chat**.
33
+
34
+ **UR: Add Current File to Chat** and **UR: Add Selection to Chat** attach
35
+ context explicitly — nothing is sent to UR until you take one of those
36
+ actions or send a message. **UR: Explain Selection**, **UR: Fix Selection**,
37
+ and **UR: Generate Tests for Selection** (also on the editor right-click
38
+ menu) open the same chat panel with a structured prompt built from the
39
+ current selection; they are not a separate code path from chat.
40
+
41
+ **UR: Pick Model** opens a provider-first picker, then a model picker scoped to
42
+ that provider. Saving the choice goes through the same provider/model
43
+ validation as `/model`.
44
+
45
+ ## Inline diffs and actions panel
10
46
 
11
47
  Create a bundle from the UR CLI:
12
48
 
@@ -14,14 +50,49 @@ Create a bundle from the UR CLI:
14
50
  ur ide diff capture --title "Parser fix"
15
51
  ```
16
52
 
17
- Open VS Code in the same workspace. The UR activity-bar view lists bundles from
18
- `.ur/ide/diffs/manifest.json`.
53
+ The **Inline Diffs** view lists bundles from `.ur/ide/diffs/manifest.json`.
54
+ A second view, **Actions**, shows the same diff bundles alongside background
55
+ tasks (`ur bg list`) in one place. Supported actions on a diff bundle:
56
+
57
+ - refresh the bundle list;
58
+ - open a patch preview with metadata and comments;
59
+ - **Apply** — asks for confirmation, runs `git apply`, then records the
60
+ approval through `ur ide diff approve` (never a status value the CLI
61
+ doesn't recognize);
62
+ - **Reject**, via `ur ide diff reject`;
63
+ - add a comment that writes back through `ur ide diff comment`.
64
+
65
+ Background task rows in the Actions panel are read-only for now — click one
66
+ to open its log file.
67
+
68
+ ## Status and options
69
+
70
+ **UR: Agent Status** shows UR version, workspace root, provider, model,
71
+ provider kind, native tool-call/streaming support, multimodal support,
72
+ sandbox mode, verifier mode, ACP status, plugin count, and warnings, built
73
+ from `ur ide status --json` and `ur provider status --json`. Anything the
74
+ CLI doesn't report shows as **unknown**, not a guess.
75
+
76
+ **UR: Agent Options** shows recommendations for privacy, speed, multimodal,
77
+ tool calling, native streaming, subscription CLI access, local/offline use,
78
+ complex refactors, and docs/review, built from `ur provider list --json`
79
+ plus a small local, curated table. It is not live market research and does
80
+ not rank model quality; it labels each provider's kind (UR-native,
81
+ subscription CLI, local, or API) and uses **unknown** wherever a capability
82
+ isn't known rather than guessing.
83
+
84
+ ## Search
85
+
86
+ **UR: Search Actions** is one searchable palette for every stable action the
87
+ extension exposes — chat, selection actions, diff review, the verifier, and
88
+ the status/options panels — instead of hunting through the command palette.
19
89
 
20
- Supported actions:
90
+ ## Review and verify
21
91
 
22
- - refresh the bundle list
23
- - open a patch preview with metadata and comments
24
- - add a comment that writes back to the UR metadata and manifest
92
+ **UR: Review Current Diff** reads your current `git diff`, confirms before
93
+ sending anything large, and opens chat with a structured review prompt.
25
94
 
26
- The extension is local-only. It reads and writes files under the current
27
- workspace and does not call any model provider or network service.
95
+ **UR: Run Verifier** opens chat and asks UR to run its verification subagent
96
+ and report a verdict; there is no standalone verifier CLI command today, so
97
+ this always goes through chat, and a failed run is always shown as a
98
+ failure, never a false success.
@@ -1,5 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="UR">
2
- <rect width="64" height="64" rx="12" fill="#161616"/>
3
- <path d="M16 16v18c0 9 6 15 16 15s16-6 16-15V16h-8v18c0 5-3 8-8 8s-8-3-8-8V16h-8z" fill="#f5f5f5"/>
4
- <path d="M36 16h12v8h-7v7h-5V16z" fill="#64d2ff"/>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="img" aria-label="UR">
2
+ <path fill="currentColor" d="M4 3h3v10.2c0 2.7 1.8 4.4 5 4.4s5-1.7 5-4.4V3h3v10.2C20 17.6 16.9 21 12 21s-8-3.4-8-7.8V3z"/>
3
+ <path fill="currentColor" d="M13.5 3H20v3h-3.5v3.5h-3V3z"/>
5
4
  </svg>