@tangle-network/agent-app 0.45.32 → 0.45.34

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.
Files changed (61) hide show
  1. package/dist/{DesignCanvas-RSWQCXM3.js → DesignCanvas-EODMDQMT.js} +2 -2
  2. package/dist/{DesignCanvasEditor-XZMGIST7.js → DesignCanvasEditor-DRRZ6ZD3.js} +4 -4
  3. package/dist/{InvitationsPanel-CJ7DR4F7.js → InvitationsPanel-BATXZHY4.js} +2 -2
  4. package/dist/{MembersPanel-BB4OD2KB.js → MembersPanel-XNLF3SA4.js} +2 -2
  5. package/dist/agent-session-controls-1q1XR3j8.d.ts +257 -0
  6. package/dist/assistant/index.d.ts +1 -1
  7. package/dist/assistant/index.js +11 -10
  8. package/dist/assistant/index.js.map +1 -1
  9. package/dist/chat-react/index.d.ts +1 -1
  10. package/dist/chat-react/index.js +1 -1
  11. package/dist/{chunk-YIQHOAHN.js → chunk-3UBAO3N5.js} +3 -3
  12. package/dist/{chunk-YIQHOAHN.js.map → chunk-3UBAO3N5.js.map} +1 -1
  13. package/dist/{chunk-PURHUAOR.js → chunk-556RB3XI.js} +5 -5
  14. package/dist/chunk-556RB3XI.js.map +1 -0
  15. package/dist/{chunk-HZ4WCA37.js → chunk-5MZXWPFN.js} +9 -9
  16. package/dist/chunk-5MZXWPFN.js.map +1 -0
  17. package/dist/{chunk-FNM7JYME.js → chunk-5N434BGF.js} +17 -17
  18. package/dist/chunk-5N434BGF.js.map +1 -0
  19. package/dist/{chunk-5SXS3YAB.js → chunk-7MV23XBW.js} +2 -2
  20. package/dist/chunk-7MV23XBW.js.map +1 -0
  21. package/dist/{chunk-IFYJDX3J.js → chunk-AIHKKLKY.js} +47 -46
  22. package/dist/chunk-AIHKKLKY.js.map +1 -0
  23. package/dist/{chunk-S564OFTL.js → chunk-F4XLTVQ3.js} +3 -3
  24. package/dist/{chunk-S564OFTL.js.map → chunk-F4XLTVQ3.js.map} +1 -1
  25. package/dist/{chunk-LSQR6HM6.js → chunk-IN6LNZ7O.js} +35 -34
  26. package/dist/chunk-IN6LNZ7O.js.map +1 -0
  27. package/dist/chunk-MIZMWCKW.js +904 -0
  28. package/dist/chunk-MIZMWCKW.js.map +1 -0
  29. package/dist/{chunk-QGOU3VXH.js → chunk-UXRJAUJL.js} +3 -3
  30. package/dist/design-canvas-react/index.js +8 -8
  31. package/dist/design-canvas-react/index.js.map +1 -1
  32. package/dist/design-canvas-react/lazy.js +1 -1
  33. package/dist/studio-react/index.js +27 -27
  34. package/dist/studio-react/index.js.map +1 -1
  35. package/dist/teams-react/index.js +2 -2
  36. package/dist/teams-react/lazy.js +2 -2
  37. package/dist/theme/index.js +1 -1
  38. package/dist/theme/tailwind-preset.d.ts +5 -1
  39. package/dist/theme/tailwind-preset.js +11 -2
  40. package/dist/theme/tailwind-preset.js.map +1 -1
  41. package/dist/theme/tokens.css +126 -79
  42. package/dist/web-react/async/index.js +1 -1
  43. package/dist/web-react/index.d.ts +31 -91
  44. package/dist/web-react/index.js +13 -3
  45. package/dist/work-product-react/index.js +3 -3
  46. package/dist/work-product-react/index.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/agent-session-controls-BwImzYKC.d.ts +0 -129
  49. package/dist/chunk-5SXS3YAB.js.map +0 -1
  50. package/dist/chunk-FNM7JYME.js.map +0 -1
  51. package/dist/chunk-HZ4WCA37.js.map +0 -1
  52. package/dist/chunk-IFYJDX3J.js.map +0 -1
  53. package/dist/chunk-L7FHRORY.js +0 -763
  54. package/dist/chunk-L7FHRORY.js.map +0 -1
  55. package/dist/chunk-LSQR6HM6.js.map +0 -1
  56. package/dist/chunk-PURHUAOR.js.map +0 -1
  57. /package/dist/{DesignCanvas-RSWQCXM3.js.map → DesignCanvas-EODMDQMT.js.map} +0 -0
  58. /package/dist/{DesignCanvasEditor-XZMGIST7.js.map → DesignCanvasEditor-DRRZ6ZD3.js.map} +0 -0
  59. /package/dist/{InvitationsPanel-CJ7DR4F7.js.map → InvitationsPanel-BATXZHY4.js.map} +0 -0
  60. /package/dist/{MembersPanel-BB4OD2KB.js.map → MembersPanel-XNLF3SA4.js.map} +0 -0
  61. /package/dist/{chunk-QGOU3VXH.js.map → chunk-UXRJAUJL.js.map} +0 -0
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  DesignCanvas
3
- } from "./chunk-FNM7JYME.js";
3
+ } from "./chunk-5N434BGF.js";
4
4
  import "./chunk-X5DQ5QOP.js";
