@inf-monkeys-tech/monkeys-design 1.0.11 → 1.0.12

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 (58) hide show
  1. package/dist/components/agent-workbench/index.d.mts +57 -2
  2. package/dist/components/agent-workbench/index.d.ts +57 -2
  3. package/dist/components/agent-workbench/index.js +669 -43
  4. package/dist/components/agent-workbench/index.js.map +1 -1
  5. package/dist/components/agent-workbench/index.mjs +636 -39
  6. package/dist/components/agent-workbench/index.mjs.map +1 -1
  7. package/dist/components/base/index.js +32 -0
  8. package/dist/components/base/index.js.map +1 -1
  9. package/dist/components/base/index.mjs +32 -0
  10. package/dist/components/base/index.mjs.map +1 -1
  11. package/dist/components/data-explorer/index.js +32 -0
  12. package/dist/components/data-explorer/index.js.map +1 -1
  13. package/dist/components/data-explorer/index.mjs +32 -0
  14. package/dist/components/data-explorer/index.mjs.map +1 -1
  15. package/dist/components/layout/index.js +32 -0
  16. package/dist/components/layout/index.js.map +1 -1
  17. package/dist/components/layout/index.mjs +32 -0
  18. package/dist/components/layout/index.mjs.map +1 -1
  19. package/dist/components/runtime/index.js +32 -0
  20. package/dist/components/runtime/index.js.map +1 -1
  21. package/dist/components/runtime/index.mjs +32 -0
  22. package/dist/components/runtime/index.mjs.map +1 -1
  23. package/dist/components/toast/index.d.mts +1 -1
  24. package/dist/components/toast/index.d.ts +1 -1
  25. package/dist/components/toast/index.js +32 -0
  26. package/dist/components/toast/index.js.map +1 -1
  27. package/dist/components/toast/index.mjs +32 -0
  28. package/dist/components/toast/index.mjs.map +1 -1
  29. package/dist/components/toolbar/index.js +32 -0
  30. package/dist/components/toolbar/index.js.map +1 -1
  31. package/dist/components/toolbar/index.mjs +32 -0
  32. package/dist/components/toolbar/index.mjs.map +1 -1
  33. package/dist/components/workbench/index.js +32 -0
  34. package/dist/components/workbench/index.js.map +1 -1
  35. package/dist/components/workbench/index.mjs +32 -0
  36. package/dist/components/workbench/index.mjs.map +1 -1
  37. package/dist/index.d.mts +2 -2
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.js +1021 -386
  40. package/dist/index.js.map +1 -1
  41. package/dist/index.mjs +645 -17
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/locale/index.d.mts +70 -2
  44. package/dist/locale/index.d.ts +70 -2
  45. package/dist/locale/index.js +68 -0
  46. package/dist/locale/index.js.map +1 -1
  47. package/dist/locale/index.mjs +68 -0
  48. package/dist/locale/index.mjs.map +1 -1
  49. package/dist/provider/index.d.mts +2 -2
  50. package/dist/provider/index.d.ts +2 -2
  51. package/dist/provider/index.js +68 -0
  52. package/dist/provider/index.js.map +1 -1
  53. package/dist/provider/index.mjs +68 -0
  54. package/dist/provider/index.mjs.map +1 -1
  55. package/dist/styles.css +1 -1
  56. package/dist/{types-3d3e043f0ccb.d.mts → types-37967a434f7c.d.mts} +35 -0
  57. package/dist/{types-3d3e043f0ccb.d.ts → types-37967a434f7c.d.ts} +35 -0
  58. package/package.json +3 -3
package/dist/index.mjs CHANGED
@@ -1,14 +1,24 @@
1
1
  import debounce from 'lodash/debounce.js';
2
2
  import { resolveThemeTokens, buildApplicationHandoffUrl } from '@inf-monkeys-tech/monkeys/runtime';
3
- import React, { forwardRef, useId, useState, useRef, useEffect, createElement, createContext, useCallback, useMemo, useContext, Children, isValidElement, Fragment as Fragment$1, useLayoutEffect } from 'react';
3
+ import * as React2 from 'react';
4
+ import React2__default, { forwardRef, useId, useState, useRef, useEffect, createElement, createContext, useCallback, useMemo, useContext, Children, isValidElement, Fragment as Fragment$1, useLayoutEffect } from 'react';
4
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
- import { TerminalSquare, ChevronDown, Circle, Clock3, Check, X, FileOutput, Download, Loader2, CheckCircle2, XCircle, CircleStop, RefreshCw, AlertCircle, Copy, RotateCcw, FileCode2, Files, TestTube2 } from 'lucide-react';
6
+ import { ChevronDown, Check, ChevronRight, Circle, ChevronUp, Search, X, Plus, Pin, SquarePen, Blocks, Settings, TerminalSquare, Clock3, FileOutput, Download, RefreshCw, Bot, Image, Loader2, CheckCircle2, AlertCircle, Ellipsis, Pencil, Trash2, XCircle, CircleStop, Copy, RotateCcw, FileCode2, Files, TestTube2 } from 'lucide-react';
6
7
  import * as DropdownMenu2 from '@radix-ui/react-dropdown-menu';
7
8
  import { twMerge } from 'tailwind-merge';
8
9
  import * as ContextMenu from '@radix-ui/react-context-menu';
9
10
  import { createPortal } from 'react-dom';
10
11
  import * as Dialog from '@radix-ui/react-dialog';
11
12
  import * as Tooltip2 from '@radix-ui/react-tooltip';
13
+ import * as AccordionPrimitive from '@radix-ui/react-accordion';
14
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
15
+ import * as PopoverPrimitive from '@radix-ui/react-popover';
16
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
17
+ import { Slot } from '@radix-ui/react-slot';
18
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
19
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
20
+ import { cva } from 'class-variance-authority';
21
+ import * as SelectPrimitive from '@radix-ui/react-select';
12
22
  import { useSensors, useSensor, PointerSensor, DndContext, DragOverlay, useDroppable, useDraggable } from '@dnd-kit/core';
13
23
  import { toast as toast$1, Toaster } from 'sonner';
14
24
 
@@ -3074,6 +3084,38 @@ var enUS = {
3074
3084
  label: "Context usage",
3075
3085
  context: ({ used, total }) => `${used} / ${total} tokens`
3076
3086
  },
