@tangle-network/sandbox-ui 0.20.3 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/globals.css CHANGED
@@ -30,7 +30,6 @@
30
30
  --color-violet-300: oklch(81.1% 0.111 293.571);
31
31
  --color-violet-400: oklch(70.2% 0.183 293.541);
32
32
  --color-violet-500: oklch(60.6% 0.25 292.717);
33
- --color-gray-300: oklch(87.2% 0.01 258.338);
34
33
  --color-gray-900: oklch(21% 0.034 264.665);
35
34
  --color-zinc-400: oklch(70.5% 0.015 286.067);
36
35
  --color-neutral-400: oklch(70.8% 0 0);
@@ -70,7 +69,6 @@
70
69
  --font-weight-semibold: 600;
71
70
  --font-weight-bold: 700;
72
71
  --font-weight-extrabold: 800;
73
- --font-weight-black: 900;
74
72
  --tracking-tighter: -0.05em;
75
73
  --tracking-tight: -0.025em;
76
74
  --tracking-normal: 0em;
@@ -523,6 +521,9 @@
523
521
  .mb-2 {
524
522
  margin-bottom: calc(var(--spacing) * 2);
525
523
  }
524
+ .mb-2\.5 {
525
+ margin-bottom: calc(var(--spacing) * 2.5);
526
+ }
526
527
  .mb-3 {
527
528
  margin-bottom: calc(var(--spacing) * 3);
528
529
  }
@@ -550,6 +551,9 @@
550
551
  .ml-1 {
551
552
  margin-left: calc(var(--spacing) * 1);
552
553
  }
554
+ .ml-1\.5 {
555
+ margin-left: calc(var(--spacing) * 1.5);
556
+ }
553
557
  .ml-2 {
554
558
  margin-left: calc(var(--spacing) * 2);
555
559
  }
@@ -605,9 +609,6 @@
605
609
  width: calc(var(--spacing) * 6);
606
610
  height: calc(var(--spacing) * 6);
607
611
  }
608
- .h-0\.5 {
609
- height: calc(var(--spacing) * 0.5);
610
- }
611
612
  .h-1 {
612
613
  height: calc(var(--spacing) * 1);
613
614
  }
@@ -668,9 +669,6 @@
668
669
  .h-28 {
669
670
  height: calc(var(--spacing) * 28);
670
671
  }
671
- .h-32 {
672
- height: calc(var(--spacing) * 32);
673
- }
674
672
  .h-48 {
675
673
  height: calc(var(--spacing) * 48);
676
674
  }
@@ -1489,12 +1487,6 @@
1489
1487
  .rounded-\[2px\] {
1490
1488
  border-radius: 2px;
1491
1489
  }
1492
- .rounded-\[14px\] {
1493
- border-radius: 14px;
1494
- }
1495
- .rounded-\[16px\] {
1496
- border-radius: 16px;
1497
- }
1498
1490
  .rounded-\[18px\] {
1499
1491
  border-radius: 18px;
1500
1492
  }
@@ -2056,10 +2048,6 @@
2056
2048
  background-color: color-mix(in oklab, var(--color-yellow-600) 20%, transparent);
2057
2049
  }
2058
2050
  }
2059
- .bg-gradient-to-br {
2060
- --tw-gradient-position: to bottom right in oklab;
2061
- background-image: linear-gradient(var(--tw-gradient-stops));
2062
- }
2063
2051
  .bg-gradient-to-l {
2064
2052
  --tw-gradient-position: to left in oklab;
2065
2053
  background-image: linear-gradient(var(--tw-gradient-stops));
@@ -2111,6 +2099,9 @@
2111
2099
  .p-3 {
2112
2100
  padding: calc(var(--spacing) * 3);
2113
2101
  }
2102
+ .p-3\.5 {
2103
+ padding: calc(var(--spacing) * 3.5);
2104
+ }
2114
2105
  .p-4 {
2115
2106
  padding: calc(var(--spacing) * 4);
2116
2107
  }
@@ -2300,9 +2291,6 @@
2300
2291
  .pb-1 {
2301
2292
  padding-bottom: calc(var(--spacing) * 1);
2302
2293
  }
2303
- .pb-1\.5 {
2304
- padding-bottom: calc(var(--spacing) * 1.5);
2305
- }
2306
2294
  .pb-2 {
2307
2295
  padding-bottom: calc(var(--spacing) * 2);
2308
2296
  }
@@ -2471,10 +2459,6 @@
2471
2459
  --tw-font-weight: var(--font-sans);
2472
2460
  font-weight: var(--font-sans);
2473
2461
  }
2474
- .font-black {
2475
- --tw-font-weight: var(--font-weight-black);
2476
- font-weight: var(--font-weight-black);
2477
- }
2478
2462
  .font-bold {
2479
2463
  --tw-font-weight: var(--font-weight-bold);
2480
2464
  font-weight: var(--font-weight-bold);
@@ -2758,9 +2742,6 @@
2758
2742
  .underline {
2759
2743
  text-decoration-line: underline;
2760
2744
  }
2761
- .underline-offset-2 {
2762
- text-underline-offset: 2px;
2763
- }
2764
2745
  .underline-offset-4 {
2765
2746
  text-underline-offset: 4px;
2766
2747
  }
@@ -2799,10 +2780,6 @@
2799
2780
  --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));
2800
2781
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2801
2782
  }