5
5
  import "./chunk-DRB77FYL.js";
6
6
  import "./chunk-F7VH4G5C.js";
7
7
  export {
8
8
  DesignCanvas
9
9
  };
10
- //# sourceMappingURL=DesignCanvas-RSWQCXM3.js.map
10
+ //# sourceMappingURL=DesignCanvas-EODMDQMT.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  DesignCanvasEditor
3
- } from "./chunk-PURHUAOR.js";
4
- import "./chunk-FNM7JYME.js";
5
- import "./chunk-LSQR6HM6.js";
3
+ } from "./chunk-556RB3XI.js";
4
+ import "./chunk-5N434BGF.js";
5
+ import "./chunk-IN6LNZ7O.js";
6
6
  import "./chunk-OYTMILRK.js";
7
7
  import "./chunk-X5DQ5QOP.js";
8
8
  import "./chunk-DRB77FYL.js";
@@ -10,4 +10,4 @@ import "./chunk-F7VH4G5C.js";
10
10
  export {
11
11
  DesignCanvasEditor
12
12
  };
13
- //# sourceMappingURL=DesignCanvasEditor-XZMGIST7.js.map
13
+ //# sourceMappingURL=DesignCanvasEditor-DRRZ6ZD3.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  InvitationsPanel
3
- } from "./chunk-5SXS3YAB.js";
3
+ } from "./chunk-7MV23XBW.js";
4
4
  import "./chunk-6XIAPIW6.js";
5
5
  export {
6
6
  InvitationsPanel
7
7
  };
8
- //# sourceMappingURL=InvitationsPanel-CJ7DR4F7.js.map
8
+ //# sourceMappingURL=InvitationsPanel-BATXZHY4.js.map
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  MembersPanel
3
- } from "./chunk-S564OFTL.js";
3
+ } from "./chunk-F4XLTVQ3.js";
4
4
  import "./chunk-6XIAPIW6.js";
5
5
  export {
6
6
  MembersPanel
7
7
  };