3087
+ navigation: {
3088
+ search: "Search agents and sessions",
3089
+ searchShortcut: "Focus search",
3090
+ clearSearch: "Clear search",
3091
+ tabsLabel: "Agent workbench navigation",
3092
+ agents: "Agents",
3093
+ sessions: "Sessions",
3094
+ newAgent: "New Agent",
3095
+ newSession: "New Session",
3096
+ capabilities: "Capabilities & Extensions",
3097
+ settings: "Agent Settings",
3098
+ allAgents: "All Agents",
3099
+ recentSessions: "Recent Sessions",
3100
+ builtIn: "Built-in",
3101
+ noDescription: "No description",
3102
+ loading: "Loading...",
3103
+ emptyAgents: "No agents yet",
3104
+ emptySessions: "No sessions yet",
3105
+ noResults: "No matching results",
3106
+ retry: "Retry",
3107
+ pin: "Pin",
3108
+ unpin: "Unpin",
3109
+ rename: "Rename",
3110
+ delete: "Delete",
3111
+ actions: "Actions",
3112
+ save: "Save",
3113
+ cancel: "Cancel",
3114
+ running: "Running",
3115
+ completed: "Completed",
3116
+ failed: "Failed",
3117
+ contextUsage: ({ percent }) => `${percent}% context used`
3118
+ },
3077
3119
  details: {
3078
3120
  title: "Task details",
3079
3121
  description: "Summary and workspace activity",
@@ -3255,6 +3297,38 @@ var zhCN = {
3255
3297
  label: "\u4E0A\u4E0B\u6587\u7528\u91CF",
3256
3298
  context: ({ used, total }) => `${used} / ${total} tokens`
3257
3299
  },
3300
+ navigation: {
3301
+ search: "\u641C\u7D22\u667A\u80FD\u4F53\u548C\u4F1A\u8BDD",
3302
+ searchShortcut: "\u805A\u7126\u641C\u7D22\u6846",
3303
+ clearSearch: "\u6E05\u9664\u641C\u7D22",
3304
+ tabsLabel: "\u667A\u80FD\u4F53\u5DE5\u4F5C\u53F0\u5BFC\u822A",
3305
+ agents: "\u667A\u80FD\u4F53",
3306
+ sessions: "\u4F1A\u8BDD",
3307
+ newAgent: "\u65B0\u5EFA\u667A\u80FD\u4F53",
3308
+ newSession: "\u65B0\u5EFA\u4F1A\u8BDD",
3309
+ capabilities: "\u80FD\u529B\u4E0E\u6269\u5C55",
3310
+ settings: "\u667A\u80FD\u4F53\u8BBE\u7F6E",
3311
+ allAgents: "\u5168\u90E8\u667A\u80FD\u4F53",
3312
+ recentSessions: "\u6700\u8FD1\u4F1A\u8BDD",
3313
+ builtIn: "\u5185\u7F6E",
3314
+ noDescription: "\u6682\u65E0\u63CF\u8FF0",
3315
+ loading: "\u52A0\u8F7D\u4E2D...",
3316
+ emptyAgents: "\u6682\u65E0\u667A\u80FD\u4F53",
3317
+ emptySessions: "\u6682\u65E0\u4F1A\u8BDD",
3318
+ noResults: "\u6CA1\u6709\u5339\u914D\u7ED3\u679C",
3319
+ retry: "\u91CD\u8BD5",
3320
+ pin: "\u7F6E\u9876",
3321
+ unpin: "\u53D6\u6D88\u7F6E\u9876",
3322
+ rename: "\u91CD\u547D\u540D",
3323
+ delete: "\u5220\u9664",
3324
+ actions: "\u64CD\u4F5C",
3325
+ save: "\u4FDD\u5B58",
3326
+ cancel: "\u53D6\u6D88",
3327
+ running: "\u8FD0\u884C\u4E2D",
3328
+ completed: "\u5DF2\u5B8C\u6210",
3329
+ failed: "\u5931\u8D25",
3330
+ contextUsage: ({ percent }) => `\u5DF2\u4F7F\u7528 ${percent}% \u4E0A\u4E0B\u6587`
3331
+ },
3258
3332
  details: {
3259
3333
  title: "\u4EFB\u52A1\u8BE6\u60C5",
3260
3334
  description: "\u6458\u8981\u4E0E\u5DE5\u4F5C\u533A\u6D3B\u52A8",
@@ -3441,6 +3515,10 @@ function mergeMonkeysLocaleMessages(base, override) {
3441
3515
  ...base.agentWorkbench.usage,
3442
3516
  ...override.agentWorkbench?.usage
3443
3517
  },
3518
+ navigation: {
3519
+ ...base.agentWorkbench.navigation,
3520
+ ...override.agentWorkbench?.navigation
3521
+ },
3444
3522
  details: {
3445
3523
  ...base.agentWorkbench.details,
3446
3524
  ...override.agentWorkbench?.details,
@@ -16895,6 +16973,556 @@ function NavigationLayout({
16895
16973
  }
16896
16974
  );
16897
16975
  }
16976
+ var AccordionItem = React2.forwardRef(({ className, style, ...props }, ref) => /* @__PURE__ */ jsx(
16977
+ AccordionPrimitive.Item,
16978
+ {
16979
+ ref,
16980
+ className: cn("border-b", className),
16981
+ style: {
16982
+ borderColor: "var(--monkeys-component-accordion-item-border-color, hsl(var(--border)))",
16983
+ ...style
16984
+ },
16985
+ ...props
16986
+ }
16987
+ ));
16988
+ AccordionItem.displayName = "AccordionItem";
16989
+ var AccordionTrigger = React2.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(AccordionPrimitive.Header, { className: "flex", children: /* @__PURE__ */ jsxs(
16990
+ AccordionPrimitive.Trigger,
16991
+ {
16992
+ ref,
16993
+ className: cn(
16994
+ "flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
16995
+ className
16996
+ ),
16997
+ ...props,
16998
+ children: [
16999
+ children,
17000
+ /* @__PURE__ */ jsx(
17001
+ ChevronDown,
17002
+ {
17003
+ "aria-hidden": "true",
17004
+ className: "h-4 w-4 shrink-0 transition-transform duration-200"
17005
+ }
17006
+ )
17007
+ ]
17008
+ }
17009
+ ) }));
17010
+ AccordionTrigger.displayName = "AccordionTrigger";
17011
+ var AccordionContent = React2.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsx(
17012
+ AccordionPrimitive.Content,
17013
+ {
17014
+ ref,
17015
+ className: "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
17016
+ ...props,
17017
+ children: /* @__PURE__ */ jsx("div", { className: cn("pb-4 pt-0", className), children })
17018
+ }
17019
+ ));
17020
+ AccordionContent.displayName = "AccordionContent";
17021
+ var Checkbox = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
17022
+ CheckboxPrimitive.Root,
17023
+ {
17024
+ ref,
17025
+ className: cn(
17026
+ "peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
17027
+ className
17028
+ ),
17029
+ ...props,
17030
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current", children: /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "h-4 w-4" }) })
17031
+ }
17032
+ ));
17033
+ Checkbox.displayName = "Checkbox";
17034
+ var buttonVariants = cva(
17035
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
17036
+ {
17037
+ variants: {
17038
+ variant: {
17039
+ default: "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",
17040
+ destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
17041
+ outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
17042
+ secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
17043
+ ghost: "hover:bg-accent hover:text-accent-foreground",
17044
+ link: "text-primary underline-offset-4 hover:underline"
17045
+ },
17046
+ size: {
17047
+ default: "h-10 px-4 py-2",
17048
+ sm: "h-9 rounded-sm px-3",
17049
+ lg: "h-11 rounded-md px-8",
17050
+ icon: "h-10 w-10"
17051
+ }
17052
+ },
17053
+ defaultVariants: { variant: "default", size: "default" }
17054
+ }
17055
+ );
17056
+ var Button = React2.forwardRef(
17057
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
17058
+ const Component = asChild ? Slot : "button";
17059
+ return /* @__PURE__ */ jsx(
17060
+ Component,
17061
+ {
17062
+ ref,
17063
+ className: buttonVariants({ variant, size, className }),
17064
+ ...props
17065
+ }
17066
+ );
17067
+ }
17068
+ );
17069
+ Button.displayName = "Button";
17070
+ var PopoverContent = React2.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
17071
+ PopoverPrimitive.Content,
17072
+ {
17073
+ ref,
17074
+ align,
17075
+ sideOffset,
17076
+ className: cn(
17077
+ "z-50 w-72 rounded-lg border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
17078
+ className
17079
+ ),
17080
+ ...props
17081
+ }
17082
+ ) }));
17083
+ PopoverContent.displayName = "PopoverContent";
17084
+ var ScrollArea = React2.forwardRef(
17085
+ ({
17086
+ className,
17087
+ children,
17088
+ viewportClassName,
17089
+ viewportRef,
17090
+ onViewportScroll,
17091
+ scrollbar = true,
17092
+ scrollbarOrientation = "vertical",
17093
+ scrollBarDisabled = false,
17094
+ ...props
17095
+ }, ref) => /* @__PURE__ */ jsxs(
17096
+ ScrollAreaPrimitive.Root,
17097
+ {
17098
+ ref,
17099
+ className: cn(
17100
+ "group relative overflow-hidden",
17101
+ scrollBarDisabled && "no-scrollbar",
17102
+ className
17103
+ ),
17104
+ ...props,
17105
+ children: [
17106
+ /* @__PURE__ */ jsx(
17107
+ ScrollAreaPrimitive.Viewport,
17108
+ {
17109
+ ref: viewportRef,
17110
+ onScroll: onViewportScroll,
17111
+ className: cn("h-full w-full rounded-[inherit]", viewportClassName),
17112
+ children
17113
+ }
17114
+ ),
17115
+ scrollbar ? /* @__PURE__ */ jsx(
17116
+ ScrollBar,
17117
+ {
17118
+ orientation: scrollbarOrientation,
17119
+ className: cn(scrollBarDisabled && "size-0 p-0")
17120
+ }
17121
+ ) : null,
17122
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
17123
+ ]
17124
+ }
17125
+ )
17126
+ );
17127
+ ScrollArea.displayName = "ScrollArea";
17128
+ var ScrollBar = React2.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsx(
17129
+ ScrollAreaPrimitive.ScrollAreaScrollbar,
17130
+ {
17131
+ ref,
17132
+ orientation,
17133
+ className: cn(
17134
+ "flex touch-none select-none opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100 data-[state=visible]:opacity-100",
17135
+ orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-px",
17136
+ orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-px",
17137
+ className
17138
+ ),
17139
+ ...props,
17140
+ children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
17141
+ }
17142
+ ));
17143
+ ScrollBar.displayName = "ScrollBar";
17144
+ var Switch = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
17145
+ SwitchPrimitive.Root,
17146
+ {
17147
+ ref,
17148
+ className: cn(
17149
+ "peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
17150
+ className
17151
+ ),
17152
+ ...props,
17153
+ children: /* @__PURE__ */ jsx(SwitchPrimitive.Thumb, { className: "pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0" })
17154
+ }
17155
+ ));
17156
+ Switch.displayName = "Switch";
17157
+ var Tabs = React2.forwardRef(({ variant = "default", ...props }, ref) => /* @__PURE__ */ jsx(TabsPrimitive.Root, { ref, "data-variant": variant, ...props }));
17158
+ Tabs.displayName = "Tabs";
17159
+ var TabsList = React2.forwardRef(({ className, gap, style, ...props }, ref) => /* @__PURE__ */ jsx(
17160
+ TabsPrimitive.List,
17161
+ {
17162
+ ref,
17163
+ className: cn(
17164
+ "inline-flex h-10 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",
17165
+ className
17166
+ ),
17167
+ style: { gap, ...style },
17168
+ ...props
17169
+ }
17170
+ ));
17171
+ TabsList.displayName = "TabsList";
17172
+ var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
17173
+ TabsPrimitive.Trigger,
17174
+ {
17175
+ ref,
17176
+ className: cn(
17177
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
17178
+ className
17179
+ ),
17180
+ ...props
17181
+ }
17182
+ ));
17183
+ TabsTrigger.displayName = "TabsTrigger";
17184
+ var TabsContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
17185
+ TabsPrimitive.Content,
17186
+ {
17187
+ ref,
17188
+ className: cn(
17189
+ "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
17190
+ className
17191
+ ),
17192
+ ...props
17193
+ }
17194
+ ));
17195
+ TabsContent.displayName = "TabsContent";
17196
+ var TooltipContent = React2.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(Tooltip2.Portal, { children: /* @__PURE__ */ jsx(
17197
+ Tooltip2.Content,
17198
+ {
17199
+ ref,
17200
+ sideOffset,
17201
+ className: cn(
17202
+ "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
17203
+ className
17204
+ ),
17205
+ ...props
17206
+ }
17207
+ ) }));
17208
+ TooltipContent.displayName = "TooltipContent";
17209
+ var menuItemClassName = "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0";
17210
+ var menuContentClassName = "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2";
17211
+ var DropdownMenu4 = DropdownMenu2.Root;
17212
+ var DropdownMenuTrigger = DropdownMenu2.Trigger;
17213
+ var DropdownMenuSubTrigger = React2.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenu2.SubTrigger, { ref, className: cn(menuItemClassName, "data-[state=open]:bg-accent", inset && "pl-8", className), ...props, children: [
17214
+ children,
17215
+ /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true", className: "ml-auto" })
17216
+ ] }));
17217
+ DropdownMenuSubTrigger.displayName = "DropdownMenuSubTrigger";
17218
+ var DropdownMenuSubContent = React2.forwardRef(
17219
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu2.SubContent, { ref, className: cn(menuContentClassName, className), ...props })
17220
+ );
17221
+ DropdownMenuSubContent.displayName = "DropdownMenuSubContent";
17222
+ var DropdownMenuContent = React2.forwardRef(
17223
+ ({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu2.Portal, { children: /* @__PURE__ */ jsx(DropdownMenu2.Content, { ref, sideOffset, className: cn(menuContentClassName, className), ...props }) })
17224
+ );
17225
+ DropdownMenuContent.displayName = "DropdownMenuContent";
17226
+ var DropdownMenuItem = React2.forwardRef(
17227
+ ({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu2.Item, { ref, className: cn(menuItemClassName, inset && "pl-8", className), ...props })
17228
+ );
17229
+ DropdownMenuItem.displayName = "DropdownMenuItem";
17230
+ var DropdownMenuCheckboxItem = React2.forwardRef(
17231
+ ({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenu2.CheckboxItem, { ref, className: cn(menuItemClassName, "pl-8", className), checked, ...props, children: [
17232
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenu2.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "h-4 w-4" }) }) }),
17233
+ children
17234
+ ] })
17235
+ );
17236
+ DropdownMenuCheckboxItem.displayName = "DropdownMenuCheckboxItem";
17237
+ var DropdownMenuRadioItem = React2.forwardRef(
17238
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DropdownMenu2.RadioItem, { ref, className: cn(menuItemClassName, "pl-8", className), ...props, children: [
17239
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx(DropdownMenu2.ItemIndicator, { children: /* @__PURE__ */ jsx(Circle, { "aria-hidden": "true", className: "h-2 w-2 fill-current" }) }) }),
17240
+ children
17241
+ ] })
17242
+ );
17243
+ DropdownMenuRadioItem.displayName = "DropdownMenuRadioItem";
17244
+ var DropdownMenuLabel = React2.forwardRef(
17245
+ ({ className, inset, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu2.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className), ...props })
17246
+ );
17247
+ DropdownMenuLabel.displayName = "DropdownMenuLabel";
17248
+ var DropdownMenuSeparator = React2.forwardRef(
17249
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(DropdownMenu2.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props })
17250
+ );
17251
+ DropdownMenuSeparator.displayName = "DropdownMenuSeparator";
17252
+ var SelectTrigger = React2.forwardRef(
17253
+ ({ className, children, iconClassName, size = "default", ...props }, ref) => /* @__PURE__ */ jsxs(SelectPrimitive.Trigger, { ref, className: cn("flex h-10 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-background px-3 py-2 text-left text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 [&>span]:min-w-0 [&>span]:flex-1 [&>span]:text-left", size === "sm" && "h-8 px-2 py-1 text-xs", className), ...props, children: [
17254
+ children,
17255
+ /* @__PURE__ */ jsx(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className: cn("h-4 w-4 opacity-50", iconClassName) }) })
17256
+ ] })
17257
+ );
17258
+ SelectTrigger.displayName = "SelectTrigger";
17259
+ var SelectScrollUpButton = React2.forwardRef(
17260
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.ScrollUpButton, { ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: /* @__PURE__ */ jsx(ChevronUp, { "aria-hidden": "true", className: "h-4 w-4" }) })
17261
+ );
17262
+ SelectScrollUpButton.displayName = "SelectScrollUpButton";
17263
+ var SelectScrollDownButton = React2.forwardRef(
17264
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.ScrollDownButton, { ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: /* @__PURE__ */ jsx(ChevronDown, { "aria-hidden": "true", className: "h-4 w-4" }) })
17265
+ );
17266
+ SelectScrollDownButton.displayName = "SelectScrollDownButton";
17267
+ var SelectContent = React2.forwardRef(
17268
+ ({ className, children, position = "popper", viewportClassName, disableTriggerViewportSizing = false, ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(SelectPrimitive.Content, { ref, position, className: cn(menuContentClassName, "relative max-h-[var(--radix-select-content-available-height)] overflow-y-auto overflow-x-hidden", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), ...props, children: [
17269
+ /* @__PURE__ */ jsx(SelectScrollUpButton, {}),
17270
+ /* @__PURE__ */ jsx(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" && "w-full min-w-[var(--radix-select-trigger-width)]", position === "popper" && !disableTriggerViewportSizing && "h-[var(--radix-select-trigger-height)]", viewportClassName), children }),
17271
+ /* @__PURE__ */ jsx(SelectScrollDownButton, {})
17272
+ ] }) })
17273
+ );
17274
+ SelectContent.displayName = "SelectContent";
17275
+ var SelectLabel = React2.forwardRef(
17276
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Label, { ref, className: cn("px-2 py-1.5 text-sm font-semibold", className), ...props })
17277
+ );
17278
+ SelectLabel.displayName = "SelectLabel";
17279
+ var SelectItem = React2.forwardRef(
17280
+ ({ className, children, indicatorClassName, itemText, hideIndicator = false, ...props }, ref) => /* @__PURE__ */ jsxs(SelectPrimitive.Item, { ref, className: cn(menuItemClassName, "w-full", hideIndicator ? "px-2" : "pl-8 pr-2", className), ...props, children: [
17281
+ !hideIndicator ? /* @__PURE__ */ jsx("span", { className: cn("absolute left-2 flex h-3.5 w-3.5 items-center justify-center", indicatorClassName), children: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(Check, { "aria-hidden": "true", className: "h-4 w-4" }) }) }) : null,
17282
+ itemText ? /* @__PURE__ */ jsxs(Fragment, { children: [
17283
+ /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: itemText }) }),
17284
+ children
17285
+ ] }) : /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children })
17286
+ ] })
17287
+ );
17288
+ SelectItem.displayName = "SelectItem";
17289
+ var SelectSeparator = React2.forwardRef(
17290
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsx(SelectPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props })
17291
+ );
17292
+ SelectSeparator.displayName = "SelectSeparator";
17293
+ function ItemAvatar({ item }) {
17294
+ const [failed, setFailed] = useState(false);
17295
+ if (item.iconUrl && !failed) {
17296
+ return /* @__PURE__ */ jsx("img", { src: item.iconUrl, alt: "", className: "size-full object-cover", onError: () => setFailed(true) });
17297
+ }
17298
+ const initial = item.name.trim().charAt(0).toLocaleUpperCase();
17299
+ return initial ? /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold", children: initial }) : /* @__PURE__ */ jsx(Bot, { className: "size-4" });
17300
+ }
17301
+ function SessionAvatar({ item }) {
17302
+ const [failed, setFailed] = useState(false);
17303
+ if (item.thumbnailUrl && !failed) {
17304
+ return /* @__PURE__ */ jsx(
17305
+ "img",
17306
+ {
17307
+ src: item.thumbnailUrl,
17308
+ alt: "",
17309
+ className: "size-full object-cover",
17310
+ loading: "lazy",
17311
+ onError: () => setFailed(true)
17312
+ }
17313
+ );
17314
+ }
17315
+ return /* @__PURE__ */ jsx(Image, { className: "size-5", "aria-hidden": "true" });
17316
+ }
17317
+ function CollectionState({
17318
+ status,
17319
+ empty,
17320
+ noResults,
17321
+ hasItems,
17322
+ query,
17323
+ error,
17324
+ onRetry
17325
+ }) {
17326
+ const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;
17327
+ if (status === "loading" && !hasItems) {
17328
+ return /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-sm text-muted-foreground", children: messages.loading });
17329
+ }
17330
+ if (status === "error") {
17331
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 px-3 py-8 text-center", children: [
17332
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", role: "alert", children: error }),
17333
+ /* @__PURE__ */ jsxs("button", { type: "button", className: "inline-flex items-center gap-1.5 text-sm font-medium text-primary", onClick: onRetry, children: [
17334
+ /* @__PURE__ */ jsx(RefreshCw, { className: "size-3.5", "aria-hidden": "true" }),
17335
+ messages.retry
17336
+ ] })
17337
+ ] });
17338
+ }
17339
+ if (!hasItems) {
17340
+ return /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-sm text-muted-foreground", children: query ? noResults : empty });
17341
+ }
17342
+ return null;
17343
+ }
17344
+ function StatusIndicator({ status }) {
17345
+ const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;
17346
+ if (status === "running") {
17347
+ return /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin text-primary", "aria-label": messages.running });
17348
+ }
17349
+ if (status === "completed") {
17350
+ return /* @__PURE__ */ jsx(CheckCircle2, { className: "size-4 text-primary", "aria-label": messages.completed });
17351
+ }
17352
+ if (status === "error") {
17353
+ return /* @__PURE__ */ jsx(AlertCircle, { className: "size-4 text-destructive-text", "aria-label": messages.failed });
17354
+ }
17355
+ return null;
17356
+ }
17357
+ function SessionActions({
17358
+ item,
17359
+ capabilities,
17360
+ onIntent
17361
+ }) {
17362
+ const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;
17363
+ if (!capabilities.renameSessions && !capabilities.deleteSessions) return null;
17364
+ return /* @__PURE__ */ jsxs(DropdownMenu4, { children: [
17365
+ /* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx("button", { type: "button", className: "flex size-8 items-center justify-center rounded-md hover:bg-muted", "aria-label": messages.actions, children: /* @__PURE__ */ jsx(Ellipsis, { className: "size-4", "aria-hidden": "true" }) }) }),
17366
+ /* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", children: [
17367
+ capabilities.renameSessions ? /* @__PURE__ */ jsxs(DropdownMenuItem, { onSelect: () => onIntent?.({ type: "rename-session", sessionId: item.id, title: item.title }), children: [
17368
+ /* @__PURE__ */ jsx(Pencil, { className: "mr-2 size-4", "aria-hidden": "true" }),
17369
+ messages.rename
17370
+ ] }) : null,
17371
+ capabilities.deleteSessions ? /* @__PURE__ */ jsxs(DropdownMenuItem, { className: "text-destructive-text", onSelect: () => onIntent?.({ type: "delete-session", sessionId: item.id }), children: [
17372
+ /* @__PURE__ */ jsx(Trash2, { className: "mr-2 size-4", "aria-hidden": "true" }),
17373
+ messages.delete
17374
+ ] }) : null
17375
+ ] })
17376
+ ] });
17377
+ }
17378
+ function AgentWorkbenchSidebar({ viewModel, className, classNames, onIntent }) {
17379
+ const { locale } = useMonkeysLocale();
17380
+ const messages = useMonkeysLocaleMessages().agentWorkbench.navigation;
17381
+ const searchRef = useRef(null);
17382
+ const query = viewModel.searchQuery.trim().toLocaleLowerCase();
17383
+ const agents = useMemo(
17384
+ () => viewModel.agents.items.filter((item) => !query || `${item.name} ${item.description ?? ""}`.toLocaleLowerCase().includes(query)),
17385
+ [query, viewModel.agents.items]
17386
+ );
17387
+ const sessions = useMemo(
17388
+ () => viewModel.sessions.items.filter((item) => !query || item.title.toLocaleLowerCase().includes(query)),
17389
+ [query, viewModel.sessions.items]
17390
+ );
17391
+ useEffect(() => {
17392
+ const handleShortcut = (event) => {
17393
+ if (!(event.ctrlKey || event.metaKey) || event.key.toLocaleLowerCase() !== "k") return;
17394
+ event.preventDefault();
17395
+ searchRef.current?.focus();
17396
+ searchRef.current?.select();
17397
+ };
17398
+ window.addEventListener("keydown", handleShortcut);
17399
+ return () => window.removeEventListener("keydown", handleShortcut);
17400
+ }, []);
17401
+ return /* @__PURE__ */ jsx("nav", { "aria-label": messages.tabsLabel, className: cn2("h-full min-h-0", classNames?.root, className), children: /* @__PURE__ */ jsxs(
17402
+ Tabs,
17403
+ {
17404
+ value: viewModel.activeTab,
17405
+ onValueChange: (value) => {
17406
+ if (value === "agents" || value === "sessions") onIntent?.({ type: "change-tab", tab: value });
17407
+ },
17408
+ className: "flex h-full min-h-0 flex-col bg-background text-foreground",
17409
+ children: [
17410
+ /* @__PURE__ */ jsxs("div", { className: "shrink-0 space-y-3 p-4 pb-2", children: [
17411
+ /* @__PURE__ */ jsxs("div", { className: cn2("flex h-10 items-center gap-2 rounded-lg border border-border bg-card px-3 focus-within:ring-2 focus-within:ring-ring", classNames?.search), children: [
17412
+ /* @__PURE__ */ jsx(Search, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": "true" }),
17413
+ /* @__PURE__ */ jsx(
17414
+ "input",
17415
+ {
17416
+ ref: searchRef,
17417
+ type: "search",
17418
+ value: viewModel.searchQuery,
17419
+ "aria-label": messages.search,
17420
+ placeholder: messages.search,
17421
+ className: "min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground [&::-webkit-search-cancel-button]:hidden",
17422
+ onChange: (event) => onIntent?.({ type: "change-search", query: event.target.value }),
17423
+ onKeyDown: (event) => {
17424
+ if (event.key !== "Escape") return;
17425
+ onIntent?.({ type: "change-search", query: "" });
17426
+ event.currentTarget.blur();
17427
+ }
17428
+ }
17429
+ ),
17430
+ viewModel.searchQuery ? /* @__PURE__ */ jsx("button", { type: "button", className: "flex size-6 items-center justify-center rounded-md hover:bg-muted", "aria-label": messages.clearSearch, onClick: () => onIntent?.({ type: "change-search", query: "" }), children: /* @__PURE__ */ jsx(X, { className: "size-3.5", "aria-hidden": "true" }) }) : /* @__PURE__ */ jsx("kbd", { className: "rounded border border-border px-1.5 py-0.5 text-[10px] text-muted-foreground", children: "Ctrl K" })
17431
+ ] }),
17432
+ /* @__PURE__ */ jsxs(TabsList, { className: cn2("grid w-full grid-cols-2 text-foreground", classNames?.tabs), "aria-label": messages.tabsLabel, children: [
17433
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "agents", children: messages.agents }),
17434
+ /* @__PURE__ */ jsx(TabsTrigger, { value: "sessions", children: messages.sessions })
17435
+ ] })
17436
+ ] }),
17437
+ /* @__PURE__ */ jsxs(TabsContent, { value: "agents", className: cn2("mt-0 min-h-0 flex-1 overflow-y-auto px-4 pb-4", classNames?.body), children: [
17438
+ viewModel.capabilities.createAgent ? /* @__PURE__ */ jsxs("button", { type: "button", className: "mb-3 flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted", onClick: () => onIntent?.({ type: "create-agent" }), children: [
17439
+ /* @__PURE__ */ jsx(Plus, { className: "size-4", "aria-hidden": "true" }),
17440
+ messages.newAgent
17441
+ ] }) : null,
17442
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 px-3 text-xs font-medium text-muted-foreground", children: messages.allAgents }),
17443
+ /* @__PURE__ */ jsx(CollectionState, { status: viewModel.agents.status, empty: messages.emptyAgents, noResults: messages.noResults, hasItems: agents.length > 0, query, error: viewModel.agents.error, onRetry: () => onIntent?.({ type: "retry-agents" }) }),
17444
+ /* @__PURE__ */ jsx("div", { className: "space-y-1", children: agents.map((item) => /* @__PURE__ */ jsxs(
17445
+ "div",
17446
+ {
17447
+ "aria-current": item.id === viewModel.selectedAgentItem ? "page" : void 0,
17448
+ className: cn2("group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-2 text-left hover:bg-muted aria-[current=page]:border-primary aria-[current=page]:bg-muted", classNames?.item),
17449
+ children: [
17450
+ /* @__PURE__ */ jsxs("button", { type: "button", className: "flex min-w-0 flex-1 items-center gap-3 text-left", onClick: () => onIntent?.({ type: "select-agent", itemId: item.id }), children: [
17451
+ /* @__PURE__ */ jsx("span", { className: "flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ jsx(ItemAvatar, { item }) }),
17452
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
17453
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium", children: item.name }),
17454
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-foreground/80", children: item.description || messages.noDescription })
17455
+ ] })
17456
+ ] }),
17457
+ item.builtIn ? /* @__PURE__ */ jsx("span", { className: "rounded-full bg-muted px-1.5 py-1 text-[10px] text-foreground", children: messages.builtIn }) : null,
17458
+ viewModel.capabilities.pinAgents ? /* @__PURE__ */ jsx(
17459
+ "button",
17460
+ {
17461
+ type: "button",
17462
+ "aria-label": item.pinned ? messages.unpin : messages.pin,
17463
+ className: cn2("flex size-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-muted group-hover:opacity-100", item.pinned && "text-primary opacity-100"),
17464
+ onClick: (event) => {
17465
+ event.stopPropagation();
17466
+ onIntent?.({ type: "toggle-agent-pin", itemId: item.id, pinned: !item.pinned });
17467
+ },
17468
+ onKeyDown: (event) => {
17469
+ if (event.key === "Enter" || event.key === " ") {
17470
+ event.preventDefault();
17471
+ event.stopPropagation();
17472
+ onIntent?.({ type: "toggle-agent-pin", itemId: item.id, pinned: !item.pinned });
17473
+ }
17474
+ },
17475
+ children: /* @__PURE__ */ jsx(Pin, { className: cn2("size-4", item.pinned && "fill-current", item.pinPending && "animate-pulse") })
17476
+ }
17477
+ ) : null
17478
+ ]
17479
+ },
17480
+ item.id
17481
+ )) })
17482
+ ] }),
17483
+ /* @__PURE__ */ jsxs(TabsContent, { value: "sessions", className: cn2("mt-0 min-h-0 flex-1 overflow-y-auto px-4 pb-4", classNames?.body), children: [
17484
+ viewModel.capabilities.createSession ? /* @__PURE__ */ jsxs("button", { type: "button", className: "flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted", onClick: () => onIntent?.({ type: "create-session" }), children: [
17485
+ /* @__PURE__ */ jsx(SquarePen, { className: "size-4", "aria-hidden": "true" }),
17486
+ messages.newSession
17487
+ ] }) : null,
17488
+ viewModel.capabilities.manageCapabilities ? /* @__PURE__ */ jsxs("button", { type: "button", className: "mb-3 flex h-9 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted", onClick: () => onIntent?.({ type: "open-capabilities" }), children: [
17489
+ /* @__PURE__ */ jsx(Blocks, { className: "size-4", "aria-hidden": "true" }),
17490
+ messages.capabilities
17491
+ ] }) : null,
17492
+ /* @__PURE__ */ jsx("h3", { className: "mb-2 px-3 text-xs font-medium text-muted-foreground", children: messages.recentSessions }),
17493
+ /* @__PURE__ */ jsx(CollectionState, { status: viewModel.sessions.status, empty: messages.emptySessions, noResults: messages.noResults, hasItems: sessions.length > 0, query, error: viewModel.sessions.error, onRetry: () => onIntent?.({ type: "retry-sessions" }) }),
17494
+ /* @__PURE__ */ jsx("div", { className: "space-y-1", children: sessions.map((item) => {
17495
+ const percent = item.contextUsage ? Math.min(100, Math.round(item.contextUsage.usedTokens / item.contextUsage.maxTokens * 100)) : void 0;
17496
+ return /* @__PURE__ */ jsxs("div", { "aria-current": item.id === viewModel.selectedSessionItem ? "page" : void 0, className: cn2("group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-2 text-left hover:bg-muted aria-[current=page]:border-primary aria-[current=page]:bg-muted", classNames?.item), children: [
17497
+ /* @__PURE__ */ jsxs("button", { type: "button", className: "flex min-w-0 flex-1 items-center gap-3 text-left", onClick: () => onIntent?.({ type: "select-session", sessionId: item.id }), children: [
17498
+ /* @__PURE__ */ jsx("span", { className: "flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ jsx(SessionAvatar, { item }) }),
17499
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
17500
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium", children: item.title }),
17501
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-foreground/80", children: new Intl.DateTimeFormat(locale, { dateStyle: "medium", timeStyle: "short" }).format(new Date(item.updatedAt)) })
17502
+ ] })
17503
+ ] }),
17504
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
17505
+ percent !== void 0 && item.status === "idle" ? /* @__PURE__ */ jsxs("span", { className: "text-xs text-foreground", "aria-label": messages.contextUsage({ percent }), children: [
17506
+ percent,
17507
+ "%"
17508
+ ] }) : /* @__PURE__ */ jsx(StatusIndicator, { status: item.status }),
17509
+ viewModel.capabilities.pinSessions ? /* @__PURE__ */ jsx("button", { type: "button", "aria-label": item.pinned ? messages.unpin : messages.pin, className: cn2("flex size-8 items-center justify-center rounded-md text-muted-foreground opacity-0 hover:bg-muted group-hover:opacity-100", item.pinned && "text-primary opacity-100"), onClick: (event) => {
17510
+ event.stopPropagation();
17511
+ onIntent?.({ type: "toggle-session-pin", sessionId: item.id, pinned: !item.pinned });
17512
+ }, children: /* @__PURE__ */ jsx(Pin, { className: cn2("size-4", item.pinned && "fill-current") }) }) : null,
17513
+ /* @__PURE__ */ jsx("span", { onClick: (event) => event.stopPropagation(), onKeyDown: (event) => event.stopPropagation(), children: /* @__PURE__ */ jsx(SessionActions, { item, capabilities: viewModel.capabilities, onIntent }) })
17514
+ ] })
17515
+ ] }, item.id);
17516
+ }) })
17517
+ ] }),
17518
+ viewModel.capabilities.manageAgentSettings ? /* @__PURE__ */ jsx("div", { className: cn2("shrink-0 border-t border-border p-4", classNames?.footer), children: /* @__PURE__ */ jsxs("button", { type: "button", className: "flex h-10 w-full items-center gap-2 rounded-md px-3 text-left text-sm font-medium hover:bg-muted", onClick: () => onIntent?.({ type: "open-agent-settings" }), children: [
17519
+ /* @__PURE__ */ jsx(Settings, { className: "size-4", "aria-hidden": "true" }),
17520
+ messages.settings
17521
+ ] }) }) : null
17522
+ ]
17523
+ }
17524
+ ) });
17525
+ }
16898
17526
 