2802
- .shadow-2xl {
2803
- --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
2804
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2805
- }
2806
2783
  .shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.04\)\] {
2807
2784
  --tw-shadow: 0 1px 2px var(--tw-shadow-color, rgba(15,23,42,0.04));
2808
2785
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2843,18 +2820,10 @@
2843
2820
  --tw-shadow: var(--shadow-glow);
2844
2821
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2845
2822
  }
2846
- .shadow-inner {
2847
- --tw-shadow: inset 0 2px 4px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));
2848
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2849
- }
2850
2823
  .shadow-lg {
2851
2824
  --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2852
2825
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2853
2826
  }
2854
- .shadow-md {
2855
- --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
2856
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
2857
- }
2858
2827
  .shadow-none {
2859
2828
  --tw-shadow: 0 0 #0000;
2860
2829
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -2890,10 +2859,6 @@
2890
2859
  .ring-\[var\(--bg-root\)\] {
2891
2860
  --tw-ring-color: var(--bg-root);
2892
2861
  }
2893
- .ring-offset-2 {
2894
- --tw-ring-offset-width: 2px;
2895
- --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
2896
- }
2897
2862
  .outline {
2898
2863
  outline-style: var(--tw-outline-style);
2899
2864
  outline-width: 1px;
@@ -3042,12 +3007,6 @@
3042
3007
  }
3043
3008
  }
3044
3009
  }
3045
- .peer-focus\:outline-none {
3046
- &:is(:where(.peer):focus ~ *) {
3047
- --tw-outline-style: none;
3048
- outline-style: none;
3049
- }
3050
- }
3051
3010
  .peer-disabled\:cursor-not-allowed {
3052
3011
  &:is(:where(.peer):disabled ~ *) {
3053
3012
  cursor: not-allowed;
@@ -3099,12 +3058,6 @@
3099
3058
  top: calc(var(--spacing) * 0);
3100
3059
  }
3101
3060
  }
3102
- .after\:top-\[2px\] {
3103
- &::after {
3104
- content: var(--tw-content);
3105
- top: 2px;
3106
- }
3107
- }
3108
3061
  .after\:right-0 {
3109
3062
  &::after {
3110
3063
  content: var(--tw-content);
@@ -3117,86 +3070,12 @@
3117
3070
  left: calc(var(--spacing) * 0);
3118
3071
  }
3119
3072
  }
3120
- .after\:left-\[2px\] {
3121
- &::after {
3122
- content: var(--tw-content);
3123
- left: 2px;
3124
- }
3125
- }
3126
- .after\:h-5 {
3127
- &::after {
3128
- content: var(--tw-content);
3129
- height: calc(var(--spacing) * 5);
3130
- }
3131
- }
3132
3073
  .after\:h-\[2px\] {
3133
3074
  &::after {
3134
3075
  content: var(--tw-content);
3135
3076
  height: 2px;
3136
3077
  }
3137
3078
  }
3138
- .after\:w-5 {
3139
- &::after {
3140
- content: var(--tw-content);
3141
- width: calc(var(--spacing) * 5);
3142
- }
3143
- }
3144
- .after\:rounded-full {
3145
- &::after {
3146
- content: var(--tw-content);
3147
- border-radius: calc(infinity * 1px);
3148
- }
3149
- }
3150
- .after\:border {
3151
- &::after {
3152
- content: var(--tw-content);
3153
- border-style: var(--tw-border-style);
3154
- border-width: 1px;
3155
- }
3156
- }
3157
- .after\:border-gray-300 {
3158
- &::after {
3159
- content: var(--tw-content);
3160
- border-color: var(--color-gray-300);
3161
- }
3162
- }
3163
- .after\:bg-white {
3164
- &::after {
3165
- content: var(--tw-content);
3166
- background-color: var(--color-white);
3167
- }
3168
- }
3169
- .after\:transition-all {
3170
- &::after {
3171
- content: var(--tw-content);
3172
- transition-property: all;
3173
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
3174
- transition-duration: var(--tw-duration, var(--default-transition-duration));
3175
- }
3176
- }
3177
- .after\:content-\[\'\'\] {
3178
- &::after {
3179
- --tw-content: '';
3180
- content: var(--tw-content);
3181
- }
3182
- }
3183
- .peer-checked\:after\:translate-x-full {
3184
- &:is(:where(.peer):checked ~ *) {
3185
- &::after {
3186
- content: var(--tw-content);
3187
- --tw-translate-x: 100%;
3188
- translate: var(--tw-translate-x) var(--tw-translate-y);
3189
- }
3190
- }
3191
- }
3192
- .peer-checked\:after\:border-white {
3193
- &:is(:where(.peer):checked ~ *) {
3194
- &::after {
3195
- content: var(--tw-content);
3196
- border-color: var(--color-white);
3197
- }
3198
- }
3199
- }
3200
3079
  .last\:border-0 {
3201
3080
  &:last-child {
3202
3081
  border-style: var(--tw-border-style);
@@ -3266,16 +3145,6 @@
3266
3145
  }
3267
3146
  }
3268
3147
  }
3269
- .hover\:border-red-500\/30 {
3270
- &:hover {
3271
- @media (hover: hover) {
3272
- border-color: color-mix(in srgb, oklch(63.7% 0.237 25.331) 30%, transparent);
3273
- @supports (color: color-mix(in lab, red, red)) {
3274
- border-color: color-mix(in oklab, var(--color-red-500) 30%, transparent);
3275
- }
3276
- }
3277
- }
3278
- }
3279
3148
  .hover\:bg-\[var\(--accent-surface-soft\)\] {
3280
3149
  &:hover {
3281
3150
  @media (hover: hover) {
@@ -3365,16 +3234,6 @@
3365
3234
  }
3366
3235
  }
3367
3236
  }