8
- //# sourceMappingURL=MembersPanel-BB4OD2KB.js.map
8
+ //# sourceMappingURL=MembersPanel-XNLF3SA4.js.map
@@ -0,0 +1,257 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { F as FileMention } from './wire-DOZ-O6hD.js';
4
+ import { Harness } from './harness/index.js';
5
+ import { CatalogModel } from './catalog/index.js';
6
+
7
+ /**
8
+ * `useFileMentions` — the glue a host passes straight into `AgentComposer`'s
9
+ * `mention` prop (`@tangle-network/sandbox-ui#184`) to wire up `@`-file
10
+ * mentions against `createSandboxFileIndexRoute` (`/chat-routes`).
11
+ *
12
+ * Fetches the index once per session from `indexUrl`, refreshes it in the
13
+ * background whenever the popover opens (a `fetchItems` call) if the cached
14
+ * copy has aged past `refreshAfterMs`, and answers every keystroke from an
15
+ * in-memory fuzzy filter — no per-keystroke network round trip. The returned
16
+ * `refresh()` lets a caller force a re-fetch immediately instead of waiting
17
+ * on `refreshAfterMs` — e.g. right after the agent creates a file mid-session.
18
+ *
19
+ * `MentionItem`/the `mention` prop shape mirror the FROZEN contract from
20
+ * sandbox-ui#184 structurally (no import: `/web-react` stays dependency-free
21
+ * beyond React, and `@tangle-network/sandbox-ui` is an optional peer).
22
+ */
23
+
24
+ /** Mirrors sandbox-ui#184's `MentionItem` — the atomic pill's payload. For a
25
+ * file mention, `id` is the workspace-relative path (the pill's stable
26
+ * identity and the `@<id>` serialization sandbox-ui uses to round-trip
27
+ * `value`), `label` is the display name, and `detail` carries the full path
28
+ * for the popover row's secondary line. */
29
+ interface MentionItem {
30
+ id: string;
31
+ label: string;
32
+ detail?: string;
33
+ kind?: string;
34
+ }
35
+ /** Mirrors sandbox-ui#184's `AgentComposerProps['mention']` shape — plug the
36
+ * hook's `mention` return value straight into that prop. */
37
+ interface ComposerMentionProp {
38
+ trigger?: string;
39
+ fetchItems(query: string): Promise<MentionItem[]>;
40
+ onMentionsChange?(mentions: MentionItem[]): void;
41
+ renderItem?(item: MentionItem): ReactNode;
42
+ emptyText?: string;
43
+ }
44
+ /**
45
+ * Ranks `files` against `query` (case-insensitive), capped to `limit`:
46
+ * name-prefix matches first, then name-substring, then path-substring.
47
+ * Within a tier, shorter names sort first (the more specific match), then
48
+ * alphabetically by path for a stable order. An empty query returns the
49
+ * first `limit` entries unranked — the popover's default list before typing.
50
+ * Pure and dependency-free (no fuzzy-match library) so it's cheap enough to
51
+ * re-run on every keystroke against a 10k-entry index.
52
+ */
53
+ declare function rankFileMentions(files: readonly FileMention[], query: string, limit: number): FileMention[];
54
+ /** Max popover results per query — enough to show a useful spread of matches
55
+ * without pushing the fuzzy-filtered list past what a popover can usefully
56
+ * render in one screen. */
57
+ declare const DEFAULT_MENTION_LIMIT = 20;
58
+ /** How long a `ready` index is served before a background refetch — long
59
+ * enough that a full session's worth of popover opens don't repeatedly hit
60
+ * the index endpoint, short enough that a stale listing doesn't linger too
61
+ * far past workspace file changes. Callers who need the index current right
62
+ * now (e.g. just after the agent creates a file) call `refresh()` instead of
63
+ * waiting on this window. */
64
+ declare const INDEX_REFRESH_AFTER_MS: number;
65
+ /** Popover empty-state copy for a `ready` index whose query matched nothing.
66
+ * Loading/warming/error states have their own copy — see `emptyTextFor`. */
67
+ declare const DEFAULT_MENTION_EMPTY_TEXT = "No matching files";
68
+ /** Define options for configuring file mention fetching, caching, and display behavior */
69
+ interface UseFileMentionsOptions {
70
+ /** GET endpoint returning `FileIndexResponse` (a `createSandboxFileIndexRoute`). */
71
+ indexUrl: string;
72
+ /** Max popover results per query. Default {@link DEFAULT_MENTION_LIMIT}. */
73
+ limit?: number;
74
+ /** How long a `ready` index is served without a background refetch.
75
+ * Default {@link INDEX_REFRESH_AFTER_MS}. */
76
+ refreshAfterMs?: number;
77
+ /** `fetch` override for tests / non-global-fetch hosts. Default `fetch`. */
78
+ fetchImpl?: typeof fetch;
79
+ /** Text shown in the popover's empty state once the index is loaded and
80
+ * the query matched nothing. Default {@link DEFAULT_MENTION_EMPTY_TEXT}. */
81
+ emptyText?: string;
82
+ }
83
+ /** Provide properties and methods to manage and refresh file mentions in a composer interface */
84
+ interface UseFileMentionsResult {
85
+ /** Spread straight into `AgentComposer`'s `mention` prop. */
86
+ mention: ComposerMentionProp;
87
+ /** The files currently referenced by mentions in the composer's value —
88
+ * the send-body list (map through `fileMentionsToParts`). */
89
+ mentions: FileMention[];
90
+ /** Drop all currently-referenced mentions (e.g. after a successful send). */
91
+ clearMentions: () => void;
92
+ /** Force a re-fetch of the index right now, ignoring `refreshAfterMs` — for
93
+ * example right after the agent creates a file mid-session, so the next
94
+ * popover open sees it. Dedupes against an already-in-flight load rather
95
+ * than firing a second request. */
96
+ refresh: () => Promise<void>;
97
+ }
98
+ /** Resolve and manage file mention data with configurable fetching and state handling */
99
+ declare function useFileMentions(options: UseFileMentionsOptions): UseFileMentionsResult;
100
+
101
+ /**
102
+ * Keyboard + pointer model for a trigger-and-popover pair, dependency-free.
103
+ * Outside-mousedown and Escape both close; Escape also returns focus to the
104
+ * trigger so keyboard users aren't dropped at the top of the document. The
105
+ * returned `triggerProps` carry the ARIA contract (`aria-haspopup`/
106
+ * `aria-expanded`); spread them onto the trigger button.
107
+ */
108
+ declare function usePopover(open: boolean, setOpen: (open: boolean) => void): {
109
+ containerRef: react.RefObject<HTMLDivElement | null>;
110
+ triggerRef: react.RefObject<HTMLButtonElement | null>;
111
+ triggerProps: {
112
+ ref: react.RefObject<HTMLButtonElement | null>;
113
+ 'aria-haspopup': true;
114
+ 'aria-expanded': boolean;
115
+ };
116
+ };
117
+ /**
118
+ * The one overlay elevation for floating surfaces — picker menus, popovers,
119
+ * drawers, modals. The theme's `shadow-overlay` utility is landing with the
120
+ * token work; until it does, this is the composer's raised-card literal kept
121
+ * in a single place so every overlay paints the same shadow and the later
122
+ * token swap is a one-line edit (`shadow-overlay` here, `shadow-raised` on
123
+ * the composer card).
124
+ * TODO(theme): swap to `shadow-overlay` once the preset ships it.
125
+ */
126
+ declare const OVERLAY_SHADOW = "shadow-[0_1px_2px_hsl(var(--foreground)/0.05),0_12px_28px_hsl(var(--foreground)/0.07)] dark:shadow-[0_1px_2px_hsl(var(--foreground)/0.14),0_12px_28px_hsl(var(--foreground)/0.22)]";
127
+ /**
128
+ * Guard an async action against double-submit. `run` ignores re-entrant calls
129
+ * while a promise is in flight and flips `pending` so the caller can disable
130
+ * the control — the fix for double-charge / double-approve on a slow network.
131
+ * Settles (success or throw) before clearing, and no-ops state updates after
132
+ * unmount.
133
+ */
134
+ declare function usePending(): {
135
+ pending: boolean;
136
+ run: (action: () => void | Promise<void>) => void;
137
+ };
138
+ interface ModelPickerProps {
139
+ value: string;
140
+ onChange: (id: string) => void;
141
+ /** Catalogue models — from `GET`ing the app's catalogue route (see
142
+ * `runtime/model-catalog`), plus any product-specific entries appended. */
143
+ models: CatalogModel[];
144
+ loading?: boolean;
145
+ /** Render a provider logo/badge; default is a generic sparkle. */
146
+ renderProviderBadge?: (provider: string) => ReactNode;
147
+ /** Section label for `featured` models. */
148
+ recommendedLabel?: string;
149
+ /** Pin a labeled section to the TOP of the list (above Recommended) for the
150
+ * models a product wants surfaced first — e.g. a tuner app's own fine-tuned
151
+ * models (`{ label: 'Your Fine-Tuned Models', match: (m) => m.provider === 'tuner' }`).
152
+ * Matching models are shown only in this section, not duplicated below. */
153
+ priorityGroup?: {
154
+ label: string;
155
+ match: (model: CatalogModel) => boolean;
156
+ };
157
+ }
158
+ /**
159
+ * Searchable model picker pill + popover: a featured/recommended section
160
+ * first, then per-provider groups in catalogue order (the server already
161
+ * sorts providers by tier).
162
+ *
163
+ * This is the CANONICAL ecosystem model picker (see "UI chrome ownership
164
+ * (picker canon)" in AGENTS.md). sandbox-ui's `dashboard/ModelPicker` is
165
+ * legacy — deprecated, frozen, removed at sandbox-ui's next major; new code
166
+ * belongs here.
167
+ */
168
+ declare function ModelPicker({ value, onChange, models, loading, renderProviderBadge, recommendedLabel, priorityGroup }: ModelPickerProps): react.JSX.Element;
169
+ /** One reasoning-budget level: the engine `id` is unchanged (the value the
170
+ * product sends to the loop); only the user-facing `label` is renamed to the
171
+ * plainer "how hard should it think" vocabulary from docs/product-surfaces.md.
172
+ * `low`→Quick, `medium`→Standard, `high`→Extended. The mapping is overridable
173
+ * via `EffortPickerProps.levels`, so a product can relabel without losing the
174
+ * ids the runtime expects. */
175
+ interface EffortLevel {
176
+ id: string;
177
+ label: string;
178
+ }
179
+ declare const DEFAULT_EFFORT_LEVELS: readonly EffortLevel[];
180
+ /** Segments the meter draws — fixed geometry so the ladder stays tabular
181
+ * across levels (and across the trigger and its menu rows). */
182
+ declare const EFFORT_METER_SEGMENTS = 4;
183
+ /**
184
+ * Filled-segment count for a level: 0 for off/none (or an id the levels list
185
+ * does not carry); otherwise the level's position among the non-off choices
186
+ * scaled onto the meter, so the ladder reads low < medium < high and the top
187
+ * level fills the whole scale. The canonical four levels land 0 / 1 / 2 / 4.
188
+ */
189
+ declare function effortMeterFill(levelId: string, levels?: readonly EffortLevel[]): number;
190
+ /**
191
+ * The thinking-strength meter: four 12px bars, filled count = level, filled
192
+ * opacity ramping 25→100% left to right (unfilled at a faint ghost). Purely
193
+ * decorative — the level name is always rendered as text beside it, so the
194
+ * meter is `aria-hidden` and adds no second accessible name.
195
+ */
196
+ declare function EffortMeter({ fill, className }: {
197
+ fill: number;
198
+ className?: string;
199
+ }): react.JSX.Element;
200
+ interface EffortPickerProps {
201
+ value: string;
202
+ onChange: (id: string) => void;
203
+ /** Selectable levels (engine id + user-facing label). Defaults to the plain
204
+ * "Thinking" vocabulary; override to relabel without changing the ids the
205
+ * runtime receives. */
206
+ levels?: readonly EffortLevel[];
207
+ /** Prefix shown before the active level on the pill — the "what is this"
208
+ * context the bare value lacked. Default "Thinking". Pass '' to hide it. */
209
+ label?: string;
210
+ }
211
+ /** Thinking-budget selector pill, styled to match {@link ModelPicker}. Show
212
+ * it only when the selected model `supportsReasoning`. "Thinking" is the
213
+ * plain-English name for what was internally called "effort".
214
+ *
215
+ * The CANONICAL ecosystem effort picker — sandbox-ui's reasoning menu (inside
216
+ * its `chat/AgentSessionControls`) is legacy and frozen. */
217
+ declare function EffortPicker({ value, onChange, levels, label }: EffortPickerProps): react.JSX.Element;
218
+
219
+ interface AgentSessionControlsProps {
220
+ /** Catalog models — canonical provider-prefixed ids. */
221
+ models: CatalogModel[];
222
+ modelsLoading?: boolean;
223
+ /** Selected canonical model id. */
224
+ model: string;
225
+ onModelChange(modelId: string): void;
226
+ /** Current harness; harness↔model coherence is enforced on every change. */
227
+ harness: Harness;
228
+ onHarnessChange(harness: Harness): void;
229
+ /** Harnesses to offer; defaults to the labeled set. */
230
+ availableHarnesses?: ReadonlyArray<Harness>;
231
+ /** Reasoning-effort value + setter. Shown only when the selected model
232
+ * `supportsReasoning`, matching `EffortPicker`'s guidance. */
233
+ effort: string;
234
+ onEffortChange(effort: string): void;
235
+ /**
236
+ * Levels to offer, forwarded verbatim to {@link EffortPicker}. Omit for the
237
+ * default vocabulary.
238
+ *
239
+ * A product whose backend applies only a SUBSET of the levels for the
240
+ * selected harness/model passes that subset here. Without it the strip
241
+ * offers every level and the backend silently ignores the ones it does not
242
+ * apply — a control that reports a choice the system never made.
243
+ */
244
+ effortLevels?: readonly EffortLevel[];
245
+ /**
246
+ * `inline` (default): model, harness, effort side by side — the prior
247
+ * behavior. `compact`: model inline, harness + effort behind a gear popover.
248
+ */
249
+ layout?: 'inline' | 'compact';
250
+ /** Hide the harness control entirely (single-harness products). */
251
+ showHarness?: boolean;
252
+ renderProviderBadge?: (provider: string) => ReactNode;
253
+ className?: string;
254
+ }
255
+ declare function AgentSessionControls(props: AgentSessionControlsProps): react.JSX.Element;
256
+
257
+ export { type AgentSessionControlsProps as A, type ComposerMentionProp as C, DEFAULT_EFFORT_LEVELS as D, EFFORT_METER_SEGMENTS as E, INDEX_REFRESH_AFTER_MS as I, type MentionItem as M, OVERLAY_SHADOW as O, type UseFileMentionsResult as U, AgentSessionControls as a, DEFAULT_MENTION_EMPTY_TEXT as b, DEFAULT_MENTION_LIMIT as c, type EffortLevel as d, EffortMeter as e, EffortPicker as f, type EffortPickerProps as g, ModelPicker as h, type ModelPickerProps as i, type UseFileMentionsOptions as j, effortMeterFill as k, usePending as l, usePopover as m, rankFileMentions as r, useFileMentions as u };
@@ -7,7 +7,7 @@ import '../plans/index.js';
7
7
  import '../parts-BqIHMdyu.js';