16899
17527
  // src/components/agent-workbench/activity-model.ts
16900
17528
  var EVENT_CAPABILITIES = {
@@ -17057,7 +17685,7 @@ function AgentWorkbenchTool({
17057
17685
  children: [
17058
17686
  /* @__PURE__ */ jsx(TerminalSquare, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": "true" }),
17059
17687
  /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-medium", children: event.payload.toolName }),
17060
- /* @__PURE__ */ jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground", children: [
17688
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex shrink-0 items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-foreground", children: [
17061
17689
  /* @__PURE__ */ jsx(ToolStatus, { status }),
17062
17690
  messages.status[status]
17063
17691
  ] }),
@@ -17087,7 +17715,7 @@ function AgentWorkbenchTool({
17087
17715
  );
17088
17716
  }
17089
17717
  function ActivityDetails({
17090
- icon: Icon,
17718
+ icon: Icon2,
17091
17719
  title,
17092
17720
  open,
17093
17721
  streaming,
@@ -17113,7 +17741,7 @@ function ActivityDetails({
17113
17741
  triggerClassName
17114
17742
  ),
17115
17743
  children: [
17116
- streaming ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 shrink-0 animate-spin", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Icon, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": "true" }),
17744
+ streaming ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 shrink-0 animate-spin", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Icon2, { className: "size-4 shrink-0 text-muted-foreground", "aria-hidden": "true" }),
17117
17745
  /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: title }),
17118
17746
  /* @__PURE__ */ jsx(
17119
17747
  ChevronDown,
@@ -17375,7 +18003,7 @@ function AgentWorkbenchActivity({
17375
18003
  {
17376
18004
  className: cn2("flex justify-end", classNames?.usage),
17377
18005
  "aria-label": messages.usage.label,
17378
- children: /* @__PURE__ */ jsx("span", { className: "rounded-full border border-border bg-muted px-2.5 py-1 text-xs text-muted-foreground", children: messages.usage.context({
18006
+ children: /* @__PURE__ */ jsx("span", { className: "rounded-full border border-border bg-muted px-2.5 py-1 text-xs text-foreground", children: messages.usage.context({
17379
18007
  used: usage.contextTokens ?? usage.totalTokens ?? 0,
17380
18008
  total: contextWindow
17381
18009
  }) })
@@ -17492,12 +18120,12 @@ function formatDate(value, locale) {
17492
18120
  }).format(date);
17493
18121
  }
17494
18122
  function Count({ value }) {
17495
- return /* @__PURE__ */ jsx("span", { className: "rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-semibold text-muted-foreground", children: value });
18123
+ return /* @__PURE__ */ jsx("span", { className: "rounded-full bg-muted px-1.5 py-0.5 text-[10px] font-semibold text-foreground", children: value });
17496
18124
  }
17497
18125
  function DetailsSection({
17498
18126
  title,
17499
18127
  count,
17500
- icon: Icon,
18128
+ icon: Icon2,
17501
18129
  className,
17502
18130
  children
17503
18131
  }) {
@@ -17512,7 +18140,7 @@ function DetailsSection({
17512
18140
  open: true,
17513
18141
  children: [
17514
18142
  /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden", children: [
17515
- /* @__PURE__ */ jsx(Icon, { className: "size-4 text-muted-foreground", "aria-hidden": "true" }),
18143
+ /* @__PURE__ */ jsx(Icon2, { className: "size-4 text-muted-foreground", "aria-hidden": "true" }),
17516
18144
  /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: title }),
17517
18145
  /* @__PURE__ */ jsx(Count, { value: count }),
17518
18146
  /* @__PURE__ */ jsx(
@@ -18070,7 +18698,7 @@ function LoginPage({
18070
18698
  ]
18071
18699
  }
18072
18700
  );
18073
- return /* @__PURE__ */ jsx(React.Fragment, { children: method.render ? method.render(button) : button }, method.id);
18701
+ return /* @__PURE__ */ jsx(React2__default.Fragment, { children: method.render ? method.render(button) : button }, method.id);
18074
18702
  };
18075
18703
  return /* @__PURE__ */ jsxs(
18076
18704
  "main",
@@ -19634,8 +20262,8 @@ function renderWorkbenchIcon(icon, className) {
19634
20262
  if (!icon) return null;
19635
20263
  if (isValidElement(icon)) return icon;
19636
20264
  if (isWorkbenchIconComponent(icon)) {
19637
- const Icon = icon;
19638
- return /* @__PURE__ */ jsx(Icon, { className });
20265
+ const Icon2 = icon;
20266
+ return /* @__PURE__ */ jsx(Icon2, { className });
19639
20267
  }
19640
20268
  return icon;
19641
20269
  }
@@ -28526,7 +29154,7 @@ function DarkModeSelector({
28526
29154
  className: "z-50 min-w-[8rem] rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95",
28527
29155
  sideOffset: 5,
28528
29156
  align: "end",
28529
- children: options.map(({ value, label, Icon }) => /* @__PURE__ */ jsxs(
29157
+ children: options.map(({ value, label, Icon: Icon2 }) => /* @__PURE__ */ jsxs(
28530
29158
  DropdownMenu2.Item,
28531
29159
  {
28532
29160
  className: cn5(
@@ -28535,7 +29163,7 @@ function DarkModeSelector({
28535
29163
  ),
28536
29164
  onSelect: () => onModeChange(value),
28537
29165
  children: [
28538
- /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4" }),
29166
+ /* @__PURE__ */ jsx(Icon2, { className: "h-4 w-4" }),
28539
29167
  label
28540
29168
  ]
28541
29169
  },
@@ -28602,7 +29230,7 @@ function DarkModeSubMenu({
28602
29230
  {
28603
29231
  className: "z-50 min-w-[8rem] rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--popover))] p-1 text-[hsl(var(--popover-foreground))] shadow-md animate-in fade-in-0 zoom-in-95",
28604
29232
  sideOffset: 8,
28605
- children: options.map(({ value, label: optLabel, Icon }) => /* @__PURE__ */ jsxs(
29233
+ children: options.map(({ value, label: optLabel, Icon: Icon2 }) => /* @__PURE__ */ jsxs(
28606
29234
  DropdownMenu2.CheckboxItem,
28607
29235
  {
28608
29236
  checked: mode === value,
@@ -28613,7 +29241,7 @@ function DarkModeSubMenu({
28613
29241
  onCheckedChange: () => onModeChange(value),
28614
29242
  children: [
28615
29243
  /* @__PURE__ */ jsx(DropdownMenu2.ItemIndicator, { className: "absolute left-2 inline-flex items-center justify-center", children: /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) }) }),
28616
- /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4" }),
29244
+ /* @__PURE__ */ jsx(Icon2, { className: "h-4 w-4" }),
28617
29245
  optLabel
28618
29246
  ]
28619
29247
  },
@@ -28743,6 +29371,6 @@ function useDarkMode() {
28743
29371
  return { mode, setMode, resolvedMode };
28744
29372
  }
28745
29373
 
28746
- export { AgentWorkbenchActivity, AgentWorkbenchTaskDetails, AgentWorkbenchTool, AppHeader, AppLayout, AppShellSidebar, AppSidebar, ApplicationHandoffLink, BaseAccordion, BaseAspectRatio, BaseAvatar, BaseBadge, BaseBreadcrumb, BaseButton, BaseCheckbox, BaseCode, BaseContainer, BaseContextMenu, BaseContextMenuCheckboxItem, BaseContextMenuContent, BaseContextMenuItem, BaseContextMenuLabel, BaseContextMenuRadioGroup, BaseContextMenuRadioItem, BaseContextMenuSeparator, BaseContextMenuSub, BaseContextMenuSubContent, BaseContextMenuSubTrigger, BaseContextMenuTrigger, BaseDescriptionList, BaseDialog, BaseDivider, BaseDropdownMenu, BaseEmptyState, BaseField, BaseFieldset, BaseGrid, BaseHeading, BaseInline, BaseInput, BaseInputGroup, BaseKbd, BaseLayout, BaseLayoutPane, BaseLayoutResizeHandle, BaseLayoutSplit, BaseLink, BaseList, BaseListItem, BaseLoadingState, BaseMultiSelect, BaseNotice, BaseNumberInput, BasePagination, BasePanel, BasePasswordInput, BasePortal, BaseProgress, BaseRadioGroup, BaseScrollArea, BaseSectionHeader, BaseSegmentedControl, BaseSelect, BaseSkeleton, BaseSpinner, BaseStack, BaseSteps, BaseSwitch, BaseTable, BaseTableBody, BaseTableCaption, BaseTableCell, BaseTableContainer, BaseTableEmpty, BaseTableFooter, BaseTableFooterBar, BaseTableHead, BaseTableHeader, BaseTableLoading, BaseTableRow, BaseTabs, BaseText, BaseTextarea, BaseToolbar, BaseTooltip, BaseVisuallyHidden, DarkModeSelector, DarkModeSubMenu, DataExplorerActionBar, DataExplorerButton, DataExplorerCheckbox, DataExplorerCollectionFooter, DataExplorerDetailField, DataExplorerDetailSection, DataExplorerDetailShell, DataExplorerDisplayActionMenu, DataExplorerDisplayCard, DataExplorerDisplayCollectionView, DataExplorerDisplayListItem, DataExplorerDisplayMedia, DataExplorerImagePreview, DataExplorerPage, DataExplorerRecordCard, DataExplorerSelect, DataExplorerToolbarActions, DataExplorerToolbarShell, DataExplorerTree, DataExplorerTreeShell, DataExplorerView, DataExplorerViewCollection, DataExplorerViewItem, DataExplorerViewItemShell, DataExplorerViewShell, DataExplorerViewTree, I18nSelector, InteractiveTable, InteractiveTableEditableTextCell, InteractiveTableReadonlyCell, InteractiveTableSelectCell, LoginPage, MonkeysProvider, MonkeysToastProvider, MonkeysToaster, NavButton, NavigationLayout, OverlayNodeHost, RenderNodeHost, MonkeysToastProvider as ToastProvider, MonkeysToaster as Toaster, UserAccountMenu, WorkbenchAssetGallery, WorkbenchContentPane, WorkbenchContentToolbar, WorkbenchDetailSidebar, WorkbenchEvidenceList, WorkbenchGalleryCard, WorkbenchGallerySettingsButton, WorkbenchGallerySettingsPanel, WorkbenchGalleryView, WorkbenchJourneyNavigation, WorkbenchLaneView, WorkbenchMasonryLayout, WorkbenchMetricGrid, WorkbenchRadarFilterChip, WorkbenchRadarInspectorSection, WorkbenchRadarMatrix, WorkbenchRadarNavigation, WorkbenchRadarWorkspace, WorkbenchRankedList, WorkbenchRelationshipGraph, WorkbenchResizableSidebar, WorkbenchScatterPlot, WorkbenchSelectionTray, WorkbenchTableView, applyThemeTokens, browserOverlayHistoryAdapter, buildOverlayUrl, calculateHue, calculateLightness, calculateSaturation, cn2 as cn, compileThemeTokens, createAgentWorkbenchActivityModel, createAgentWorkbenchDetailsModel, createSolidColorScale, defaultMonkeysLocale, enUS, extractToastMessage, genTailwindTheme, getBaseBadgeToneClassName, getBaseButtonToneClassName, getBaseMenuItemToneClassName, getBaseNoticeToneClassName, getDataExplorerActionToneClassName, getDataExplorerMenuItemToneClassName, getOverlayPresentationClassNames, getOverlayZIndex, getRenderNodeDataAttributes, getThemeTokenCssValue, isOverlayUrlActive, markDarkColor, mergeMonkeysLocaleMessages, resolveBaseAppearance, resolveDataExplorerAppearance, resolveMonkeysLocale, resolveRenderNodePolicyState, resolveToastVariantForMessage, sessionRenderNodeScrollRestoration, setTailwindTheme, toast, useDarkMode, useMonkeysBaseAppearance, useMonkeysComponentAttributes, useMonkeysDataExplorerAppearance, useMonkeysDirection, useMonkeysEnvironment, useMonkeysLocale, useMonkeysLocaleMessages, useMonkeysPortalOptions, useMonkeysResolvedTheme, useToastFeed, useToastOnValue, zhCN };
29374
+ export { AgentWorkbenchActivity, AgentWorkbenchSidebar, AgentWorkbenchTaskDetails, AgentWorkbenchTool, AppHeader, AppLayout, AppShellSidebar, AppSidebar, ApplicationHandoffLink, BaseAccordion, BaseAspectRatio, BaseAvatar, BaseBadge, BaseBreadcrumb, BaseButton, BaseCheckbox, BaseCode, BaseContainer, BaseContextMenu, BaseContextMenuCheckboxItem, BaseContextMenuContent, BaseContextMenuItem, BaseContextMenuLabel, BaseContextMenuRadioGroup, BaseContextMenuRadioItem, BaseContextMenuSeparator, BaseContextMenuSub, BaseContextMenuSubContent, BaseContextMenuSubTrigger, BaseContextMenuTrigger, BaseDescriptionList, BaseDialog, BaseDivider, BaseDropdownMenu, BaseEmptyState, BaseField, BaseFieldset, BaseGrid, BaseHeading, BaseInline, BaseInput, BaseInputGroup, BaseKbd, BaseLayout, BaseLayoutPane, BaseLayoutResizeHandle, BaseLayoutSplit, BaseLink, BaseList, BaseListItem, BaseLoadingState, BaseMultiSelect, BaseNotice, BaseNumberInput, BasePagination, BasePanel, BasePasswordInput, BasePortal, BaseProgress, BaseRadioGroup, BaseScrollArea, BaseSectionHeader, BaseSegmentedControl, BaseSelect, BaseSkeleton, BaseSpinner, BaseStack, BaseSteps, BaseSwitch, BaseTable, BaseTableBody, BaseTableCaption, BaseTableCell, BaseTableContainer, BaseTableEmpty, BaseTableFooter, BaseTableFooterBar, BaseTableHead, BaseTableHeader, BaseTableLoading, BaseTableRow, BaseTabs, BaseText, BaseTextarea, BaseToolbar, BaseTooltip, BaseVisuallyHidden, DarkModeSelector, DarkModeSubMenu, DataExplorerActionBar, DataExplorerButton, DataExplorerCheckbox, DataExplorerCollectionFooter, DataExplorerDetailField, DataExplorerDetailSection, DataExplorerDetailShell, DataExplorerDisplayActionMenu, DataExplorerDisplayCard, DataExplorerDisplayCollectionView, DataExplorerDisplayListItem, DataExplorerDisplayMedia, DataExplorerImagePreview, DataExplorerPage, DataExplorerRecordCard, DataExplorerSelect, DataExplorerToolbarActions, DataExplorerToolbarShell, DataExplorerTree, DataExplorerTreeShell, DataExplorerView, DataExplorerViewCollection, DataExplorerViewItem, DataExplorerViewItemShell, DataExplorerViewShell, DataExplorerViewTree, I18nSelector, InteractiveTable, InteractiveTableEditableTextCell, InteractiveTableReadonlyCell, InteractiveTableSelectCell, LoginPage, MonkeysProvider, MonkeysToastProvider, MonkeysToaster, NavButton, NavigationLayout, OverlayNodeHost, RenderNodeHost, MonkeysToastProvider as ToastProvider, MonkeysToaster as Toaster, UserAccountMenu, WorkbenchAssetGallery, WorkbenchContentPane, WorkbenchContentToolbar, WorkbenchDetailSidebar, WorkbenchEvidenceList, WorkbenchGalleryCard, WorkbenchGallerySettingsButton, WorkbenchGallerySettingsPanel, WorkbenchGalleryView, WorkbenchJourneyNavigation, WorkbenchLaneView, WorkbenchMasonryLayout, WorkbenchMetricGrid, WorkbenchRadarFilterChip, WorkbenchRadarInspectorSection, WorkbenchRadarMatrix, WorkbenchRadarNavigation, WorkbenchRadarWorkspace, WorkbenchRankedList, WorkbenchRelationshipGraph, WorkbenchResizableSidebar, WorkbenchScatterPlot, WorkbenchSelectionTray, WorkbenchTableView, applyThemeTokens, browserOverlayHistoryAdapter, buildOverlayUrl, calculateHue, calculateLightness, calculateSaturation, cn2 as cn, compileThemeTokens, createAgentWorkbenchActivityModel, createAgentWorkbenchDetailsModel, createSolidColorScale, defaultMonkeysLocale, enUS, extractToastMessage, genTailwindTheme, getBaseBadgeToneClassName, getBaseButtonToneClassName, getBaseMenuItemToneClassName, getBaseNoticeToneClassName, getDataExplorerActionToneClassName, getDataExplorerMenuItemToneClassName, getOverlayPresentationClassNames, getOverlayZIndex, getRenderNodeDataAttributes, getThemeTokenCssValue, isOverlayUrlActive, markDarkColor, mergeMonkeysLocaleMessages, resolveBaseAppearance, resolveDataExplorerAppearance, resolveMonkeysLocale, resolveRenderNodePolicyState, resolveToastVariantForMessage, sessionRenderNodeScrollRestoration, setTailwindTheme, toast, useDarkMode, useMonkeysBaseAppearance, useMonkeysComponentAttributes, useMonkeysDataExplorerAppearance, useMonkeysDirection, useMonkeysEnvironment, useMonkeysLocale, useMonkeysLocaleMessages, useMonkeysPortalOptions, useMonkeysResolvedTheme, useToastFeed, useToastOnValue, zhCN };
28747
29375
  //# sourceMappingURL=index.mjs.map
28748
29376
  //# sourceMappingURL=index.mjs.map