3368
- .hover\:bg-red-500\/10 {
3369
- &:hover {
3370
- @media (hover: hover) {
3371
- background-color: color-mix(in srgb, oklch(63.7% 0.237 25.331) 10%, transparent);
3372
- @supports (color: color-mix(in lab, red, red)) {
3373
- background-color: color-mix(in oklab, var(--color-red-500) 10%, transparent);
3374
- }
3375
- }
3376
- }
3377
- }
3378
3237
  .hover\:bg-red-600\/30 {
3379
3238
  &:hover {
3380
3239
  @media (hover: hover) {
@@ -3452,22 +3311,6 @@
3452
3311
  }
3453
3312
  }
3454
3313
  }
3455
- .hover\:shadow-sm {
3456
- &:hover {
3457
- @media (hover: hover) {
3458
- --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));
3459
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3460
- }
3461
- }
3462
- }
3463
- .hover\:brightness-95 {
3464
- &:hover {
3465
- @media (hover: hover) {
3466
- --tw-brightness: brightness(95%);
3467
- filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
3468
- }
3469
- }
3470
- }
3471
3314
  .hover\:brightness-110 {
3472
3315
  &:hover {
3473
3316
  @media (hover: hover) {
@@ -3503,11 +3346,6 @@
3503
3346
  color: var(--color-red-400);
3504
3347
  }
3505
3348
  }
3506
- .focus\:underline {
3507
- &:focus {
3508
- text-decoration-line: underline;
3509
- }
3510
- }
3511
3349
  .focus\:ring-0 {
3512
3350
  &:focus {
3513
3351
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
@@ -3632,6 +3470,11 @@
3632
3470
  scale: 0.98;
3633
3471
  }
3634
3472
  }
3473
+ .active\:scale-\[0\.99\] {
3474
+ &:active {
3475
+ scale: 0.99;
3476
+ }
3477
+ }
3635
3478
  .active\:bg-\[var\(--border-accent\)\] {
3636
3479
  &:active {
3637
3480
  background-color: var(--border-accent);
@@ -3657,6 +3500,11 @@
3657
3500
  opacity: 50%;
3658
3501
  }
3659
3502
  }
3503
+ .disabled\:opacity-60 {
3504
+ &:disabled {
3505
+ opacity: 60%;
3506
+ }
3507
+ }
3660
3508
  .data-\[disabled\]\:pointer-events-none {
3661
3509
  &[data-disabled] {
3662
3510
  pointer-events: none;
@@ -3729,14 +3577,9 @@
3729
3577
  translate: var(--tw-translate-x) var(--tw-translate-y);
3730
3578
  }
3731
3579
  }
3732
- .sm\:mx-4 {
3580
+ .sm\:mx-3 {
3733
3581
  @media (width >= 40rem) {
3734
- margin-inline: calc(var(--spacing) * 4);
3735
- }
3736
- }
3737
- .sm\:ml-3 {
3738
- @media (width >= 40rem) {
3739
- margin-left: calc(var(--spacing) * 3);
3582
+ margin-inline: calc(var(--spacing) * 3);
3740
3583
  }
3741
3584
  }
3742
3585
  .sm\:inline {
@@ -3983,9 +3826,9 @@
3983
3826
  border-width: 0px;
3984
3827
  }
3985
3828
  }
3986
- .\[\&\:\:-moz-range-track\]\:h-2 {
3829
+ .\[\&\:\:-moz-range-track\]\:h-1\.5 {
3987
3830
  &::-moz-range-track {
3988
- height: calc(var(--spacing) * 2);
3831
+ height: calc(var(--spacing) * 1.5);
3989
3832
  }
3990
3833
  }
3991
3834
  .\[\&\:\:-moz-range-track\]\:rounded-full {
@@ -3993,9 +3836,9 @@
3993
3836
  border-radius: calc(infinity * 1px);
3994
3837
  }
3995
3838
  }
3996
- .\[\&\:\:-webkit-slider-runnable-track\]\:h-2 {
3839
+ .\[\&\:\:-webkit-slider-runnable-track\]\:h-1\.5 {
3997
3840
  &::-webkit-slider-runnable-track {
3998
- height: calc(var(--spacing) * 2);
3841
+ height: calc(var(--spacing) * 1.5);
3999
3842
  }
4000
3843
  }
4001
3844
  .\[\&\:\:-webkit-slider-runnable-track\]\:rounded-full {
@@ -4003,19 +3846,19 @@
4003
3846
  border-radius: calc(infinity * 1px);
4004
3847
  }
4005
3848
  }
4006
- .\[\&\:\:-webkit-slider-thumb\]\:-mt-\[6px\] {
3849
+ .\[\&\:\:-webkit-slider-thumb\]\:-mt-\[5px\] {
4007
3850
  &::-webkit-slider-thumb {
4008
- margin-top: calc(6px * -1);
3851
+ margin-top: calc(5px * -1);
4009
3852
  }
4010
3853
  }
4011
- .\[\&\:\:-webkit-slider-thumb\]\:h-5 {
3854
+ .\[\&\:\:-webkit-slider-thumb\]\:h-4 {
4012
3855
  &::-webkit-slider-thumb {
4013
- height: calc(var(--spacing) * 5);
3856
+ height: calc(var(--spacing) * 4);
4014
3857
  }
4015
3858
  }
4016
- .\[\&\:\:-webkit-slider-thumb\]\:w-5 {
3859
+ .\[\&\:\:-webkit-slider-thumb\]\:w-4 {
4017
3860
  &::-webkit-slider-thumb {
4018
- width: calc(var(--spacing) * 5);
3861
+ width: calc(var(--spacing) * 4);
4019
3862
  }
4020
3863
  }
4021
3864
  .\[\&\:\:-webkit-slider-thumb\]\:appearance-none {
@@ -4034,31 +3877,12 @@
4034
3877
  border-width: 2px;
4035
3878
  }
4036
3879
  }
4037
- .\[\&\:\:-webkit-slider-thumb\]\:shadow-md {
3880
+ .\[\&\:\:-webkit-slider-thumb\]\:shadow-sm {
4038
3881
  &::-webkit-slider-thumb {
4039
- --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
3882
+ --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));
4040
3883
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4041
3884
  }
4042
3885
  }
4043
- .\[\&\:\:-webkit-slider-thumb\]\:transition-transform {
4044
- &::-webkit-slider-thumb {
4045
- transition-property: transform, translate, scale, rotate;
4046
- transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
4047
- transition-duration: var(--tw-duration, var(--default-transition-duration));
4048
- }
4049
- }
4050
- .\[\&\:\:-webkit-slider-thumb\]\:hover\:scale-110 {
4051
- &::-webkit-slider-thumb {
4052
- &:hover {
4053
- @media (hover: hover) {
4054
- --tw-scale-x: 110%;
4055
- --tw-scale-y: 110%;
4056
- --tw-scale-z: 110%;
4057
- scale: var(--tw-scale-x) var(--tw-scale-y);
4058
- }
4059
- }
4060
- }
4061
- }
4062
3886
  .\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0 {
4063
3887
  &:has([role=checkbox]) {
4064
3888
  padding-right: calc(var(--spacing) * 0);
@@ -0,0 +1,49 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface Backend {
4
+ type: string;
5
+ label: string;
6
+ description?: string;
7
+ }
8
+ interface BackendSelectorProps {
9
+ backends: Backend[];
10
+ selected: string;
11
+ onChange: (selected: string) => void;
12
+ label?: string;
13
+ placeholder?: string;
14
+ className?: string;
15
+ }
16
+ declare function BackendSelector({ backends, selected, onChange, label, placeholder, className, }: BackendSelectorProps): react_jsx_runtime.JSX.Element;
17
+
18
+ /**
19
+ * Sandbox agent harness types — mirrors `BackendType` from
20
+ * `@tangle-network/sandbox` SDK. Kept in lockstep with that enum:
21
+ * if the SDK adds a backend, add it here too.
22
+ */
23
+ type HarnessType = "opencode" | "claude-code" | "codex" | "amp" | "factory-droids" | "cli-base";
24
+ interface HarnessOption extends Backend {
25
+ type: HarnessType;
26
+ }
27
+ /**
28
+ * Default option list with human-readable copy. Order is curated so the
29
+ * recommended choice (`opencode`) appears first; `cli-base` (no agent) last.
30
+ */
31
+ declare const HARNESS_OPTIONS: readonly HarnessOption[];
32
+ interface HarnessPickerProps extends Omit<BackendSelectorProps, "backends" | "selected" | "onChange"> {
33
+ value: HarnessType;
34
+ onChange: (next: HarnessType) => void;
35
+ /** Filter the available harnesses (e.g. by plan tier). Defaults to all. */
36
+ available?: ReadonlyArray<HarnessType>;
37
+ /** Override or extend the option metadata. Keys are HarnessType. */
38
+ optionsOverride?: Partial<Record<HarnessType, Partial<Omit<HarnessOption, "type">>>>;
39
+ }
40
+ /**
41
+ * Type-safe harness/backend selector for sandbox-backed agent products.
42
+ *
43
+ * Wraps the generic {@link BackendSelector} with the canonical harness list
44
+ * baked in, so consumers don't have to re-declare it (or risk drifting from
45
+ * the SDK enum).
46
+ */
47
+ declare function HarnessPicker({ value, onChange, available, optionsOverride, label, ...rest }: HarnessPickerProps): react_jsx_runtime.JSX.Element;
48
+
49
+ export { type Backend as B, HARNESS_OPTIONS as H, BackendSelector as a, type BackendSelectorProps as b, HarnessPicker as c, type HarnessPickerProps as d, type HarnessType as e };
package/dist/hooks.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { AgentStreamEvent, AppendUserMessageOptions, ApplySdkEventOptions, AuthUser, AutomationStreamEvent, BeginAssistantMessageOptions, BotStreamEvent, CompleteAssistantMessageOptions, ConnectionState, RealtimeSessionOptions, RealtimeSessionRegistry, RealtimeSessionRegistryProps, RealtimeSessionState, RealtimeSessionTarget, SSEEvent, SdkSessionAttachment, SdkSessionEvent, SdkSessionSeed, TaskStreamEvent, TerminalStreamEvent, UseAuthOptions, UseAuthResult, UseRunGroupsOptions, UseSSEStreamOptions, UseSSEStreamResult, UseSdkSessionOptions, UseSdkSessionReturn, UseToolCallStreamReturn, createAuthFetcher, useApiKey, useAuth, useAutoScroll, useDropdownMenu, useLiveTime, useRealtimeSession, useRunCollapseState, useRunGroups, useSSEStream, useSdkSession, useToolCallStream } from '@tangle-network/ui/hooks';
2
2
  import * as _tanstack_react_query from '@tanstack/react-query';
3
3
  import { Session } from './types.js';
4
- export { SessionInfo, SidecarAuth, UseSessionStreamOptions, UseSessionStreamResult, UseSidecarAuthOptions, useSessionStream, useSidecarAuth } from './sdk-hooks.js';
4
+ export { e as SendMessageOptions, S as SessionInfo, a as SidecarAuth, U as UseSessionStreamOptions, b as UseSessionStreamResult, c as UseSidecarAuthOptions, u as useSessionStream, d as useSidecarAuth } from './sdk-hooks-jUbIngSV.js';
5
5
  import '@tangle-network/ui/types';
6
6
  import '@tangle-network/ui/stores';
7
7
  import '@tangle-network/ui/sdk-hooks';
@@ -49,6 +49,36 @@ interface UsePtySessionReturn {
49
49
  */
50
50
  declare function usePtySession({ apiUrl, token, onData }: UsePtySessionOptions): UsePtySessionReturn;
51
51
 
52
+ /**
53
+ * Sandbox-level telemetry collected by the sidecar from cgroup v2
54
+ * (Docker) or /proc (Firecracker guest). `cpuPercent` is computed
55
+ * server-side from consecutive samples; sections are null when the
56
+ * source cannot provide them.
57
+ */
58
+ interface SystemMetricsSnapshot {
59
+ cpuPercent: number | null;
60
+ cpuCores: number;
61
+ memory: {
62
+ usedBytes: number;
63
+ totalBytes: number;
64
+ } | null;
65
+ disk: {
66
+ usedBytes: number;
67
+ totalBytes: number;
68
+ path: string;
69
+ } | null;
70
+ source: "cgroup-v2" | "proc";
71
+ }
72
+ interface LatencyPercentiles {
73
+ p50: number | null;
74
+ p95: number | null;
75
+ sampleCount: number;
76
+ }
77
+ interface SandboxLatencyMetrics {
78
+ ttftMs: LatencyPercentiles;
79
+ firstResponseMs: LatencyPercentiles;
80
+ runDurationMs: LatencyPercentiles;
81
+ }
52
82
  /**
53
83
  * Shape returned by the sidecar `/metrics/json` endpoint. Only the
54
84
  * fields read by this hook are modeled; the sidecar may add more.
@@ -67,6 +97,22 @@ interface SidecarMetricsPayload {
67
97
  system?: number;
68
98
  };
69
99
  };
100
+ system?: SystemMetricsSnapshot | null;
101
+ latency?: SandboxLatencyMetrics;
102
+ }
103
+ /**
104
+ * One polled time-series point, sourced from the sandbox-level
105
+ * `system` section. Null values mean the sidecar could not provide
106
+ * that reading — charts must render a gap, not a zero.
107
+ */
108
+ interface SandboxMetricsSample {
109
+ /** Wall-clock ms when the sample was committed client-side. */
110
+ at: number;
111
+ cpuPercent: number | null;
112
+ memoryUsedBytes: number | null;
113
+ memoryTotalBytes: number | null;
114
+ diskUsedBytes: number | null;
115
+ diskTotalBytes: number | null;
70
116
  }
71
117
  interface SandboxMetrics {
72
118
  /**
@@ -92,9 +138,24 @@ interface UseSandboxMetricsOptions {
92
138
  enabled?: boolean;
93
139
  /** Poll cadence; clamped to a 500ms floor. Defaults to 3000. */
94
140
  intervalMs?: number;
141
+ /** Max retained history samples for charting. Defaults to 120. */
142
+ historyLimit?: number;
95
143
  }
96
144
  interface UseSandboxMetricsResult {
97
145
  metrics: SandboxMetrics | null;
146
+ /**
147
+ * Sandbox-level (container/VM) telemetry. Null until the sidecar
148
+ * reports a `system` section — older sidecars never will, and
149
+ * consumers must surface that as "unavailable", not zeros.
150
+ */
151
+ system: SystemMetricsSnapshot | null;
152
+ /** Agent latency percentiles (TTFT, first response, run duration). */
153
+ latency: SandboxLatencyMetrics | null;
154
+ /**
155
+ * Rolling window of system samples (oldest first), capped at
156
+ * `historyLimit`. Cleared when the target sandbox changes.
157
+ */
158
+ history: SandboxMetricsSample[];
98
159
  /**
99
160
  * True only until the first successful sample has arrived (or the
100
161
  * first one after the target `sandboxId` changes). Subsequent polls
@@ -111,7 +172,7 @@ interface UseSandboxMetricsResult {
111
172
  * derives a CPU% value from consecutive cumulative-CPU samples. Used
112
173
  * by the sandbox overview dashboard to drive live CPU/memory panels.
113
174
  */
114
- declare function useSandboxMetrics({ apiBaseUrl, sandboxId, token, enabled, intervalMs, }: UseSandboxMetricsOptions): UseSandboxMetricsResult;
175
+ declare function useSandboxMetrics({ apiBaseUrl, sandboxId, token, enabled, intervalMs, historyLimit, }: UseSandboxMetricsOptions): UseSandboxMetricsResult;
115
176
 
116
177
  /** List all sessions for a sidecar. */
117
178
  declare function useSessions(apiUrl: string, token: string | null): _tanstack_react_query.UseQueryResult<Session[], Error>;
@@ -125,4 +186,4 @@ declare function useRenameSession(apiUrl: string, token: string | null): _tansta
125
186
  title: string;
126
187
  }, unknown>;
127
188
 
128
- export { type SandboxMetrics, type SidecarMetricsPayload, type UsePtySessionOptions, type UsePtySessionReturn, type UseSandboxMetricsOptions, type UseSandboxMetricsResult, useCreateSession, useDeleteSession, usePtySession, useRenameSession, useSandboxMetrics, useSessions };
189
+ export { type LatencyPercentiles, type SandboxLatencyMetrics, type SandboxMetrics, type SandboxMetricsSample, type SidecarMetricsPayload, type SystemMetricsSnapshot, type UsePtySessionOptions, type UsePtySessionReturn, type UseSandboxMetricsOptions, type UseSandboxMetricsResult, useCreateSession, useDeleteSession, usePtySession, useRenameSession, useSandboxMetrics, useSessions };
package/dist/hooks.js CHANGED
@@ -17,14 +17,14 @@ import {
17
17
  useSdkSession,
18
18
  useSessions,
19
19
  useToolCallStream
20
- } from "./chunk-76IQLPW2.js";
20
+ } from "./chunk-SOKKTB7W.js";
21
21
  import {
22
22
  usePtySession
23
23
  } from "./chunk-AG7QDC2Q.js";
24
24
  import {
25
25
  useSessionStream,
26
26
  useSidecarAuth
27
- } from "./chunk-CMY7W45U.js";
27
+ } from "./chunk-MEDE37J5.js";
28
28
  export {
29
29
  RealtimeSessionRegistry,
30
30
  createAuthFetcher,
package/dist/index.d.ts CHANGED
@@ -4,17 +4,19 @@ export { CodeBlock as CodeBlockDisplay, Markdown, MarkdownProps } from '@tangle-
4
4
  export { AgentWorkbench, ApprovalConfidenceStat, ApprovalItem, ApprovalQueue, ApprovalQueueProps, AuditCheck, AuditResults, AuditResultsProps, BannerType, CalendarEvent, CalendarView, CalendarViewProps, ContextBadge, DirectoryPane, DirectoryPaneProps, FormAudit, RuntimePane, RuntimePaneProps, SandboxWorkbench, SandboxWorkbenchArtifact, SandboxWorkbenchCustomArtifact, SandboxWorkbenchFileArtifact, SandboxWorkbenchLayoutOptions, SandboxWorkbenchMarkdownArtifact, SandboxWorkbenchOpenUIArtifact, SandboxWorkbenchProps, SandboxWorkbenchSessionProps, SessionActivityMonitor, SessionActivityMonitorProps, SessionSidebar, SessionSidebarBadge, SessionSidebarFilter, SessionSidebarItem, SessionSidebarLink, SessionSidebarProps, StatusBanner, StatusBannerProps, StatusBar, StatusBarProps, TaskBoard, TaskBoardColumn, TaskBoardItem, TaskBoardProps, TerminalLine, TerminalPanel, TerminalProps, WorkspaceLayout, WorkspaceLayoutProps } from './workspace.js';
5
5
  export { OpenUIAction, OpenUIActionsNode, OpenUIArtifactRenderer, OpenUIArtifactRendererProps, OpenUIBadgeNode, OpenUICardNode, OpenUICodeNode, OpenUIComponentNode, OpenUIGridNode, OpenUIHeadingNode, OpenUIKeyValueNode, OpenUIMarkdownNode, OpenUIPrimitive, OpenUISeparatorNode, OpenUIStackNode, OpenUIStatNode, OpenUITableNode, OpenUITextNode } from '@tangle-network/ui/openui';
6
6
  export { AgentTimeline, AgentTimelineArtifactItem, AgentTimelineCustomItem, AgentTimelineItem, AgentTimelineMessageItem, AgentTimelineProps, AgentTimelineStatusItem, AgentTimelineTone, AgentTimelineToolGroupItem, AgentTimelineToolItem, ChatContainer, ChatContainerProps, ChatInput, ChatInputProps, ChatMessage, ChatMessageProps, MessageList, MessageListProps, MessageRole, PendingFile, ThinkingIndicator, ThinkingIndicatorProps, UserMessage, UserMessageProps } from '@tangle-network/ui/chat';
7
- export { ArtifactAgentDock, ArtifactAgentDockProps, ArtifactAgentDockTransport, ArtifactDockMessage, ArtifactDockStreamEvent, ArtifactKind, ArtifactScope, DEFAULT_REASONING_LEVEL_OPTIONS, ReasoningLevel, ReasoningLevelOption, ReasoningLevelPicker, ReasoningLevelPickerProps, createFetchTransport } from './chat.js';
7
+ export { AgentSessionControls, AgentSessionControlsProps, AgentSessionHarnessControl, AgentSessionModelControl, AgentSessionReasoningControl, ArtifactAgentDock, ArtifactAgentDockProps, ArtifactAgentDockTransport, ArtifactDockMessage, ArtifactDockStreamEvent, ArtifactKind, ArtifactScope, DEFAULT_REASONING_LEVEL_OPTIONS, HARNESS_MODEL_POLICIES, ReasoningLevel, ReasoningLevelOption, ReasoningLevelPicker, ReasoningLevelPickerProps, createFetchTransport, isModelCompatibleWithHarness, modelProvider, snapHarnessToModel, snapModelToHarness } from './chat.js';
8
8
  export { ExpandedToolDetail, ExpandedToolDetailProps, InlineThinkingItem, InlineThinkingItemProps, InlineToolItem, InlineToolItemProps, LiveDuration, RunGroup, RunGroupProps } from '@tangle-network/ui/run';
9
9
  export { CommandPreview, DiffPreview, GlobResultsPreview, GrepResultsPreview, QuestionPreview, WebSearchPreview, WriteFilePreview } from '@tangle-network/ui/tool-previews';
10
10
  export { FileArtifactPane, FileArtifactPaneProps, FileNode, FilePreview, FilePreviewProps, FileTabData, FileTabs, FileTabsProps, FileTree, FileTreeProps, FileTreeVisibilityOptions, RichFileTree, RichFileTreeGitEntry, RichFileTreeGitStatus, RichFileTreeProps, RichFileTreeThemeVars, filterFileTree } from '@tangle-network/ui/files';
11
- export { Backend, BackendConfig, BackendConfigProps, BackendSelector, BackendSelectorProps, BackendStatusData, ClusterStatusBar, ClusterStatusBarProps, ClusterStatusItem, CreditBalance, CreditBalanceProps, DashboardLayout, DashboardLayoutProps, DashboardProfile, DashboardSnapshotInfo, DashboardUser, ExposedPort, GitCommitData, GitPanel, GitPanelProps, GitStatusData, HARNESS_OPTIONS, HarnessPicker, HarnessPickerProps, HarnessType, INSUFFICIENT_BALANCE_CODE, InfoPanel, InfoPanelProps, InsufficientBalance, Invoice, InvoiceTable, InvoiceTableProps, McpServer, NavItem, NetworkConfig, NetworkConfigData, NetworkConfigProps, NewSandboxCard, NewSandboxCardProps, OutOfCreditsModal, OutOfCreditsModalProps, PlanCardData, PlanCards, PlanCardsProps, PlanFeature, PortsList, PortsListProps, ProcessInfo, ProcessList, ProcessListProps, ProductVariant, ProfileAvatar, ProfileAvatarProps, ProfileComparison, ProfileComparisonProps, ProfileSelector, ProfileSelectorProps, PromoBanner, PromoBannerProps, RailButton, RailButtonProps, RailModeButton, RailModeButtonProps, RailSeparator, RailSeparatorProps, ResourceMeter, ResourceMeterProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxCardData, SandboxCardProps, SandboxStatus, SandboxTable, SandboxTableProps, Sidebar, SidebarContent, SidebarContentProps, SidebarPanel, SidebarPanelContent, SidebarPanelContentProps, SidebarPanelHeader, SidebarPanelHeaderProps, SidebarPanelProps, SidebarProps, SidebarProvider, SidebarProviderProps, SidebarRail, SidebarRailFooter, SidebarRailFooterProps, SidebarRailHeader, SidebarRailHeaderProps, SidebarRailNav, SidebarRailNavProps, SidebarRailProps, SidebarUser, SnapshotList, SnapshotListProps, SystemLogsViewer, SystemLogsViewerProps, TeamRole, UsageSummary, UsageSummaryData, UsageSummaryProps, Variant, VariantList, VariantListProps, VariantOutcome, VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar } from './dashboard.js';
12
- export { B as BillingBalance, a as BillingDashboard, b as BillingDashboardProps, c as BillingSubscription, d as BillingUsage, M as ModelInfo, e as ModelPicker, f as ModelPickerProps, g as ModelPickerVariant, P as PricingPage, h as PricingPageProps, i as PricingTier, T as TemplateCard, j as TemplateCardData, k as TemplateCardProps, U as UsageChart, l as UsageChartProps, m as UsageDataPoint, n as canonicalModelId, o as formatContext, p as formatPrice, q as formatPricing } from './template-card-gf-InrfN.js';
11
+ export { BackendConfig, BackendConfigProps, BackendStatusData, ClusterStatusBar, ClusterStatusBarProps, ClusterStatusItem, CreditBalance, CreditBalanceProps, DashboardLayout, DashboardLayoutProps, DashboardProfile, DashboardSnapshotInfo, DashboardUser, ExposedPort, GitCommitData, GitPanel, GitPanelProps, GitStatusData, INSUFFICIENT_BALANCE_CODE, InfoPanel, InfoPanelProps, InsufficientBalance, Invoice, InvoiceTable, InvoiceTableProps, McpServer, MetricAreaChart, MetricAreaChartProps, MetricChartPoint, MetricChartTone, NavItem, NetworkConfig, NetworkConfigData, NetworkConfigProps, NewSandboxCard, NewSandboxCardProps, OutOfCreditsModal, OutOfCreditsModalProps, PlanCardData, PlanCards, PlanCardsProps, PlanFeature, PortsList, PortsListProps, ProcessInfo, ProcessList, ProcessListProps, ProductVariant, ProfileAvatar, ProfileAvatarProps, ProfileComparison, ProfileComparisonProps, ProfileSelector, ProfileSelectorProps, PromoBanner, PromoBannerProps, RailButton, RailButtonProps, RailModeButton, RailModeButtonProps, RailSeparator, RailSeparatorProps, ResourceMeter, ResourceMeterProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxCardData, SandboxCardProps, SandboxStatus, SandboxTable, SandboxTableProps, Sidebar, SidebarContent, SidebarContentProps, SidebarPanel, SidebarPanelContent, SidebarPanelContentProps, SidebarPanelHeader, SidebarPanelHeaderProps, SidebarPanelProps, SidebarProps, SidebarProvider, SidebarProviderProps, SidebarRail, SidebarRailFooter, SidebarRailFooterProps, SidebarRailHeader, SidebarRailHeaderProps, SidebarRailNav, SidebarRailNavProps, SidebarRailProps, SidebarUser, SnapshotList, SnapshotListProps, SystemLogsViewer, SystemLogsViewerProps, TeamRole, UsageSummary, UsageSummaryData, UsageSummaryProps, Variant, VariantList, VariantListProps, VariantOutcome, VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar } from './dashboard.js';
12
+ export { B as Backend, a as BackendSelector, b as BackendSelectorProps, H as HARNESS_OPTIONS, c as HarnessPicker, d as HarnessPickerProps, e as HarnessType } from './harness-picker-C1W3rTeb.js';
13
+ export { M as ModelInfo, a as ModelPicker, b as ModelPickerProps, c as ModelPickerVariant, d as canonicalModelId, f as formatContext, e as formatPricing } from './model-picker-DUfMTQo5.js';
14
+ export { B as BillingBalance, a as BillingDashboard, b as BillingDashboardProps, c as BillingSubscription, d as BillingUsage, P as PricingPage, e as PricingPageProps, f as PricingTier, T as TemplateCard, g as TemplateCardData, h as TemplateCardProps, U as UsageChart, i as UsageChartProps, j as UsageDataPoint, k as formatPrice } from './template-card-UhV3pmRC.js';
13
15
  export { AuthHeader, AuthHeaderProps, GitHubLoginButton, GitHubLoginButtonProps, LoginLayout, LoginLayoutProps, SessionUser, UserMenu, UserMenuProps } from '@tangle-network/ui/auth';
14
16
  export { TangleLoginButton, TangleLoginButtonProps } from './auth.js';
15
17
  export { AgentStreamEvent, AppendUserMessageOptions, ApplySdkEventOptions, AuthUser, AutomationStreamEvent, BeginAssistantMessageOptions, BotStreamEvent, CompleteAssistantMessageOptions, RealtimeSessionOptions, RealtimeSessionRegistry, RealtimeSessionRegistryProps, RealtimeSessionState, RealtimeSessionTarget, SSEEvent, SdkSessionAttachment, SdkSessionEvent, SdkSessionSeed, TaskStreamEvent, TerminalStreamEvent, UseAuthOptions, UseAuthResult, UseRunGroupsOptions, UseSSEStreamOptions, UseSSEStreamResult, UseSdkSessionOptions, UseSdkSessionReturn, UseToolCallStreamReturn, createAuthFetcher, useApiKey, useAuth, useAutoScroll, useDropdownMenu, useLiveTime, useRealtimeSession, useRunCollapseState, useRunGroups, useSSEStream, useSdkSession, useToolCallStream } from '@tangle-network/ui/hooks';
16
18
  export { SandboxMetrics, SidecarMetricsPayload, UsePtySessionOptions, UsePtySessionReturn, UseSandboxMetricsOptions, UseSandboxMetricsResult, useCreateSession, useDeleteSession, usePtySession, useRenameSession, useSandboxMetrics, useSessions } from './hooks.js';
17
- export { SessionInfo, SidecarAuth, UseSessionStreamOptions, UseSessionStreamResult, UseSidecarAuthOptions, useSessionStream, useSidecarAuth } from './sdk-hooks.js';
19
+ export { S as SessionInfo, a as SidecarAuth, U as UseSessionStreamOptions, b as UseSessionStreamResult, c as UseSidecarAuthOptions, u as useSessionStream, d as useSidecarAuth } from './sdk-hooks-jUbIngSV.js';
18
20
  export { ActiveProjectActivity, ActiveSessionActivityOptions, ActiveSessionConnectionOptions, ActiveSessionConnectionState, ActiveSessionReconnectState, ActiveSessionRecord, ActiveSessionStatus, ActiveSessionTransportMode, ActiveSessionsState, RegisterActiveSessionOptions, SessionProjectKey, activeSessionsAtom, addMessage, addParts, bumpActiveSessionActivity, clearChat, getActiveSession, getAllActiveSessions, getAllProjectActivity, getSessionsByActivity, getSessionsForNavbar, getSessionsForProject, getTotalRunningSessionCount, hasBackgroundRunningSessions, isStreamingAtom, messagesAtom, partMapAtom, registerActiveSession, resetActiveSessions, setActiveSessionAttention, setActiveSessionConnection, setActiveSessionError, setActiveSessionRunning, setForegroundActiveSession, unregisterActiveSession, updateActiveSessionMeta, updatePart, useActiveSession, useActiveSessions, useActiveSessionsState, useHasBackgroundRunningSessions, useNavbarSessions, useProjectActivity, useProjectSessions, useSessionsByActivity, useTotalRunningSessions } from '@tangle-network/ui/stores';
19
21
  export { ChatSession, connectSession, disconnectSession, sessionAtom } from './stores.js';
20
22
  export { AgentBranding, CustomToolRenderer, DisplayVariant, FinalTextPart, GroupedMessage, MessageRun, MessageUser, ReasoningPart, Run, RunStats, SessionMessage, SessionPart, TextPart, ToolCategory, ToolDisplayMetadata, ToolPart, ToolState, ToolStatus, ToolTime } from '@tangle-network/ui/types';