8
8
  import '../types-CCeYywdS.js';
9
9
  import '../wire-DOZ-O6hD.js';
10
- import '../agent-session-controls-BwImzYKC.js';
10
+ import '../agent-session-controls-1q1XR3j8.js';
11
11
  import '../harness/index.js';
12
12
  import '../catalog/index.js';
13
13
  import '../agent-activity-C8ZG0F0M.js';
@@ -1,18 +1,19 @@
1
1
  import {
2
2
  ChatComposer,
3
3
  ChatMessages
4
- } from "../chunk-IFYJDX3J.js";
4
+ } from "../chunk-AIHKKLKY.js";
5
5
  import "../chunk-FBVLEGEG.js";
6
- import "../chunk-HZ4WCA37.js";
6
+ import "../chunk-5MZXWPFN.js";
7
7
  import "../chunk-GEYACSFW.js";
8
8
  import {
9
9
  ModelPicker,
10
+ OVERLAY_SHADOW,
10
11
  ProviderLogo
11
- } from "../chunk-L7FHRORY.js";
12
+ } from "../chunk-MIZMWCKW.js";
12
13
  import "../chunk-BATKJP3P.js";
13
14
  import {
14
15
  AsyncView
15
- } from "../chunk-YIQHOAHN.js";
16
+ } from "../chunk-3UBAO3N5.js";
16
17
  import "../chunk-PC2WYTK7.js";
