@tangle-network/sandbox-ui 0.39.1 → 0.40.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.
@@ -861,6 +861,14 @@ function SandboxCard({
861
861
  const isRunning = sandbox.status === "running";
862
862
  const isTransitioning = sandbox.status === "provisioning" || sandbox.status === "creating";
863
863
  const isStopped = !isRunning && !isTransitioning;
864
+ const isHibernating = sandbox.status === "hibernating";
865
+ const resolveResumeHandler = (status) => {
866
+ if (onResume) return onResume;
867
+ if (status === "hibernating") return onWake;
868
+ return void 0;
869
+ };
870
+ const resumeLabel = isHibernating ? "Wake Sandbox" : "Resume Sandbox";
871
+ const resumeHandler = isStopped ? resolveResumeHandler(sandbox.status) : void 0;
864
872
  return /* @__PURE__ */ jsxs9("div", { className: cn(
865
873
  "group relative flex flex-col justify-between overflow-hidden rounded-lg border bg-card p-5 transition-colors",
866
874
  isRunning ? "border-[var(--status-running)]/30" : "border-border",
@@ -936,15 +944,16 @@ function SandboxCard({
936
944
  ] })
937
945
  ] }),
938
946
  isStopped && /* @__PURE__ */ jsxs9(Fragment4, { children: [
939
- onResume && /* @__PURE__ */ jsxs9(DropdownMenuItem2, { onClick: () => onResume(sandbox.id), children: [
947
+ resumeHandler && /* @__PURE__ */ jsxs9(DropdownMenuItem2, { onClick: () => resumeHandler(sandbox.id), children: [
940
948
  /* @__PURE__ */ jsx10(Power, { className: "mr-2 h-4 w-4" }),
941
- " Resume Sandbox"
949
+ " ",
950
+ resumeLabel
942
951
  ] }),
943
952
  onFork && /* @__PURE__ */ jsxs9(DropdownMenuItem2, { onClick: () => onFork(sandbox.id), children: [
944
953
  /* @__PURE__ */ jsx10(Copy, { className: "mr-2 h-4 w-4" }),
945
954
  " Fork Sandbox"
946
955
  ] }),
947
- (onResume || onFork) && /* @__PURE__ */ jsx10(DropdownMenuSeparator2, {})
956
+ (resumeHandler || onFork) && /* @__PURE__ */ jsx10(DropdownMenuSeparator2, {})
948
957
  ] }),
949
958
  onDelete && canAdminSandbox(sandbox) && /* @__PURE__ */ jsxs9(DropdownMenuItem2, { className: "text-destructive focus:bg-destructive/10 focus:text-destructive", onClick: () => onDelete(sandbox.id), children: [
950
959
  /* @__PURE__ */ jsx10(Trash2, { className: "mr-2 h-4 w-4" }),
@@ -993,15 +1002,15 @@ function SandboxCard({
993
1002
  "button",
994
1003
  {
995
1004
  type: "button",
996
- onClick: () => onWake?.(sandbox.id),
997
- disabled: isTransitioning,
1005
+ onClick: () => resumeHandler?.(sandbox.id),
1006
+ disabled: isTransitioning || !resumeHandler,
998
1007
  className: cn(
999
1008
  "flex w-full items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-semibold transition-colors border",
1000
- isTransitioning ? "bg-muted text-muted-foreground cursor-not-allowed border-border" : "bg-card text-foreground hover:bg-muted border-border active:scale-[0.97]"
1009
+ isTransitioning || !resumeHandler ? "bg-muted text-muted-foreground cursor-not-allowed border-border" : "bg-card text-foreground hover:bg-muted border-border active:scale-[0.97]"
1001
1010
  ),
1002
1011
  children: [
1003
1012
  /* @__PURE__ */ jsx10(Play, { className: "h-4 w-4" }),
1004
- isTransitioning ? "Starting..." : "Wake Sandbox"
1013
+ isTransitioning ? "Starting..." : resumeLabel
1005
1014
  ]
1006
1015
  }
1007
1016
  ) })
@@ -0,0 +1,18 @@
1
+ // src/assistant/provider-label.ts
2
+ var PROVIDER_LABELS = {
3
+ github: "GitHub",
4
+ gitlab: "GitLab",
5
+ slack: "Slack",
6
+ stripe: "Stripe",
7
+ notion: "Notion",
8
+ linear: "Linear",
9
+ discord: "Discord"
10
+ };
11
+ function providerLabel(provider) {
12
+ const key = provider.toLowerCase();
13
+ return PROVIDER_LABELS[key] ?? provider.charAt(0).toUpperCase() + provider.slice(1);
14
+ }
15
+
16
+ export {
17
+ providerLabel
18
+ };
@@ -0,0 +1,207 @@
1
+ import {
2
+ providerLabel
3
+ } from "./chunk-7JLB7UZ3.js";
4
+
5
+ // src/workflows/model.ts
6
+ import { parse as parseYaml } from "yaml";
7
+ var ROW_GAP = 112;
8
+ var BRANCH_X = 300;
9
+ var BRANCH_ROW_GAP = 84;
10
+ var BRANCH_STACK_PADDING = 40;
11
+ function asRecord(v) {
12
+ return v && typeof v === "object" && !Array.isArray(v) ? v : {};
13
+ }
14
+ function str(v) {
15
+ return typeof v === "string" && v.trim() !== "" ? v : void 0;
16
+ }
17
+ function urlHost(url) {
18
+ try {
19
+ return new URL(url).host;
20
+ } catch {
21
+ return url;
22
+ }
23
+ }
24
+ function describeAction(action) {
25
+ const rec = asRecord(action);
26
+ const [kind] = Object.keys(rec);
27
+ const cfg = asRecord(rec[kind]);
28
+ switch (kind) {
29
+ case "sandbox.spawn":
30
+ return {
31
+ title: "Spawn sandbox",
32
+ subtitle: str(cfg.template),
33
+ hasBranches: false,
34
+ isRoot: false,
35
+ tone: "action"
36
+ };
37
+ case "integration.invoke": {
38
+ const path = str(cfg.path);
39
+ return {
40
+ title: "Integration",
41
+ subtitle: path,
42
+ provider: path?.split(".")[0],
43
+ hasBranches: false,
44
+ isRoot: false,
45
+ tone: "action"
46
+ };
47
+ }
48
+ case "notify": {
49
+ const url = str(cfg.url);
50
+ return {
51
+ title: "Notify",
52
+ subtitle: url ? urlHost(url) : void 0,
53
+ hasBranches: false,
54
+ isRoot: false,
55
+ tone: "action"
56
+ };
57
+ }
58
+ case "agent.run":
59
+ return {
60
+ title: "Run agent",
61
+ subtitle: str(cfg.model) ?? str(cfg.profile) ?? str(cfg.prompt),
62
+ hasBranches: false,
63
+ isRoot: false,
64
+ tone: "action"
65
+ };
66
+ case "parallel": {
67
+ const branches = Array.isArray(cfg.branches) ? cfg.branches : [];
68
+ return {
69
+ title: "Parallel",
70
+ subtitle: `${branches.length} branch${branches.length === 1 ? "" : "es"}`,
71
+ badge: branches.length > 0 ? `\xD7${branches.length}` : void 0,
72
+ hasBranches: branches.length > 0,
73
+ isRoot: false,
74
+ tone: "structural"
75
+ };
76
+ }
77
+ case "foreach":
78
+ return {
79
+ title: "For each",
80
+ subtitle: typeof cfg.items === "string" ? cfg.items : "list",
81
+ // Only fans out when a `do` template is actually present.
82
+ hasBranches: Boolean(cfg.do),
83
+ isRoot: false,
84
+ tone: "structural"
85
+ };
86
+ default:
87
+ return {
88
+ title: kind ? kind : "Action",
89
+ hasBranches: false,
90
+ isRoot: false,
91
+ tone: "action"
92
+ };
93
+ }
94
+ }
95
+ function describeTrigger(on) {
96
+ const rec = asRecord(on);
97
+ if (rec.provider_event) {
98
+ const ev = asRecord(rec.provider_event);
99
+ const connection = str(ev.connection);
100
+ const event = str(ev.event);
101
+ const actions = Array.isArray(ev.actions) ? ev.actions.filter((a) => typeof a === "string") : [];
102
+ const repo = str(ev.repo);
103
+ let subtitle = connection ? providerLabel(connection) : "Event";
104
+ if (event) subtitle += ` \xB7 ${event}`;
105
+ if (actions.length > 0) subtitle += ` (${actions.join("/")})`;
106
+ if (repo) subtitle += ` on ${repo}`;
107
+ return {
108
+ title: "Trigger",
109
+ subtitle,
110
+ provider: connection,
111
+ hasBranches: false,
112
+ isRoot: true,
113
+ tone: "trigger"
114
+ };
115
+ }
116
+ if (rec.schedule) {
117
+ const sch = asRecord(rec.schedule);
118
+ const cron = str(sch.cron);
119
+ const tz = str(sch.timezone);
120
+ return {
121
+ title: "Schedule",
122
+ subtitle: cron ? tz ? `${cron} (${tz})` : cron : void 0,
123
+ hasBranches: false,
124
+ isRoot: true,
125
+ tone: "trigger"
126
+ };
127
+ }
128
+ return {
129
+ title: "Trigger",
130
+ hasBranches: false,
131
+ isRoot: true,
132
+ tone: "trigger"
133
+ };
134
+ }
135
+ function buildWorkflowGraph(yaml) {
136
+ if (!yaml || yaml.trim() === "") {
137
+ return { nodes: [], edges: [], error: "No definition" };
138
+ }
139
+ let parsed;
140
+ try {
141
+ parsed = parseYaml(yaml);
142
+ } catch {
143
+ return { nodes: [], edges: [], error: "Invalid YAML" };
144
+ }
145
+ const def = asRecord(parsed);
146
+ const actions = Array.isArray(def.do) ? def.do : [];
147
+ if (!def.on && actions.length === 0) {
148
+ return { nodes: [], edges: [], error: "Empty workflow" };
149
+ }
150
+ const nodes = [];
151
+ const edges = [];
152
+ let y = 0;
153
+ let prevId = null;
154
+ const addEdge = (source, target, branch) => {
155
+ edges.push({
156
+ id: `${source}->${target}`,
157
+ source,
158
+ target,
159
+ sourceHandle: branch ? "branch" : "out"
160
+ });
161
+ };
162
+ if (def.on) {
163
+ nodes.push({
164
+ id: "trigger",
165
+ position: { x: 0, y },
166
+ data: describeTrigger(def.on)
167
+ });
168
+ prevId = "trigger";
169
+ y += ROW_GAP;
170
+ }
171
+ actions.forEach((action, i) => {
172
+ const id = `a${i}`;
173
+ const data = describeAction(action);
174
+ nodes.push({ id, position: { x: 0, y }, data });
175
+ if (prevId) addEdge(prevId, id, false);
176
+ prevId = id;
177
+ const rec = asRecord(action);
178
+ const children = "parallel" in rec ? Array.isArray(asRecord(rec.parallel).branches) ? asRecord(rec.parallel).branches : [] : "foreach" in rec ? (
179
+ // A foreach with no `do` template has no child to render.
180
+ [asRecord(rec.foreach).do].filter(Boolean)
181
+ ) : [];
182
+ if (children.length > 0) {
183
+ let by = y;
184
+ children.forEach((child, j) => {
185
+ const cid = `${id}-b${j}`;
186
+ nodes.push({
187
+ id: cid,
188
+ position: { x: BRANCH_X, y: by },
189
+ data: describeAction(child)
190
+ });
191
+ addEdge(id, cid, true);
192
+ by += BRANCH_ROW_GAP;
193
+ });
194
+ y += Math.max(
195
+ ROW_GAP,
196
+ children.length * BRANCH_ROW_GAP + BRANCH_STACK_PADDING
197
+ );
198
+ } else {
199
+ y += ROW_GAP;
200
+ }
201
+ });
202
+ return { nodes, edges, error: null };
203
+ }
204
+
205
+ export {
206
+ buildWorkflowGraph
207
+ };
@@ -486,11 +486,16 @@ interface SandboxCardProps {
486
486
  sandbox: SandboxCardData;
487
487
  onOpenIDE?: (id: string) => void;
488
488
  onOpenTerminal?: (id: string) => void;
489
+ /** Preferred start handler; drives the footer + dropdown Resume action. */
490
+ onResume?: (id: string) => void;
491
+ /**
492
+ * @deprecated Use `onResume`. Retained for back-compat: only a
493
+ * `hibernating` card falls back to `onWake` when `onResume` is absent.
494
+ */
489
495
  onWake?: (id: string) => void;
490
496
  onRestore?: (id: string) => void;
491
497
  onDelete?: (id: string) => void;
492
498
  onStop?: (id: string) => void;
493
- onResume?: (id: string) => void;
494
499
  onFork?: (id: string) => void;
495
500
  onKeepAlive?: (id: string) => void;
496
501
  onUsage?: (id: string) => void;
package/dist/dashboard.js CHANGED
@@ -52,7 +52,7 @@ import {
52
52
  canAdminSandbox,
53
53
  parseInsufficientBalance,
54
54
  useSidebar
55
- } from "./chunk-EX3UZWLB.js";
55
+ } from "./chunk-6UDHPI2R.js";
56
56
  import {
57
57
  BillingDashboard,
58
58
  InfoPanel,
package/dist/globals.css CHANGED
@@ -623,6 +623,9 @@
623
623
  width: calc(var(--spacing) * 3);
624
624
  height: calc(var(--spacing) * 3);
625
625
  }
626
+ .\!h-2 {
627
+ height: calc(var(--spacing) * 2) !important;
628
+ }
626
629
  .h-1 {
627
630
  height: calc(var(--spacing) * 1);
628
631
  }
@@ -830,6 +833,9 @@
830
833
  .min-h-screen {
831
834
  min-height: 100vh;
832
835
  }
836
+ .\!w-2 {
837
+ width: calc(var(--spacing) * 2) !important;
838
+ }
833
839
  .w-0 {
834
840
  width: calc(var(--spacing) * 0);
835
841
  }
@@ -959,6 +965,9 @@
959
965
  .w-\[72\%\] {
960
966
  width: 72%;
961
967
  }
968
+ .w-\[240px\] {
969
+ width: 240px;
970
+ }
962
971
  .w-\[268px\] {
963
972
  width: 268px;
964
973
  }
@@ -1103,6 +1112,9 @@
1103
1112
  .max-w-xl {
1104
1113
  max-width: var(--container-xl);
1105
1114
  }
1115
+ .\!min-w-0 {
1116
+ min-width: calc(var(--spacing) * 0) !important;
1117
+ }
1106
1118
  .min-w-0 {
1107
1119
  min-width: calc(var(--spacing) * 0);
1108
1120
  }
@@ -1151,6 +1163,9 @@
1151
1163
  .flex-shrink-0 {
1152
1164
  flex-shrink: 0;
1153
1165
  }
1166
+ .shrink {
1167
+ flex-shrink: 1;
1168
+ }
1154
1169
  .shrink-0 {
1155
1170
  flex-shrink: 0;
1156
1171
  }
@@ -1237,6 +1252,9 @@
1237
1252
  .cursor-default {
1238
1253
  cursor: default;
1239
1254
  }
1255
+ .cursor-ew-resize {
1256
+ cursor: ew-resize;
1257
+ }
1240
1258
  .cursor-not-allowed {
1241
1259
  cursor: not-allowed;
1242
1260
  }
@@ -1619,6 +1637,10 @@
1619
1637
  .rounded-bl-lg {
1620
1638
  border-bottom-left-radius: var(--radius-lg);
1621
1639
  }
1640
+ .\!border-0 {
1641
+ border-style: var(--tw-border-style) !important;
1642
+ border-width: 0px !important;
1643
+ }
1622
1644
  .border {
1623
1645
  border-style: var(--tw-border-style);
1624
1646
  border-width: 1px;
@@ -1831,6 +1853,9 @@
1831
1853
  .border-t-transparent {
1832
1854
  border-top-color: transparent;
1833
1855
  }
1856
+ .\!bg-transparent {
1857
+ background-color: transparent !important;
1858
+ }
1834
1859
  .bg-\[color-mix\(in_oklch\,var\(--color-warning\,orange\)_18\%\,transparent\)\] {
1835
1860
  background-color: var(--color-warning,orange);
1836
1861
  @supports (color: color-mix(in lab, red, red)) {
@@ -2952,6 +2977,10 @@
2952
2977
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2953
2978
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2954
2979
  }
2980
+ .shadow-xl {
2981
+ --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2982
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2983
+ }
2955
2984
  .ring {
2956
2985
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
2957
2986
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -3477,6 +3506,13 @@
3477
3506
  }
3478
3507
  }
3479
3508
  }
3509
+ .hover\:opacity-90 {
3510
+ &:hover {
3511
+ @media (hover: hover) {
3512
+ opacity: 90%;
3513
+ }
3514
+ }
3515
+ }
3480
3516
  .hover\:opacity-100 {
3481
3517
  &:hover {
3482
3518
  @media (hover: hover) {
@@ -3686,6 +3722,11 @@
3686
3722
  opacity: 30%;
3687
3723
  }
3688
3724
  }
3725
+ .disabled\:opacity-40 {
3726
+ &:disabled {
3727
+ opacity: 40%;
3728
+ }
3729
+ }
3689
3730
  .disabled\:opacity-50 {
3690
3731
  &:disabled {
3691
3732
  opacity: 50%;
package/dist/hooks.js CHANGED
@@ -18,13 +18,13 @@ import {
18
18
  useSessions,
19
19
  useToolCallStream
20
20
  } from "./chunk-SOKKTB7W.js";
21
- import {
22
- usePtySession
23
- } from "./chunk-77WVVJA4.js";
24
21
  import {
25
22
  useSessionStream,
26
23
  useSidecarAuth
27
24
  } from "./chunk-MEDE37J5.js";
25
+ import {
26
+ usePtySession
27
+ } from "./chunk-77WVVJA4.js";
28
28
  export {
29
29
  RealtimeSessionRegistry,
30
30
  createAuthFetcher,
package/dist/index.js CHANGED
@@ -1,3 +1,27 @@
1
+ import {
2
+ RealtimeSessionRegistry,
3
+ createAuthFetcher,
4
+ useApiKey,
5
+ useAuth,
6
+ useAutoScroll,
7
+ useCreateSession,
8
+ useDeleteSession,
9
+ useDropdownMenu,
10
+ useLiveTime,
11
+ useRealtimeSession,
12
+ useRenameSession,
13
+ useRunCollapseState,
14
+ useRunGroups,
15
+ useSSEStream,
16
+ useSandboxMetrics,
17
+ useSdkSession,
18
+ useSessions,
19
+ useToolCallStream
20
+ } from "./chunk-SOKKTB7W.js";
21
+ import {
22
+ useSessionStream,
23
+ useSidecarAuth
24
+ } from "./chunk-MEDE37J5.js";
1
25
  import {
2
26
  activeSessionsAtom,
3
27
  addMessage,
@@ -52,91 +76,6 @@ import {
52
76
  timeAgo,
53
77
  truncateText
54
78
  } from "./chunk-TK46XFLM.js";
55
- import {
56
- AuthHeader,
57
- GitHubLoginButton,
58
- LoginLayout,
59
- TangleLoginButton,
60
- UserMenu
61
- } from "./chunk-IOB2PW5Z.js";
62
- import {
63
- RealtimeSessionRegistry,
64
- createAuthFetcher,
65
- useApiKey,
66
- useAuth,
67
- useAutoScroll,
68
- useCreateSession,
69
- useDeleteSession,
70
- useDropdownMenu,
71
- useLiveTime,
72
- useRealtimeSession,
73
- useRenameSession,
74
- useRunCollapseState,
75
- useRunGroups,
76
- useSSEStream,
77
- useSandboxMetrics,
78
- useSdkSession,
79
- useSessions,
80
- useToolCallStream
81
- } from "./chunk-SOKKTB7W.js";
82
- import {
83
- usePtySession
84
- } from "./chunk-77WVVJA4.js";
85
- import {
86
- useSessionStream,
87
- useSidecarAuth
88
- } from "./chunk-MEDE37J5.js";
89
- import {
90
- AgentSessionControls,
91
- AgentTimeline,
92
- ArtifactAgentDock,
93
- ChatContainer,
94
- ChatInput,
95
- ChatMessage,
96
- DEFAULT_REASONING_LEVEL_OPTIONS,
97
- HARNESS_MODEL_POLICIES,
98
- MessageList,
99
- ReasoningLevelPicker,
100
- ThinkingIndicator,
101
- UserMessage,
102
- createFetchTransport,
103
- isModelCompatibleWithHarness,
104
- modelProvider,
105
- snapHarnessToModel,
106
- snapModelToHarness
107
- } from "./chunk-CUUUFJF5.js";
108
- import {
109
- ExpandedToolDetail,
110
- InlineThinkingItem,
111
- InlineToolItem,
112
- LiveDuration,
113
- RunGroup
114
- } from "./chunk-JBGKGLD7.js";
115
- import {
116
- AgentWorkbench,
117
- ApprovalQueue,
118
- ArtifactPane,
119
- AuditResults,
120
- CalendarView,
121
- DirectoryPane,
122
- RuntimePane,
123
- SESSION_CREATED_EVENT,
124
- SandboxWorkbench,
125
- SessionActivityMonitor,
126
- SessionSidebar,
127
- StatusBanner,
128
- StatusBar,
129
- TaskBoard,
130
- TerminalPanel,
131
- WorkspaceLayout,
132
- createShellShouldRevalidate,
133
- dispatchSessionCreated,
134
- shellShouldRevalidate,
135
- useOptimisticSessionItems
136
- } from "./chunk-6NDOA4SB.js";
137
- import {
138
- OpenUIArtifactRenderer
139
- } from "./chunk-AZ3AWMTM.js";
140
79
  import {
141
80
  FileArtifactPane,
142
81
  FilePreview,
@@ -199,7 +138,17 @@ import {
199
138
  canAdminSandbox,
200
139
  parseInsufficientBalance,
201
140
  useSidebar
202
- } from "./chunk-EX3UZWLB.js";
141
+ } from "./chunk-6UDHPI2R.js";
142
+ import {
143
+ usePtySession
144
+ } from "./chunk-77WVVJA4.js";
145
+ import {
146
+ AuthHeader,
147
+ GitHubLoginButton,
148
+ LoginLayout,
149
+ TangleLoginButton,
150
+ UserMenu
151
+ } from "./chunk-IOB2PW5Z.js";
203
152
  import {
204
153
  BillingDashboard,
205
154
  InfoPanel,
@@ -295,6 +244,25 @@ import {
295
244
  useTheme,
296
245
  useToast
297
246
  } from "./chunk-4ZZUMXPX.js";
247
+ import {
248
+ AgentSessionControls,
249
+ AgentTimeline,
250
+ ArtifactAgentDock,
251
+ ChatContainer,
252
+ ChatInput,
253
+ ChatMessage,
254
+ DEFAULT_REASONING_LEVEL_OPTIONS,
255
+ HARNESS_MODEL_POLICIES,
256
+ MessageList,
257
+ ReasoningLevelPicker,
258
+ ThinkingIndicator,
259
+ UserMessage,
260
+ createFetchTransport,
261
+ isModelCompatibleWithHarness,
262
+ modelProvider,
263
+ snapHarnessToModel,
264
+ snapModelToHarness
265
+ } from "./chunk-CUUUFJF5.js";
298
266
  import {
299
267
  BackendSelector,
300
268
  HARNESS_BRAND,
@@ -312,7 +280,39 @@ import {
312
280
  formatPricing,
313
281
  modelDedupKey
314
282
  } from "./chunk-3RNYDTQ3.js";
283
+ import {
284
+ ExpandedToolDetail,
285
+ InlineThinkingItem,
286
+ InlineToolItem,
287
+ LiveDuration,
288
+ RunGroup
289
+ } from "./chunk-JBGKGLD7.js";
290
+ import {
291
+ AgentWorkbench,
292
+ ApprovalQueue,
293
+ ArtifactPane,
294
+ AuditResults,
295
+ CalendarView,
296
+ DirectoryPane,
297
+ RuntimePane,
298
+ SESSION_CREATED_EVENT,
299
+ SandboxWorkbench,
300
+ SessionActivityMonitor,
301
+ SessionSidebar,
302
+ StatusBanner,
303
+ StatusBar,
304
+ TaskBoard,
305
+ TerminalPanel,
306
+ WorkspaceLayout,
307
+ createShellShouldRevalidate,
308
+ dispatchSessionCreated,
309
+ shellShouldRevalidate,
310
+ useOptimisticSessionItems
311
+ } from "./chunk-6NDOA4SB.js";
315
312
  import "./chunk-EI44GEQ5.js";
313
+ import {
314
+ OpenUIArtifactRenderer
315
+ } from "./chunk-AZ3AWMTM.js";
316
316
 
317
317
  // src/index.ts
318
318
  import { CodeBlock as CodeBlock2 } from "@tangle-network/ui/markdown";