@workerdeck/ui 2.7.1 → 2.8.0
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 +30 -30
- package/build/{SessionPanel-B5FfiBxE.mjs → SessionPanel-Dg4xf-ql.mjs} +46 -46
- package/build/SessionPanel-Dg4xf-ql.mjs.map +1 -0
- package/build/format.mjs +1 -1
- package/build/index.d.mts +11 -11
- package/build/index.mjs +4 -4
- package/build/index.mjs.map +1 -1
- package/build/scoped.css +2 -2
- package/build/{status-BO9wJloK.mjs → status-kmsBhuFG.mjs} +3 -3
- package/build/status-kmsBhuFG.mjs.map +1 -0
- package/build/workspace.mjs +4 -4
- package/build/workspace.mjs.map +1 -1
- package/package.json +18 -18
- package/src/components/agent/Composer.tsx +2 -2
- package/src/components/agent/ContextDialog.tsx +1 -1
- package/src/components/agent/EntryIcon.tsx +1 -1
- package/src/components/agent/FileTree.tsx +1 -1
- package/src/components/agent/FileViewer.tsx +1 -1
- package/src/components/agent/HostFilesDialog.tsx +2 -2
- package/src/components/agent/PermissionModeSelect.tsx +2 -2
- package/src/components/agent/PermissionPrompt.tsx +2 -2
- package/src/components/agent/SessionBrowser.tsx +1 -1
- package/src/components/agent/SessionItem.tsx +1 -1
- package/src/components/agent/SessionPanel.tsx +2 -2
- package/src/components/agent/SkillsDialog.tsx +3 -3
- package/src/components/agent/StatusBar.tsx +1 -1
- package/src/components/agent/TaskList.tsx +2 -2
- package/src/components/agent/TranscriptRows.tsx +1 -1
- package/src/components/agent/UsageDialog.tsx +1 -1
- package/src/components/agent/use-subagent-frame.ts +2 -2
- package/src/components/agent/use-transcript-jumps.ts +2 -2
- package/src/components/prompt-area/clipboard-helpers.ts +2 -2
- package/src/components/prompt-area/cursor-helpers.ts +7 -7
- package/src/components/prompt-area/dom-helpers.ts +8 -8
- package/src/components/prompt-area/html-to-markdown.ts +2 -2
- package/src/components/prompt-area/prompt-area-engine.ts +4 -4
- package/src/components/prompt-area/prompt-area-list-ops.ts +10 -10
- package/src/components/prompt-area/prompt-area.tsx +2 -2
- package/src/components/prompt-area/trigger-presets.ts +6 -6
- package/src/components/prompt-area/types.ts +6 -6
- package/src/components/prompt-area/use-chip-editing.ts +8 -8
- package/src/components/prompt-area/use-markdown-mode.ts +3 -3
- package/src/components/prompt-area/use-prompt-area-events.ts +3 -3
- package/src/components/prompt-area/use-prompt-area-keydown.ts +3 -3
- package/src/components/prompt-area/use-prompt-area-state.ts +4 -4
- package/src/components/prompt-area/use-prompt-area.ts +5 -5
- package/src/components/prompt-area/use-trigger-search.ts +1 -1
- package/src/components/terminal/PermissionPrompt.tsx +4 -4
- package/src/components/terminal/affordances.tsx +1 -1
- package/src/components/terminal/height.ts +2 -2
- package/src/components/terminal/items.tsx +2 -2
- package/src/components/terminal/scrubber.tsx +1 -1
- package/src/components/terminal/todos.ts +1 -1
- package/src/components/ui/Splitter.tsx +1 -1
- package/src/lib/context-note.ts +3 -3
- package/src/lib/format.ts +2 -2
- package/src/styles/scoped.entry.css +2 -2
- package/src/styles/terminal.css +79 -79
- package/src/styles/theme.css +39 -39
- package/build/SessionPanel-B5FfiBxE.mjs.map +0 -1
- package/build/status-BO9wJloK.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Styled agent-control component library for WorkerDeck hosts: `SessionPanel` (status bar +
|
|
4
4
|
streaming transcript + tool-call cards + permission prompts + composer with attachments and
|
|
5
|
-
`@file` / `/command` completion, plus the panels behind it
|
|
6
|
-
MCP servers, project files), `SessionWorkspace` (a VS Code-shaped layout *around* that panel
|
|
7
|
-
file tree, editor tabs, Monaco
|
|
5
|
+
`@file` / `/command` completion, plus the panels behind it - session info, context, plan usage,
|
|
6
|
+
MCP servers, project files), `SessionWorkspace` (a VS Code-shaped layout *around* that panel -
|
|
7
|
+
file tree, editor tabs, Monaco - at `@workerdeck/ui/workspace`, so Monaco stays out of hosts that
|
|
8
8
|
don't want it), `SessionList`, and the underlying primitives (Button, Badge,
|
|
9
9
|
Card, Select, Dialog, AlertDialog, …). Built on **Tailwind v4 + Base UI + cva**, themed by CSS
|
|
10
10
|
tokens with light/dark via `<html data-theme>`.
|
|
@@ -18,7 +18,7 @@ this package is the styling opinion on top.
|
|
|
18
18
|
|
|
19
19
|
## Consumer wiring (Tailwind v4)
|
|
20
20
|
|
|
21
|
-
The package ships **source styles + source classnames**
|
|
21
|
+
The package ships **source styles + source classnames** - your app's Tailwind build compiles
|
|
22
22
|
them. Three steps:
|
|
23
23
|
|
|
24
24
|
1. Your Tailwind entry CSS:
|
|
@@ -29,7 +29,7 @@ them. Three steps:
|
|
|
29
29
|
/* Let Tailwind see this package's classnames (node_modules is not scanned by default). */
|
|
30
30
|
@source '../node_modules/@workerdeck/ui';
|
|
31
31
|
/* streamdown (the markdown renderer) also styles itself with Tailwind classes, split across
|
|
32
|
-
* chunk files
|
|
32
|
+
* chunk files - scan its whole dist dir. With npm/yarn it's hoisted to node_modules/streamdown;
|
|
33
33
|
* with pnpm it's nested under this package: */
|
|
34
34
|
@source '../node_modules/@workerdeck/ui/node_modules/streamdown/dist';
|
|
35
35
|
```
|
|
@@ -67,11 +67,11 @@ const client = new WorkerDeckClient({ baseUrl: `${location.origin}/v1` })
|
|
|
67
67
|
|
|
68
68
|
### The workspace (optional)
|
|
69
69
|
|
|
70
|
-
`SessionWorkspace` wraps that same panel in a three-region layout
|
|
71
|
-
open files above, agent below
|
|
70
|
+
`SessionWorkspace` wraps that same panel in a three-region layout - project tree on the left,
|
|
71
|
+
open files above, agent below - and is **strictly additive**: `SessionPanel` is untouched and
|
|
72
72
|
still complete on its own, so pick whichever fits. An app with its own file tree keeps the panel.
|
|
73
73
|
|
|
74
|
-
It lives at its **own entry point**, and Monaco is an **optional peer dependency**
|
|
74
|
+
It lives at its **own entry point**, and Monaco is an **optional peer dependency** - install it
|
|
75
75
|
alongside `@workerdeck/ui` if you want the workspace, and skip both if you don't:
|
|
76
76
|
|
|
77
77
|
```sh
|
|
@@ -86,12 +86,12 @@ import { SessionWorkspace } from '@workerdeck/ui/workspace'
|
|
|
86
86
|
|
|
87
87
|
It needs the gateway's host-filesystem routes (`hostFiles` in the server config); without them
|
|
88
88
|
the rail is simply absent and you get the panel. Editing additionally needs `hostFiles.write`,
|
|
89
|
-
which is a separate opt-in and defaults **off**
|
|
89
|
+
which is a separate opt-in and defaults **off** - the editor reads `/fs/roots` and renders
|
|
90
90
|
read-only when it's not enabled. Saves are conditional on the hash the tab read, so a save that
|
|
91
91
|
collides with the agent's own edit is refused (409) and offered as a choice rather than silently
|
|
92
92
|
winning.
|
|
93
93
|
|
|
94
|
-
**If you bundle with Vite, you need one line**
|
|
94
|
+
**If you bundle with Vite, you need one line** - the workspace uses Monaco, which reaches its
|
|
95
95
|
web workers with `new Worker(new URL(…, import.meta.url))`. Rollup resolves that at build time,
|
|
96
96
|
but Vite's dev dep-optimizer rewrites the package into `.vite/deps/` and breaks the relative URL;
|
|
97
97
|
Monaco then *silently* runs worker code on the main thread:
|
|
@@ -103,19 +103,19 @@ export default defineConfig({ optimizeDeps: { exclude: ['monaco-editor'] } })
|
|
|
103
103
|
|
|
104
104
|
Monaco is loaded through a dynamic `import()`, so it costs nothing at runtime until a file is
|
|
105
105
|
opened. Our own dashboard additionally aliases away Monaco's four worker-backed language services
|
|
106
|
-
(TypeScript/JSON/CSS/HTML)
|
|
107
|
-
syntax highlighting unaffected
|
|
106
|
+
(TypeScript/JSON/CSS/HTML) - 8.8MB of build output for IntelliSense and schema validation, with
|
|
107
|
+
syntax highlighting unaffected - see `packages/web/vite.config.ts` if you want the same trade.
|
|
108
108
|
|
|
109
109
|
None of this reaches you through the root entry. That separation is why the workspace has its own
|
|
110
110
|
subpath rather than living in `@workerdeck/ui`: tree-shaking alone is not enough. Rollup does drop
|
|
111
111
|
`CodeEditor` from a `SessionPanel`-only bundle, but Vite resolves Monaco's worker URLs while
|
|
112
|
-
*transforming* the module
|
|
112
|
+
*transforming* the module - before tree-shaking runs - and emits ~9MB of worker assets that are
|
|
113
113
|
never retracted. Keeping Monaco unreachable from the root entry is what actually prevents that.
|
|
114
114
|
|
|
115
115
|
Every component takes `className` and carries `data-slot` attributes for targeted overrides.
|
|
116
116
|
|
|
117
117
|
`SessionPanel` is self-sufficient for errors: a `protocol_error` (the gateway or CLI refusing a
|
|
118
|
-
command
|
|
118
|
+
command - a `set_permission_mode` a provider engine can't run, say) renders as a dismissible strip
|
|
119
119
|
inside the panel. You do **not** need to mount anything else to see them. `Toaster` is exported
|
|
120
120
|
for your own `toast()` calls; the panel never depends on it, because an error channel a host can
|
|
121
121
|
lose by forgetting a second mount isn't one.
|
|
@@ -124,17 +124,17 @@ lose by forgetting a second mount isn't one.
|
|
|
124
124
|
|
|
125
125
|
- Token names are unprefixed (`--bg`, `--accent`, `--primary`, …) and `theme.css` styles
|
|
126
126
|
`body`/focus rings. Embedding into an app with its own conflicting design system may need
|
|
127
|
-
scoping
|
|
127
|
+
scoping - file an issue with your case.
|
|
128
128
|
- Dark mode is driven **only** by `[data-theme='dark']` on the root element (the Tailwind
|
|
129
129
|
`dark:` variant is remapped to it); `prefers-color-scheme` is not consulted at CSS level.
|
|
130
130
|
- The session surface centers its content at `--wd-transcript-max-width` (default `48rem`).
|
|
131
131
|
Embedders in narrow docks (a VS Code bottom panel, a drawer) set it to `100%` for
|
|
132
132
|
edge-to-edge content. Other geometry tokens: `--wd-status-bar-height`, `--wd-composer-padding`,
|
|
133
133
|
`--wd-transcript-row-gap`. Every component also carries `data-slot` attributes for targeted
|
|
134
|
-
overrides
|
|
134
|
+
overrides - e.g. `[data-slot='composer-hint']` is the "Enter to send" line, which a host
|
|
135
135
|
whose vertical space is precious can `display: none`.
|
|
136
136
|
- `SessionPanel` can hand its dialog surfaces to the embedder: `panelSurface: 'external'`
|
|
137
|
-
renders no dialogs and no `⋯` menu
|
|
137
|
+
renders no dialogs and no `⋯` menu - every affordance that would open one calls
|
|
138
138
|
`onOpenPanel(panel)` instead, and `onVitals` streams the live readings (status, context,
|
|
139
139
|
rate limits, capabilities) those external surfaces need, so host chrome never has to
|
|
140
140
|
attach a second time (the tool bridge asks the first attached client). The VS Code
|
|
@@ -142,13 +142,13 @@ lose by forgetting a second mount isn't one.
|
|
|
142
142
|
- `statusSurface: 'external'` is the separate opt-out for the **status bar itself**, for a host
|
|
143
143
|
whose chrome already has a status line (VS Code's window bar): the panel draws no bar and the
|
|
144
144
|
readings leave through `onVitals` as before. The two flags are independent, with one coupling
|
|
145
|
-
|
|
145
|
+
- the `⋯` menu lives in the bar's trailing slot, so `statusSurface: 'external'` alongside
|
|
146
146
|
`panelSurface: 'internal'` must pass a **function** `header` for the menu to land in.
|
|
147
147
|
Whatever draws the bar owes the panel's own rule: `SessionVitals.connection` wins the status
|
|
148
148
|
slot whenever it isn't `'live'`, because a session status held over a dropped socket is a
|
|
149
149
|
stale reading presented as a current one.
|
|
150
150
|
- `@workerdeck/ui/format` is a third entry point carrying the pure formatters (`45.2k`,
|
|
151
|
-
`2h 10m`) with no React in the graph
|
|
151
|
+
`2h 10m`) with no React in the graph - for a host that renders session readings outside
|
|
152
152
|
React, like an extension host drawing them into a window status bar, and wants them spelled
|
|
153
153
|
exactly as the panel spells them.
|
|
154
154
|
|
|
@@ -167,47 +167,47 @@ lose by forgetting a second mount isn't one.
|
|
|
167
167
|
become unreachable.
|
|
168
168
|
- **The terminal theme (`variant: 'terminal'`) is a renderer, not a second set of branches.** It
|
|
169
169
|
draws every row itself from `components/terminal/` and the shell mounts it *instead* of the
|
|
170
|
-
components under `components/agent/`, so nothing in there asks which variant it is in
|
|
170
|
+
components under `components/agent/`, so nothing in there asks which variant it is in - if it is
|
|
171
171
|
drawing at all, it is drawing cards.
|
|
172
172
|
- **The panel mounts three terminal surfaces, and they must agree.** The transcript, the pending
|
|
173
173
|
prompts and the composer each establish their own cell, because each sits in a different part of
|
|
174
174
|
the flex column. `terminalMetrics` is one prop for exactly that reason: hand two of them
|
|
175
175
|
different numbers and the caret lands on a different column from the text above it.
|
|
176
176
|
- **`transcriptDensity` and `transcriptFont` reach `cards` only.** A terminal has one line height
|
|
177
|
-
and is monospace by construction. Under `terminal` both are inert rather than broken
|
|
177
|
+
and is monospace by construction. Under `terminal` both are inert rather than broken - a host
|
|
178
178
|
offering them as settings should say so, or hide them (the dashboard hides them).
|
|
179
179
|
- **`unseen` is catch-up mode's whole switch.** Passing a watermark draws the boundary, fades what
|
|
180
180
|
was already read and offers the "N new rows since you were last here" bar; passing `undefined`
|
|
181
181
|
draws none of it. The mark is frozen at mount, so it never walks down the transcript under the
|
|
182
|
-
reader. A host offering this as a setting owns the storage
|
|
182
|
+
reader. A host offering this as a setting owns the storage - the panel has no preference.
|
|
183
183
|
- **`scrubber` and `stickyPrompt` reach `terminal` only**, and by construction rather than policy.
|
|
184
|
-
Both rest on the theme's premise
|
|
184
|
+
Both rest on the theme's premise - one line height and one cell make a row's height computable -
|
|
185
185
|
and under `cards` the flags are inert.
|
|
186
186
|
- **`stickyPrompt` pins the real row, not a copy of it.** The prompt at the top of the scroller is
|
|
187
187
|
the same DOM node the transcript already rendered, with its transform clamped to the scroll
|
|
188
188
|
offset. A duplicate header cannot be made to line up with the rows beneath it, which is why this
|
|
189
|
-
is worth the machinery (`rangeExtractor` to keep it mounted, a manual push-off
|
|
189
|
+
is worth the machinery (`rangeExtractor` to keep it mounted, a manual push-off - `position:
|
|
190
190
|
sticky` does nothing on an absolutely positioned element).
|
|
191
191
|
- **Terminal row heights are computed, and the cache invalidates by object identity.** The height
|
|
192
192
|
calculator keys a `WeakMap<TranscriptItem, …>` per (width, cell) epoch, which works only because
|
|
193
193
|
the react reducer replaces item objects on every mutation. Mutate a `TranscriptItem` in place and
|
|
194
194
|
you will serve a stale height for a row that has changed. The epoch is rebuilt from a
|
|
195
|
-
`ResizeObserver` on the **content** element, not the scroller
|
|
195
|
+
`ResizeObserver` on the **content** element, not the scroller - the panel can resize without the
|
|
196
196
|
wrap width moving, since the content column caps at 48rem.
|
|
197
197
|
- **An item index is not a virtual row index.** `terminalBlocks` folds consecutive tool calls into
|
|
198
198
|
one row and the catch-up recap splices another, so `scrollToIndex(itemIndex)` lands off by the
|
|
199
199
|
fold on any transcript that has either. Go through `rowIndexForItem`.
|
|
200
200
|
- **A row's rendered strings are also its height.** `height.ts` predicts each row's pixel height
|
|
201
201
|
with no DOM, so anything the terminal renderer *writes* must come from the module both sides
|
|
202
|
-
import
|
|
202
|
+
import - `tool-run.ts` for a folded run's summary line, `result-preview.ts` for a collapsed tool
|
|
203
203
|
result and its `… +N` label. Re-spelling either one in the renderer alone desynchronises
|
|
204
204
|
`estimateSize` and the transcript grows a phantom scrollable tail. `dev/height-audit.ts` is the
|
|
205
205
|
gate; it measures against real browser layout, which no jsdom test can do.
|
|
206
206
|
- **`pnpm test` here covers the pure modules and nothing else.** That is the split, not an
|
|
207
207
|
omission: which rows exist, what a folded run's line says, how much of a result a collapsed row
|
|
208
208
|
keeps and which marks the rail paints are all string-and-array contracts with no DOM in them,
|
|
209
|
-
and they are where this package's bugs have actually shipped. Geometry
|
|
210
|
-
come out the height the calculator predicted
|
|
209
|
+
and they are where this package's bugs have actually shipped. Geometry - does the rendered row
|
|
210
|
+
come out the height the calculator predicted - is the browser audit above. A test in `test/`
|
|
211
211
|
that wants a DOM belongs in `dev/` instead. `buildClusters` and `railScale` are exported from
|
|
212
212
|
`scrubber.tsx` for the test alone and are deliberately absent from `index.ts`.
|
|
213
213
|
- **`affordances={false}` must leave a way to scroll.** The scrubber replaces the native scrollbar
|
|
@@ -217,7 +217,7 @@ lose by forgetting a second mount isn't one.
|
|
|
217
217
|
- **Its two metrics must be whole pixels.** `--term-font-size` and `--term-line` are the character
|
|
218
218
|
cell; a line height of `1.5 x 13px` is 19.5px and puts every other row on a half-pixel, which
|
|
219
219
|
softens the text and shows a seam through the diff bands. Horizontal measures are `ch` and
|
|
220
|
-
vertical measures are whole multiples of `--term-line`
|
|
220
|
+
vertical measures are whole multiples of `--term-line` - nothing in the theme is a px constant.
|
|
221
221
|
- **`--term-bleed` is a contract, not a decoration.** A full-bleed band (a diff hunk, a user
|
|
222
222
|
prompt, a hover fill) cancels it with matched negative margin and padding, so it must equal the
|
|
223
223
|
scroller's own horizontal padding. `TerminalSurface` sets both; a host that pads the scroller
|
|
@@ -228,7 +228,7 @@ lose by forgetting a second mount isn't one.
|
|
|
228
228
|
the edit has not happened yet) renders *without* a number column rather than a column of zeroes.
|
|
229
229
|
- **Affordances cost no layout, which is what makes `false` a real option.** The hover fill is a
|
|
230
230
|
background and the copy actions are absolutely-positioned overlays one line tall, so
|
|
231
|
-
`affordances={false}` changes no glyph's position
|
|
231
|
+
`affordances={false}` changes no glyph's position - it is the pure article, not a degraded mode.
|
|
232
232
|
- **Keep `monaco-editor` unreachable from `src/index.ts`.** Tree-shaking does not cover it: Vite
|
|
233
233
|
resolves Monaco's worker `new URL(...)`s while *transforming* the module, before shaking, and
|
|
234
234
|
emits megabytes of worker assets it never retracts. That is what the `/workspace` entry point is
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as rateLimitWindowSeconds, _ as formatDuration, a as meterTintClass, b as formatRelativeTime, f as compactionText, g as formatCountdown, h as formatCost, m as formatBytes, p as formatAgoPrecise, r as meterColorClass, w as toolInputPreview, x as formatTokens, y as formatRateLimitWindowLong } from "./status-
|
|
1
|
+
import { C as rateLimitWindowSeconds, _ as formatDuration, a as meterTintClass, b as formatRelativeTime, f as compactionText, g as formatCountdown, h as formatCost, m as formatBytes, p as formatAgoPrecise, r as meterColorClass, w as toolInputPreview, x as formatTokens, y as formatRateLimitWindowLong } from "./status-kmsBhuFG.mjs";
|
|
2
2
|
import { Fragment, createContext, forwardRef, memo, useCallback, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { cva } from "class-variance-authority";
|
|
4
4
|
import { clsx } from "clsx";
|
|
@@ -521,7 +521,7 @@ function truncateSegmentsToLength(segments, maxLength) {
|
|
|
521
521
|
* in the editor model: a space, newline, or tab.
|
|
522
522
|
*
|
|
523
523
|
* Trigger detection, paste auto-resolution, and position validation all rely
|
|
524
|
-
* on the *same* notion of a boundary
|
|
524
|
+
* on the *same* notion of a boundary - keeping it here prevents the three
|
|
525
525
|
* call sites from silently drifting apart (e.g. one handling tabs and the
|
|
526
526
|
* others not).
|
|
527
527
|
*/
|
|
@@ -659,7 +659,7 @@ function resolveChip(segments, activeTrigger, chip) {
|
|
|
659
659
|
* The sibling of {@link resolveChip}, for suggestions that are a typing aid
|
|
660
660
|
* rather than a token: what lands in the document is ordinary editable text the
|
|
661
661
|
* user is expected to finish and change, and it must not look or behave like a
|
|
662
|
-
* resolved chip
|
|
662
|
+
* resolved chip - no immutability, no trigger character, nothing for a consumer
|
|
663
663
|
* to parse back out. The caret is left at the end of the inserted text so typing
|
|
664
664
|
* continues from there.
|
|
665
665
|
*/
|
|
@@ -1014,7 +1014,7 @@ function autoFormatListPrefix(segments, cursorPos) {
|
|
|
1014
1014
|
};
|
|
1015
1015
|
}
|
|
1016
1016
|
/**
|
|
1017
|
-
* Handles Enter key in a list line
|
|
1017
|
+
* Handles Enter key in a list line - continues the list or exits.
|
|
1018
1018
|
*/
|
|
1019
1019
|
function insertListContinuation(segments, cursorPos) {
|
|
1020
1020
|
const plainText = segmentsToPlainText(segments);
|
|
@@ -1051,8 +1051,8 @@ function getPrevListLineLevel(text, lineStart) {
|
|
|
1051
1051
|
/**
|
|
1052
1052
|
* Indents a list item by one level (adds 2 spaces before the prefix), capped at
|
|
1053
1053
|
* one level deeper than the line above. An item can only nest under a preceding
|
|
1054
|
-
* sibling, so the first item of a list
|
|
1055
|
-
* parent
|
|
1054
|
+
* sibling, so the first item of a list - or an item already one level below its
|
|
1055
|
+
* parent - cannot indent further (returns null). This keeps sub-items visually
|
|
1056
1056
|
* connected to a parent instead of drifting arbitrarily deep.
|
|
1057
1057
|
*/
|
|
1058
1058
|
function indentListItem(segments, cursorPos) {
|
|
@@ -1099,8 +1099,8 @@ function swapListPrefixLine(line, markdownEnabled) {
|
|
|
1099
1099
|
/**
|
|
1100
1100
|
* Returns the set of line indices that sit inside a *balanced* fenced code
|
|
1101
1101
|
* block (a ```…``` pair), so their leading "- "/"• " markers are preserved
|
|
1102
|
-
* verbatim. An unterminated (unpaired) fence marker is NOT protective
|
|
1103
|
-
* following lines still normalize
|
|
1102
|
+
* verbatim. An unterminated (unpaired) fence marker is NOT protective - its
|
|
1103
|
+
* following lines still normalize - so a stray "```" in prose does not silently
|
|
1104
1104
|
* suppress bullet normalization for the rest of the text.
|
|
1105
1105
|
*/
|
|
1106
1106
|
function fenceProtectedLineIndices(lines) {
|
|
@@ -1161,12 +1161,12 @@ function normalizeListPrefixes(segments, markdownEnabled) {
|
|
|
1161
1161
|
return changed ? result : segments;
|
|
1162
1162
|
}
|
|
1163
1163
|
/**
|
|
1164
|
-
* Whether the text holds a genuine ordered-list run worth renumbering
|
|
1164
|
+
* Whether the text holds a genuine ordered-list run worth renumbering - a run
|
|
1165
1165
|
* of 2+ consecutive same-level numbered lines that either starts at 1 or is
|
|
1166
1166
|
* already a contiguous `n, n+1, …` sequence. Used to gate the paste path so a
|
|
1167
1167
|
* copied list fragment (`3. 4. 5.` → renumber, or a broken `1. 1. 1.`) is
|
|
1168
1168
|
* rebuilt, while incidental numeric-leading prose that `parseListLine` would
|
|
1169
|
-
* otherwise treat as a list
|
|
1169
|
+
* otherwise treat as a list - `1985. Born / 2020. Died`, `5. / 10. / 15.` - is
|
|
1170
1170
|
* left untouched.
|
|
1171
1171
|
*/
|
|
1172
1172
|
function hasOrderedListRun(text) {
|
|
@@ -1199,7 +1199,7 @@ function hasOrderedListRun(text) {
|
|
|
1199
1199
|
* Recomputes ordered-list numbering across the whole text. Returns the new text
|
|
1200
1200
|
* plus the list of changed digit runs (ascending by `oldStart`) for cursor
|
|
1201
1201
|
* remapping. When nothing changes, returns the SAME text reference and an empty
|
|
1202
|
-
* `edits` array
|
|
1202
|
+
* `edits` array - the no-op guard that keeps this off the typing hot path.
|
|
1203
1203
|
*/
|
|
1204
1204
|
function renumberOrderedListLines(text) {
|
|
1205
1205
|
if (!/^[ \t]*\d+\. /m.test(text)) return {
|
|
@@ -1441,11 +1441,11 @@ function indexOfChildNode(parent, child) {
|
|
|
1441
1441
|
* `readSegmentsFromDOM` in use-prompt-area.ts. This is the single predicate
|
|
1442
1442
|
* shared with `domChildIndexToSegmentIndex` below, so a DOM child index can
|
|
1443
1443
|
* never map to a different segment index than the one the reader actually
|
|
1444
|
-
* produces
|
|
1444
|
+
* produces - decoration elements (the URL `<a>` from `decorateURLsInEditor`,
|
|
1445
1445
|
* the markdown `<span data-md>` from `decorateMarkdownInEditor`) fall through
|
|
1446
1446
|
* to the reader's "unknown element" branch and DO produce a text segment, so
|
|
1447
1447
|
* they must count here too, not just chips/text/`<br>`. A chip element only
|
|
1448
|
-
* counts if `chipNodeToSegment` would actually accept it
|
|
1448
|
+
* counts if `chipNodeToSegment` would actually accept it - the reader skips a
|
|
1449
1449
|
* chip missing a required attribute (trigger/value/display), so this must too.
|
|
1450
1450
|
*/
|
|
1451
1451
|
function childProducesSegment(child) {
|
|
@@ -1536,7 +1536,7 @@ function normalizeEditorDOM(editor) {
|
|
|
1536
1536
|
* Walks direct-child text nodes in the editor and wraps URL text in
|
|
1537
1537
|
* `<a>` elements for visual styling and clickability.
|
|
1538
1538
|
*
|
|
1539
|
-
* This is a DOM-only decoration
|
|
1539
|
+
* This is a DOM-only decoration - it does NOT modify the segment model.
|
|
1540
1540
|
* The `<a>` elements are stripped by `normalizeEditorDOM` on every input cycle,
|
|
1541
1541
|
* so they are re-applied fresh each time.
|
|
1542
1542
|
*
|
|
@@ -1600,7 +1600,7 @@ function decorateURLsInEditor(editor) {
|
|
|
1600
1600
|
* Walks direct-child text nodes in the editor and wraps markdown-formatted
|
|
1601
1601
|
* text (`**bold**`, `*italic*`, `***bold-italic***`) in styled `<span>` elements.
|
|
1602
1602
|
*
|
|
1603
|
-
* This is a DOM-only decoration
|
|
1603
|
+
* This is a DOM-only decoration - it does NOT modify the segment model.
|
|
1604
1604
|
* The `<span>` elements are stripped by `normalizeEditorDOM` on every input cycle,
|
|
1605
1605
|
* so they are re-applied fresh each time.
|
|
1606
1606
|
*
|
|
@@ -1727,7 +1727,7 @@ function decorateBulletsInEditor(editor) {
|
|
|
1727
1727
|
* unchanged) and is stripped by {@link normalizeEditorDOM} each input cycle.
|
|
1728
1728
|
* Must run BEFORE the node-splitting passes ({@link decorateURLsInEditor},
|
|
1729
1729
|
* {@link decorateMarkdownInEditor}, {@link decorateBulletsInEditor}) so every
|
|
1730
|
-
* direct-child text node is still a whole line
|
|
1730
|
+
* direct-child text node is still a whole line - otherwise a mid-line split
|
|
1731
1731
|
* fragment beginning with whitespace would let the `^` anchor false-match
|
|
1732
1732
|
* non-line-leading whitespace.
|
|
1733
1733
|
*
|
|
@@ -1811,12 +1811,12 @@ function getSelectionRange() {
|
|
|
1811
1811
|
*
|
|
1812
1812
|
* Invariants:
|
|
1813
1813
|
* - All functions are synchronous. Never return a promise or cross a microtask
|
|
1814
|
-
* boundary after a DOM mutation
|
|
1814
|
+
* boundary after a DOM mutation - that can cause the browser to fire
|
|
1815
1815
|
* `selectionchange` and reset the caret.
|
|
1816
1816
|
* - Never cache a `Selection` or `Range` across calls. Ranges become detached
|
|
1817
1817
|
* after DOM mutations. Each function calls `window.getSelection()` or
|
|
1818
1818
|
* `getSelectionRange()` fresh.
|
|
1819
|
-
* - Chip nodes are treated atomically via `isChipElement`
|
|
1819
|
+
* - Chip nodes are treated atomically via `isChipElement` - we never descend
|
|
1820
1820
|
* into a contentEditable=false subtree when mapping offsets.
|
|
1821
1821
|
*/
|
|
1822
1822
|
function getCursorOffset(editor) {
|
|
@@ -1844,11 +1844,11 @@ function createRangeAtOffset(editor, targetOffset) {
|
|
|
1844
1844
|
* Where the caret is on screen, in viewport coordinates.
|
|
1845
1845
|
*
|
|
1846
1846
|
* A collapsed range usually measures fine, but not when it sits *between* child
|
|
1847
|
-
* nodes of an element
|
|
1847
|
+
* nodes of an element - which is exactly where a freshly inserted newline puts
|
|
1848
1848
|
* it, because this editor's content is a flat run of text nodes and `<br>`s
|
|
1849
1849
|
* directly under the editor element. There `getBoundingClientRect()` is all
|
|
1850
1850
|
* zeros, and the obvious fallback (measure `startContainer`'s element) resolves
|
|
1851
|
-
* to the editor itself, whose rect is the viewport box
|
|
1851
|
+
* to the editor itself, whose rect is the viewport box - so it reports the
|
|
1852
1852
|
* caret as trivially visible and scrolls nothing.
|
|
1853
1853
|
*
|
|
1854
1854
|
* So measure the neighbour instead: the child the caret sits before, or failing
|
|
@@ -1877,14 +1877,14 @@ function caretRect(range) {
|
|
|
1877
1877
|
* The editor is its own scroll container once it hits `maxHeight`
|
|
1878
1878
|
* (`prompt-area.tsx` sets `overflowY: auto` there). Typing scrolls the caret
|
|
1879
1879
|
* into view for free, because that is the browser's own behaviour for a native
|
|
1880
|
-
* edit
|
|
1880
|
+
* edit - but every path that calls `preventDefault()` and rebuilds the DOM
|
|
1881
1881
|
* itself (Shift+Enter, list continuation, undo/redo, the bold/italic wrap,
|
|
1882
1882
|
* paste) places the caret with a Range instead, and setting a selection does
|
|
1883
1883
|
* not scroll anything. The symptom is a prompt that has grown past its cap and
|
|
1884
1884
|
* stops following what you are writing: type and it scrolls, press Shift+Enter
|
|
1885
1885
|
* and the new line appears below the fold.
|
|
1886
1886
|
*
|
|
1887
|
-
* A no-op when the caret is already visible, so it is safe on every call
|
|
1887
|
+
* A no-op when the caret is already visible, so it is safe on every call - it
|
|
1888
1888
|
* corrects an off-screen caret rather than scrolling to one.
|
|
1889
1889
|
*/
|
|
1890
1890
|
function scrollCaretIntoView(editor) {
|
|
@@ -2345,7 +2345,7 @@ function normalizeOutput(markdown) {
|
|
|
2345
2345
|
/**
|
|
2346
2346
|
* Converts an HTML string to markdown source text. Returns '' for empty or
|
|
2347
2347
|
* body-less input. Block markdown (headings, lists, quotes, fences, tables,
|
|
2348
|
-
* links) is emitted as literal markdown text
|
|
2348
|
+
* links) is emitted as literal markdown text - that is the editor's intended
|
|
2349
2349
|
* display; only `*`/`**`/`***` and bare URLs get visually decorated inline.
|
|
2350
2350
|
*/
|
|
2351
2351
|
function htmlToMarkdown(html) {
|
|
@@ -5358,7 +5358,7 @@ function ToolRow({ item }) {
|
|
|
5358
5358
|
setFetching(true);
|
|
5359
5359
|
fetchResult(item.id).finally(() => setFetching(false));
|
|
5360
5360
|
},
|
|
5361
|
-
children: truncated ? `… +${missing.toLocaleString()} chars
|
|
5361
|
+
children: truncated ? `… +${missing.toLocaleString()} chars - fetch the rest` : `… +${hidden} line${hidden === 1 ? "" : "s"} - show all ${text.length.toLocaleString()} chars`
|
|
5362
5362
|
}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
5363
5363
|
"… +",
|
|
5364
5364
|
hidden,
|
|
@@ -5970,7 +5970,7 @@ function AttachmentChip({ item, onRetry, onRemove }) {
|
|
|
5970
5970
|
const round = terminal ? "" : "rounded-md";
|
|
5971
5971
|
return /* @__PURE__ */ jsxs("div", {
|
|
5972
5972
|
className: "group relative shrink-0",
|
|
5973
|
-
title: failed ? `${item.name}
|
|
5973
|
+
title: failed ? `${item.name} - ${item.error}` : `${item.name} · ${formatBytes(item.bytes)}`,
|
|
5974
5974
|
children: [
|
|
5975
5975
|
/* @__PURE__ */ jsx("div", {
|
|
5976
5976
|
className: cn("flex size-14 items-center justify-center overflow-hidden bg-surface", round, terminal ? "term-attachment" : "border border-border", failed && "border-danger/50"),
|
|
@@ -6030,9 +6030,9 @@ function cssColor(color) {
|
|
|
6030
6030
|
//#endregion
|
|
6031
6031
|
//#region src/lib/context-note.ts
|
|
6032
6032
|
const CODEX_CONTEXT_NOTE = {
|
|
6033
|
-
summary: "Codex budgets 272K input by default and reports 95% of it, so a 1M-class model reads ~258k. That is codex’s price tier, not the model’s ceiling
|
|
6034
|
-
hint: "Raising it is yours to set: model_context_window in ~/.codex/config.toml
|
|
6035
|
-
detail: ["To raise it, set model_context_window in ~/.codex/config.toml, up to 872000 (reported as 828400). Codex clamps to its own max_context_window, itself below OpenAI’s stated 922,000 max input.", "Above 272K input, a request bills at 2x input / 1.5x output for the whole request. WorkerDeck never writes this setting
|
|
6033
|
+
summary: "Codex budgets 272K input by default and reports 95% of it, so a 1M-class model reads ~258k. That is codex’s price tier, not the model’s ceiling - and it is the number auto-compaction fires on, so the meter is honest.",
|
|
6034
|
+
hint: "Raising it is yours to set: model_context_window in ~/.codex/config.toml - and watch for auto-compaction failing afterwards.",
|
|
6035
|
+
detail: ["To raise it, set model_context_window in ~/.codex/config.toml, up to 872000 (reported as 828400). Codex clamps to its own max_context_window, itself below OpenAI’s stated 922,000 max input.", "Above 272K input, a request bills at 2x input / 1.5x output for the whole request. WorkerDeck never writes this setting - it is a cost decision on your account."],
|
|
6036
6036
|
caveat: "Raise it and watch for auto-compaction failing: openai/codex #16068 reports it stops firing after the first overflow. Unverified here on 0.149.0."
|
|
6037
6037
|
};
|
|
6038
6038
|
function contextNote(engine) {
|
|
@@ -6052,7 +6052,7 @@ function ContextDialog({ usage, engine, open, onOpenChange, className }) {
|
|
|
6052
6052
|
description: usage?.model
|
|
6053
6053
|
}), /* @__PURE__ */ jsxs(DialogBody, { children: [!usage ? /* @__PURE__ */ jsx("p", {
|
|
6054
6054
|
className: "py-6 text-center text-body-sm text-fg-4",
|
|
6055
|
-
children: "No reading yet
|
|
6055
|
+
children: "No reading yet - the context window is measured after a turn completes."
|
|
6056
6056
|
}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
6057
6057
|
/* @__PURE__ */ jsxs("div", {
|
|
6058
6058
|
className: "flex items-baseline justify-between gap-4",
|
|
@@ -6167,7 +6167,7 @@ function TaskList({ tasks, showCompleted, onShowCompletedChange, onSelectTask, c
|
|
|
6167
6167
|
}) : null]
|
|
6168
6168
|
}), shown.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
6169
6169
|
className: "py-6 text-center text-body-sm text-fg-4",
|
|
6170
|
-
children: tasks.length === 0 ? "No tasks yet
|
|
6170
|
+
children: tasks.length === 0 ? "No tasks yet - a checklist appears once the agent plans one." : `${hidden} completed, all hidden.`
|
|
6171
6171
|
}) : /* @__PURE__ */ jsx("div", {
|
|
6172
6172
|
className: "flex flex-col",
|
|
6173
6173
|
children: shown.map((task) => /* @__PURE__ */ jsx(TaskRow$1, {
|
|
@@ -6305,7 +6305,7 @@ function HostFilesDialog({ client, cwd, open, onOpenChange }) {
|
|
|
6305
6305
|
setFile({
|
|
6306
6306
|
path: response.path,
|
|
6307
6307
|
bytes: response.bytes,
|
|
6308
|
-
content: response.encoding === "utf8" ? response.content : "(binary file
|
|
6308
|
+
content: response.encoding === "utf8" ? response.content : "(binary file - not shown)"
|
|
6309
6309
|
});
|
|
6310
6310
|
} catch (e) {
|
|
6311
6311
|
setError(e instanceof Error ? e.message : "Could not read that file");
|
|
@@ -6391,7 +6391,7 @@ function HostFilesDialog({ client, cwd, open, onOpenChange }) {
|
|
|
6391
6391
|
}),
|
|
6392
6392
|
truncated && !matches ? /* @__PURE__ */ jsx("p", {
|
|
6393
6393
|
className: "text-label text-fg-4",
|
|
6394
|
-
children: "More entries than the server will return
|
|
6394
|
+
children: "More entries than the server will return - use the search box."
|
|
6395
6395
|
}) : null
|
|
6396
6396
|
] })]
|
|
6397
6397
|
})]
|
|
@@ -6689,7 +6689,7 @@ function SkillsDialog({ skills, open, onOpenChange, onUse, className }) {
|
|
|
6689
6689
|
className,
|
|
6690
6690
|
children: [/* @__PURE__ */ jsx(DialogHeader, {
|
|
6691
6691
|
title: skill ? skill.displayName ?? skill.name : "Skills",
|
|
6692
|
-
description: skill ? skill.name !== (skill.displayName ?? skill.name) ? skill.name : void 0 : "Capabilities the agent can choose to use. Not commands
|
|
6692
|
+
description: skill ? skill.name !== (skill.displayName ?? skill.name) ? skill.name : void 0 : "Capabilities the agent can choose to use. Not commands - the model picks them from their descriptions.",
|
|
6693
6693
|
actions: skill ? /* @__PURE__ */ jsxs(Button, {
|
|
6694
6694
|
variant: "ghost",
|
|
6695
6695
|
size: "xs",
|
|
@@ -6710,7 +6710,7 @@ function SkillsDialog({ skills, open, onOpenChange, onUse, className }) {
|
|
|
6710
6710
|
function SkillList({ skills, onSelect }) {
|
|
6711
6711
|
if (!skills) return /* @__PURE__ */ jsx("p", {
|
|
6712
6712
|
className: "py-6 text-center text-body-sm text-fg-4",
|
|
6713
|
-
children: "Skills are listed once the session connects
|
|
6713
|
+
children: "Skills are listed once the session connects - send a message first."
|
|
6714
6714
|
});
|
|
6715
6715
|
if (skills.length === 0) return /* @__PURE__ */ jsx("p", {
|
|
6716
6716
|
className: "py-6 text-center text-body-sm text-fg-4",
|
|
@@ -6785,7 +6785,7 @@ function SkillView({ skill, onUse, onUsed }) {
|
|
|
6785
6785
|
children: "Use this skill"
|
|
6786
6786
|
}), /* @__PURE__ */ jsx("p", {
|
|
6787
6787
|
className: "mt-1.5 text-label text-fg-4",
|
|
6788
|
-
children: "Writes an opening message into the composer for you to edit
|
|
6788
|
+
children: "Writes an opening message into the composer for you to edit - it isn’t sent, and there is no command that runs a skill directly."
|
|
6789
6789
|
})] }) : null
|
|
6790
6790
|
]
|
|
6791
6791
|
});
|
|
@@ -6884,14 +6884,14 @@ const PERMISSION_MODES = [
|
|
|
6884
6884
|
value: "dontAsk",
|
|
6885
6885
|
label: "Don't ask",
|
|
6886
6886
|
shortLabel: "Don't ask",
|
|
6887
|
-
description: "Never ask
|
|
6887
|
+
description: "Never ask - deny anything not pre-approved",
|
|
6888
6888
|
icon: ShieldCheck
|
|
6889
6889
|
},
|
|
6890
6890
|
{
|
|
6891
6891
|
value: "bypassPermissions",
|
|
6892
6892
|
label: "Bypass permissions",
|
|
6893
6893
|
shortLabel: "Bypass",
|
|
6894
|
-
description: "Skip every approval
|
|
6894
|
+
description: "Skip every approval - the agent is unsupervised",
|
|
6895
6895
|
icon: TriangleAlert,
|
|
6896
6896
|
dangerous: true
|
|
6897
6897
|
}
|
|
@@ -7080,7 +7080,7 @@ function PermissionPrompt({ request, onApprove, onDeny, className }) {
|
|
|
7080
7080
|
if (e.key === "Enter") deny(false);
|
|
7081
7081
|
if (e.key === "Escape") setDenying(false);
|
|
7082
7082
|
},
|
|
7083
|
-
placeholder: plan ? "What should change? (optional)
|
|
7083
|
+
placeholder: plan ? "What should change? (optional) - the agent keeps planning and reads this" : "Reason (optional) - the agent reads this and can try something else",
|
|
7084
7084
|
className: "h-7 flex-1"
|
|
7085
7085
|
}),
|
|
7086
7086
|
/* @__PURE__ */ jsx(Button, {
|
|
@@ -7638,7 +7638,7 @@ function TerminalPermissionPrompt({ request, onApprove, onDeny, className }) {
|
|
|
7638
7638
|
onChange: setReason,
|
|
7639
7639
|
onSubmit: () => deny(false),
|
|
7640
7640
|
onCancel: () => setDenying(false),
|
|
7641
|
-
placeholder: plan ? "What should change? (optional)
|
|
7641
|
+
placeholder: plan ? "What should change? (optional) - the agent keeps planning and reads this" : "Reason (optional) - the agent reads this and can try something else"
|
|
7642
7642
|
}) : void 0;
|
|
7643
7643
|
const options = plan ? [
|
|
7644
7644
|
{
|
|
@@ -7647,7 +7647,7 @@ function TerminalPermissionPrompt({ request, onApprove, onDeny, className }) {
|
|
|
7647
7647
|
},
|
|
7648
7648
|
{
|
|
7649
7649
|
key: "deny",
|
|
7650
|
-
label: "Keep planning
|
|
7650
|
+
label: "Keep planning - tell it what to change",
|
|
7651
7651
|
detail: reasonInput
|
|
7652
7652
|
},
|
|
7653
7653
|
{
|
|
@@ -7720,7 +7720,7 @@ function TerminalPermissionPrompt({ request, onApprove, onDeny, className }) {
|
|
|
7720
7720
|
}
|
|
7721
7721
|
}),
|
|
7722
7722
|
/* @__PURE__ */ jsx(Blank, {}),
|
|
7723
|
-
/* @__PURE__ */ jsx(Hint, { children: denying ? "Enter to send · Shift+Enter for a new line · Esc to go back" : "Enter to select · ↑/↓ to navigate · 1
|
|
7723
|
+
/* @__PURE__ */ jsx(Hint, { children: denying ? "Enter to send · Shift+Enter for a new line · Esc to go back" : "Enter to select · ↑/↓ to navigate · 1-3 to choose · Esc to cancel" })
|
|
7724
7724
|
]
|
|
7725
7725
|
});
|
|
7726
7726
|
}
|
|
@@ -8208,7 +8208,7 @@ function RateLimitMeter({ label, info, now }) {
|
|
|
8208
8208
|
className: "flex items-center justify-between gap-2",
|
|
8209
8209
|
children: [/* @__PURE__ */ jsxs("span", { children: [label, " usage"] }), /* @__PURE__ */ jsx("span", {
|
|
8210
8210
|
className: "font-mono text-fg-3",
|
|
8211
|
-
children: pct !== void 0 ? `${pct.toFixed(1)}%` : "
|
|
8211
|
+
children: pct !== void 0 ? `${pct.toFixed(1)}%` : "-"
|
|
8212
8212
|
})]
|
|
8213
8213
|
}),
|
|
8214
8214
|
resetsAtMs !== void 0 ? /* @__PURE__ */ jsxs("div", {
|
|
@@ -8506,8 +8506,8 @@ function clusterCells(cluster) {
|
|
|
8506
8506
|
const TAB_SIZE = 2;
|
|
8507
8507
|
const BREAK_AFTER = /* @__PURE__ */ new Set([
|
|
8508
8508
|
"-",
|
|
8509
|
-
"
|
|
8510
|
-
"
|
|
8509
|
+
"-",
|
|
8510
|
+
"-",
|
|
8511
8511
|
"?"
|
|
8512
8512
|
]);
|
|
8513
8513
|
const PLAIN_ASCII = /^[\x20-\x7e]*$/;
|
|
@@ -11081,7 +11081,7 @@ function UsageDialog({ rateLimits, subscriptionType, engine, totalCostUsd, updat
|
|
|
11081
11081
|
}), /* @__PURE__ */ jsxs(DialogBody, { children: [
|
|
11082
11082
|
rateLimits.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
11083
11083
|
className: "py-6 text-center text-body-sm text-fg-4",
|
|
11084
|
-
children: engine === "claude" ? "This session reports no plan windows
|
|
11084
|
+
children: engine === "claude" ? "This session reports no plan windows - API-key sessions have none, and a subscription session reports them once a turn has run." : `Plan windows are a claude.ai subscription thing; this session runs on the ${engine} engine.`
|
|
11085
11085
|
}) : /* @__PURE__ */ jsx(UsageMeters, {
|
|
11086
11086
|
windows: rateLimits,
|
|
11087
11087
|
now
|
|
@@ -11698,4 +11698,4 @@ function Notice({ level, onDismiss, children }) {
|
|
|
11698
11698
|
//#endregion
|
|
11699
11699
|
export { Ink as $, PERMISSION_MODES as A, DialogContent as At, TaskList as B, SelectContent as Bt, TerminalPermissionPrompt as C, copyText as Ct, SubagentStrip as D, Dialog$1 as Dt, parseUserQuestions as E, TooltipProvider as Et, SkillsDialog as F, MenuContent as Ft, TerminalSurface as G, PortalScope as Gt, contextNote as H, SelectItemText as Ht, McpDialog as I, MenuItem as It, TerminalMarkdown as J, Badge as Jt, ToolTitleProvider as K, Textarea as Kt, HostFilesDialog as L, MenuSeparator as Lt, permissionModeChoices as M, DialogRow as Mt, permissionModeMeta as N, DialogTrigger as Nt, PermissionPrompt as O, DialogBody as Ot, ModelSelect as P, Menu$1 as Pt, Blank as Q, cn as Qt, EntryIcon as R, MenuTrigger as Rt, TerminalQuestionPrompt as S, CopyButton as St, QuestionPrompt as T, TooltipContent as Tt, Composer as U, SelectTrigger as Ut, ContextDialog as V, SelectItem as Vt, skillPrompt as W, SelectValue as Wt, previewPatch as X, Button as Xt, TerminalDiff as Y, badgeVariants as Yt, Band as Z, buttonVariants as Zt, ConversationContent as _, segmentsToPlainText as _t, Transcript as a, toolIcon as at, STATUS_META as b, CodeBlock as bt, PromptTokenText as c, useTranscriptDensity as ct, FileCard as d, hashtagTrigger as dt, Row as et, TerminalItemView as f, launchTrigger as ft, Conversation as g, plainTextToSegments as gt, Loader as h, PromptArea as ht, useMinuteClock as i, isMutatingTool as it, PermissionModeSelect as j, DialogHeader as jt, Response as k, DialogClose as kt, Message as l, useTranscriptVariant as lt, SessionEmptyState as m, usePromptAreaState as mt, UsageDialog as n, WithActions as nt, ToolCallCard as o, TranscriptDensityProvider as ot, TerminalTranscript as p, mentionTrigger as pt, useToolTitle as q, Input as qt, UsageMeters as r, useAffordances as rt, Reasoning as s, TranscriptVariantProvider as st, SessionPanel as t, CopyAction as tt, MessageContent as u, commandTrigger as ut, ConversationScrollButton as v, ProgressRing as vt, QUESTION_BEHAVIORS as w, Tip as wt, SessionInfoDialog as x, Spinner as xt, StatusBar as y, Splitter as yt, TasksDialog as z, Select$1 as zt };
|
|
11700
11700
|
|
|
11701
|
-
//# sourceMappingURL=SessionPanel-
|
|
11701
|
+
//# sourceMappingURL=SessionPanel-Dg4xf-ql.mjs.map
|