17
18
  import "../chunk-QY4BRKRJ.js";
18
19
  import "../chunk-CCVG2TL6.js";
@@ -1781,7 +1782,7 @@ function AssistantHistory({
1781
1782
  return /* @__PURE__ */ jsxs(
1782
1783
  "li",
1783
1784
  {
1784
- className: `group flex items-center transition-colors hover:bg-muted/60 ${active ? "bg-primary/10" : ""}`,
1785
+ className: `group flex items-center transition-colors hover:bg-accent ${active ? "bg-primary/10" : ""}`,
1785
1786
  children: [
1786
1787
  /* @__PURE__ */ jsxs(
1787
1788
  "button",
@@ -1898,7 +1899,7 @@ function ProposalCard({
1898
1899
  )
1899
1900
  ] })
1900
1901
  ] }),
1901
- showGraph && tab === "graph" ? /* @__PURE__ */ jsx3("div", { className: "mt-1 h-64 overflow-hidden rounded border border-border", children: renderGraph?.(view.preview.content) }) : /* @__PURE__ */ jsx3("pre", { className: "mt-1 max-h-48 overflow-auto rounded border border-border bg-muted/50 p-2 text-xs", children: /* @__PURE__ */ jsx3("code", { children: view.preview.content }) })
1902
+ showGraph && tab === "graph" ? /* @__PURE__ */ jsx3("div", { className: "mt-1 h-64 overflow-hidden rounded border border-border", children: renderGraph?.(view.preview.content) }) : /* @__PURE__ */ jsx3("pre", { className: "mt-1 max-h-48 overflow-auto rounded border border-border bg-secondary p-2 text-xs", children: /* @__PURE__ */ jsx3("code", { children: view.preview.content }) })
1902
1903
  ] }),
1903
1904
  proposal.requirements && proposal.requirements.length > 0 && /* @__PURE__ */ jsxs2("div", { className: "mt-3 rounded border border-border p-2", children: [
1904
1905
  /* @__PURE__ */ jsx3("p", { className: "text-muted-foreground text-xs", children: "Integrations" }),
@@ -2670,7 +2671,7 @@ function AssistantPanel({
2670
2671
  "div",
2671
2672
  {
2672
2673
  role: "status",
2673
- className: "mx-4 mb-2 rounded-lg border border-border bg-muted/40 px-3 py-2 text-sm",
2674
+ className: "mx-4 mb-2 rounded-lg border border-border bg-secondary px-3 py-2 text-sm",
2674
2675
  children: [
2675
2676
  /* @__PURE__ */ jsx5("p", { className: "text-foreground", children: "Your credit balance is running low." }),
2676
2677
  /* @__PURE__ */ jsx5(
@@ -2689,7 +2690,7 @@ function AssistantPanel({
2689
2690
  "div",
2690
2691
  {
2691
2692
  role: "status",
2692
- className: "mx-4 mb-2 flex items-center gap-3 rounded-lg border border-border bg-muted/40 px-3 py-2 text-sm",
2693
+ className: "mx-4 mb-2 flex items-center gap-3 rounded-lg border border-border bg-secondary px-3 py-2 text-sm",
2693
2694
  children: [
2694
2695
  /* @__PURE__ */ jsx5("p", { className: "min-w-0 flex-1 text-foreground", children: "Paused after a lot of steps." }),
2695
2696
  /* @__PURE__ */ jsx5(
@@ -2967,7 +2968,7 @@ function AssistantDock({
2967
2968
  "div",
2968
2969
  {
2969
2970
  "aria-hidden": "true",
2970
- className: "fixed inset-0 z-40 bg-black/40",
2971
+ className: "fixed inset-0 z-40 bg-black/50",
2971
2972
  onClick: () => closeAssistant()
2972
2973
  }
2973
2974
  ),
@@ -2981,7 +2982,7 @@ function AssistantDock({
2981
2982
  tabIndex: -1,
2982
2983
  onKeyDown: trapTab,
2983
2984
  style: isDesktop ? { width: `${width}px` } : void 0,
2984
- className: "fixed inset-y-0 right-0 z-50 flex w-full flex-col border-border border-l shadow-xl focus:outline-none",
2985
+ className: `fixed inset-y-0 right-0 z-50 flex w-full flex-col border-border border-l ${OVERLAY_SHADOW} focus:outline-none`,
2985
2986
  children: [
2986
2987
  /* @__PURE__ */ jsx8(
2987
2988
  AssistantPanel,