llms-py 3.0.0b4__py3-none-any.whl → 3.0.0b6__py3-none-any.whl

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.
llms/ui/App.mjs CHANGED
@@ -49,7 +49,7 @@ const LeftPanel = {
49
49
 
50
50
  const TopBar = {
51
51
  template: `
52
- <div class="flex space-x-2">
52
+ <div class="flex space-x-1">
53
53
  <div v-for="(icon, id) in $ctx.top" :key="id" class="relative flex items-center justify-center">
54
54
  <component :is="icon.component"
55
55
  class="size-7 p-1 cursor-pointer text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 block"
@@ -60,7 +60,7 @@ const TopBar = {
60
60
  <div v-if="tooltip === icon.id && !icon.isActive({ ...$layout })"
61
61
  class="absolute top-full mt-2 px-2 py-1 text-xs text-white bg-gray-900 dark:bg-gray-800 rounded shadow-md z-50 whitespace-nowrap pointer-events-none"
62
62
  :class="last2.includes(id) ? 'right-0' : 'left-1/2 -translate-x-1/2'">
63
- {{icon.name}}
63
+ {{icon.title ?? icon.name}}
64
64
  </div>
65
65
  </div>
66
66
  </div>
@@ -178,7 +178,7 @@ export default {
178
178
  <TopBar />
179
179
  </div>
180
180
  <TopPanel class="shrink-0" />
181
- <div class="flex-1 overflow-hidden min-h-0 flex flex-col">
181
+ <div class="flex-1 overflow-y-auto min-h-0 flex flex-col">
182
182
  <RouterView class="h-full" />
183
183
  </div>
184
184
  </div>
llms/ui/ai.mjs CHANGED
@@ -5,7 +5,7 @@ const headers = { 'Accept': 'application/json' }
5
5
  const prefsKey = 'llms.prefs'
6
6
 
7
7
  export const o = {
8
- version: '3.0.0b4',
8
+ version: '3.0.0b6',
9
9
  base,
10
10
  prefsKey,
11
11
  welcome: 'Welcome to llms.py',
llms/ui/app.css CHANGED
@@ -80,7 +80,12 @@
80
80
  --color-purple-700: oklch(49.6% 0.265 301.924);
81
81
  --color-purple-800: oklch(43.8% 0.218 303.724);
82
82
  --color-purple-900: oklch(38.1% 0.176 304.987);
83
+ --color-fuchsia-100: oklch(95.2% 0.037 318.852);
84
+ --color-fuchsia-200: oklch(90.3% 0.076 319.62);
85
+ --color-fuchsia-300: oklch(83.3% 0.145 321.434);
83
86
  --color-fuchsia-600: oklch(59.1% 0.293 322.896);
87
+ --color-fuchsia-800: oklch(45.2% 0.211 324.591);
88
+ --color-fuchsia-900: oklch(40.1% 0.17 325.612);
84
89
  --color-slate-50: oklch(98.4% 0.003 247.858);
85
90
  --color-slate-200: oklch(92.9% 0.013 255.508);
86
91
  --color-slate-400: oklch(70.4% 0.04 256.788);
@@ -110,6 +115,7 @@
110
115
  --container-2xl: 42rem;
111
116
  --container-3xl: 48rem;
112
117
  --container-6xl: 72rem;
118
+ --container-7xl: 80rem;
113
119
  --text-xs: 0.75rem;
114
120
  --text-xs--line-height: calc(1 / 0.75);
115
121
  --text-sm: 0.875rem;
@@ -347,6 +353,9 @@
347
353
  .top-0 {
348
354
  top: calc(var(--spacing) * 0);
349
355
  }
356
+ .top-1 {
357
+ top: calc(var(--spacing) * 1);
358
+ }
350
359
  .top-1\/2 {
351
360
  top: calc(1/2 * 100%);
352
361
  }
@@ -374,6 +383,9 @@
374
383
  .left-0 {
375
384
  left: calc(var(--spacing) * 0);
376
385
  }
386
+ .left-1 {
387
+ left: calc(var(--spacing) * 1);
388
+ }
377
389
  .left-1\/2 {
378
390
  left: calc(1/2 * 100%);
379
391
  }
@@ -440,9 +452,15 @@
440
452
  max-width: 96rem;
441
453
  }
442
454
  }
455
+ .-m-2 {
456
+ margin: calc(var(--spacing) * -2);
457
+ }
443
458
  .-m-2\.5 {
444
459
  margin: calc(var(--spacing) * -2.5);
445
460
  }
461
+ .-mx-1 {
462
+ margin-inline: calc(var(--spacing) * -1);
463
+ }
446
464
  .-mx-1\.5 {
447
465
  margin-inline: calc(var(--spacing) * -1.5);
448
466
  }
@@ -455,6 +473,9 @@
455
473
  .mx-auto {
456
474
  margin-inline: auto;
457
475
  }
476
+ .-my-1 {
477
+ margin-block: calc(var(--spacing) * -1);
478
+ }
458
479
  .-my-1\.5 {
459
480
  margin-block: calc(var(--spacing) * -1.5);
460
481
  }
@@ -476,6 +497,9 @@
476
497
  .-mt-36 {
477
498
  margin-top: calc(var(--spacing) * -36);
478
499
  }
500
+ .mt-0 {
501
+ margin-top: calc(var(--spacing) * 0);
502
+ }
479
503
  .mt-0\.5 {
480
504
  margin-top: calc(var(--spacing) * 0.5);
481
505
  }
@@ -503,6 +527,9 @@
503
527
  .mt-10 {
504
528
  margin-top: calc(var(--spacing) * 10);
505
529
  }
530
+ .mt-auto {
531
+ margin-top: auto;
532
+ }
506
533
  .mr-1 {
507
534
  margin-right: calc(var(--spacing) * 1);
508
535
  }
@@ -593,6 +620,10 @@
593
620
  .table {
594
621
  display: table;
595
622
  }
623
+ .size-3 {
624
+ width: calc(var(--spacing) * 3);
625
+ height: calc(var(--spacing) * 3);
626
+ }
596
627
  .size-3\.5 {
597
628
  width: calc(var(--spacing) * 3.5);
598
629
  height: calc(var(--spacing) * 3.5);
@@ -762,6 +793,9 @@
762
793
  .max-w-6xl {
763
794
  max-width: var(--container-6xl);
764
795
  }
796
+ .max-w-7xl {
797
+ max-width: var(--container-7xl);
798
+ }
765
799
  .max-w-48 {
766
800
  max-width: calc(var(--spacing) * 48);
767
801
  }
@@ -841,6 +875,10 @@
841
875
  .origin-top-right {
842
876
  transform-origin: 100% 0;
843
877
  }
878
+ .-translate-x-1 {
879
+ --tw-translate-x: calc(var(--spacing) * -1);
880
+ translate: var(--tw-translate-x) var(--tw-translate-y);
881
+ }
844
882
  .-translate-x-1\/2 {
845
883
  --tw-translate-x: calc(calc(1/2 * 100%) * -1);
846
884
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -861,6 +899,10 @@
861
899
  --tw-translate-x: 100%;
862
900
  translate: var(--tw-translate-x) var(--tw-translate-y);
863
901
  }
902
+ .-translate-y-1 {
903
+ --tw-translate-y: calc(var(--spacing) * -1);
904
+ translate: var(--tw-translate-x) var(--tw-translate-y);
905
+ }
864
906
  .-translate-y-1\/2 {
865
907
  --tw-translate-y: calc(calc(1/2 * 100%) * -1);
866
908
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -930,6 +972,9 @@
930
972
  .flex-wrap {
931
973
  flex-wrap: wrap;
932
974
  }
975
+ .items-baseline {
976
+ align-items: baseline;
977
+ }
933
978
  .items-center {
934
979
  align-items: center;
935
980
  }
@@ -986,6 +1031,13 @@
986
1031
  margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
987
1032
  }
988
1033
  }
1034
+ .space-y-3 {
1035
+ :where(& > :not(:last-child)) {
1036
+ --tw-space-y-reverse: 0;
1037
+ margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));
1038
+ margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));
1039
+ }
1040
+ }
989
1041
  .space-y-4 {
990
1042
  :where(& > :not(:last-child)) {
991
1043
  --tw-space-y-reverse: 0;
@@ -1000,6 +1052,9 @@
1000
1052
  margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));
1001
1053
  }
1002
1054
  }
1055
+ .gap-x-1 {
1056
+ column-gap: calc(var(--spacing) * 1);
1057
+ }
1003
1058
  .gap-x-1\.5 {
1004
1059
  column-gap: calc(var(--spacing) * 1.5);
1005
1060
  }
@@ -1168,6 +1223,10 @@
1168
1223
  border-bottom-style: var(--tw-border-style);
1169
1224
  border-bottom-width: 2px;
1170
1225
  }
1226
+ .border-l {
1227
+ border-left-style: var(--tw-border-style);
1228
+ border-left-width: 1px;
1229
+ }
1171
1230
  .border-l-4 {
1172
1231
  border-left-style: var(--tw-border-style);
1173
1232
  border-left-width: 4px;
@@ -1191,6 +1250,9 @@
1191
1250
  .border-blue-600 {
1192
1251
  border-color: var(--color-blue-600);
1193
1252
  }
1253
+ .border-fuchsia-200 {
1254
+ border-color: var(--color-fuchsia-200);
1255
+ }
1194
1256
  .border-gray-100 {
1195
1257
  border-color: var(--color-gray-100);
1196
1258
  }
@@ -1206,12 +1268,18 @@
1206
1268
  .border-gray-700 {
1207
1269
  border-color: var(--color-gray-700);
1208
1270
  }
1271
+ .border-green-200 {
1272
+ border-color: var(--color-green-200);
1273
+ }
1209
1274
  .border-green-400 {
1210
1275
  border-color: var(--color-green-400);
1211
1276
  }
1212
1277
  .border-indigo-500 {
1213
1278
  border-color: var(--color-indigo-500);
1214
1279
  }
1280
+ .border-purple-200 {
1281
+ border-color: var(--color-purple-200);
1282
+ }
1215
1283
  .border-red-200 {
1216
1284
  border-color: var(--color-red-200);
1217
1285
  }
@@ -1227,6 +1295,9 @@
1227
1295
  .border-yellow-400 {
1228
1296
  border-color: var(--color-yellow-400);
1229
1297
  }
1298
+ .bg-black {
1299
+ background-color: var(--color-black);
1300
+ }
1230
1301
  .bg-black\/40 {
1231
1302
  background-color: color-mix(in srgb, #000 40%, transparent);
1232
1303
  @supports (color: color-mix(in lab, red, red)) {
@@ -1257,12 +1328,21 @@
1257
1328
  .bg-cyan-600 {
1258
1329
  background-color: var(--color-cyan-600);
1259
1330
  }
1331
+ .bg-fuchsia-100 {
1332
+ background-color: var(--color-fuchsia-100);
1333
+ }
1260
1334
  .bg-fuchsia-600 {
1261
1335
  background-color: var(--color-fuchsia-600);
1262
1336
  }
1263
1337
  .bg-gray-50 {
1264
1338
  background-color: var(--color-gray-50);
1265
1339
  }
1340
+ .bg-gray-50\/30 {
1341
+ background-color: color-mix(in srgb, oklch(98.5% 0.002 247.839) 30%, transparent);
1342
+ @supports (color: color-mix(in lab, red, red)) {
1343
+ background-color: color-mix(in oklab, var(--color-gray-50) 30%, transparent);
1344
+ }
1345
+ }
1266
1346
  .bg-gray-100 {
1267
1347
  background-color: var(--color-gray-100);
1268
1348
  }
@@ -1275,6 +1355,9 @@
1275
1355
  .bg-gray-400 {
1276
1356
  background-color: var(--color-gray-400);
1277
1357
  }
1358
+ .bg-gray-500 {
1359
+ background-color: var(--color-gray-500);
1360
+ }
1278
1361
  .bg-gray-500\/75 {
1279
1362
  background-color: color-mix(in srgb, oklch(55.1% 0.027 264.364) 75%, transparent);
1280
1363
  @supports (color: color-mix(in lab, red, red)) {
@@ -1338,6 +1421,9 @@
1338
1421
  .bg-sky-600 {
1339
1422
  background-color: var(--color-sky-600);
1340
1423
  }
1424
+ .bg-slate-400 {
1425
+ background-color: var(--color-slate-400);
1426
+ }
1341
1427
  .bg-slate-400\/10 {
1342
1428
  background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 10%, transparent);
1343
1429
  @supports (color: color-mix(in lab, red, red)) {
@@ -1413,6 +1499,9 @@
1413
1499
  .px-6 {
1414
1500
  padding-inline: calc(var(--spacing) * 6);
1415
1501
  }
1502
+ .py-0 {
1503
+ padding-block: calc(var(--spacing) * 0);
1504
+ }
1416
1505
  .py-0\.5 {
1417
1506
  padding-block: calc(var(--spacing) * 0.5);
1418
1507
  }
@@ -1443,6 +1532,9 @@
1443
1532
  .py-12 {
1444
1533
  padding-block: calc(var(--spacing) * 12);
1445
1534
  }
1535
+ .pt-0 {
1536
+ padding-top: calc(var(--spacing) * 0);
1537
+ }
1446
1538
  .pt-0\.5 {
1447
1539
  padding-top: calc(var(--spacing) * 0.5);
1448
1540
  }
@@ -1585,6 +1677,9 @@
1585
1677
  font-size: var(--text-xs);
1586
1678
  line-height: var(--tw-leading, var(--text-xs--line-height));
1587
1679
  }
1680
+ .text-\[10px\] {
1681
+ font-size: 10px;
1682
+ }
1588
1683
  .text-\[11px\] {
1589
1684
  font-size: 11px;
1590
1685
  }
@@ -1634,6 +1729,9 @@
1634
1729
  .break-words {
1635
1730
  overflow-wrap: break-word;
1636
1731
  }
1732
+ .break-all {
1733
+ word-break: break-all;
1734
+ }
1637
1735
  .text-ellipsis {
1638
1736
  text-overflow: ellipsis;
1639
1737
  }
@@ -1655,6 +1753,9 @@
1655
1753
  .text-blue-600 {
1656
1754
  color: var(--color-blue-600);
1657
1755
  }
1756
+ .text-blue-600\! {
1757
+ color: var(--color-blue-600) !important;
1758
+ }
1658
1759
  .text-blue-700 {
1659
1760
  color: var(--color-blue-700);
1660
1761
  }
@@ -1664,6 +1765,9 @@
1664
1765
  .text-cyan-600 {
1665
1766
  color: var(--color-cyan-600);
1666
1767
  }
1768
+ .text-fuchsia-800 {
1769
+ color: var(--color-fuchsia-800);
1770
+ }
1667
1771
  .text-gray-200 {
1668
1772
  color: var(--color-gray-200);
1669
1773
  }
@@ -1784,6 +1888,9 @@
1784
1888
  .italic {
1785
1889
  font-style: italic;
1786
1890
  }
1891
+ .underline {
1892
+ text-decoration-line: underline;
1893
+ }
1787
1894
  .placeholder-gray-400 {
1788
1895
  &::placeholder {
1789
1896
  color: var(--color-gray-400);
@@ -1865,6 +1972,9 @@
1865
1972
  --tw-inset-ring-shadow: inset 0 0 0 1px var(--tw-inset-ring-color, currentcolor);
1866
1973
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1867
1974
  }
1975
+ .ring-black {
1976
+ --tw-ring-color: var(--color-black);
1977
+ }
1868
1978
  .ring-black\/5 {
1869
1979
  --tw-ring-color: color-mix(in srgb, #000 5%, transparent);
1870
1980
  @supports (color: color-mix(in lab, red, red)) {
@@ -1886,6 +1996,9 @@
1886
1996
  .ring-indigo-500 {
1887
1997
  --tw-ring-color: var(--color-indigo-500);
1888
1998
  }
1999
+ .inset-ring-gray-900 {
2000
+ --tw-inset-ring-color: var(--color-gray-900);
2001
+ }
1889
2002
  .inset-ring-gray-900\/5 {
1890
2003
  --tw-inset-ring-color: color-mix(in srgb, oklch(21% 0.034 264.665) 5%, transparent);
1891
2004
  @supports (color: color-mix(in lab, red, red)) {
@@ -3090,6 +3203,11 @@
3090
3203
  padding: calc(var(--spacing) * 4);
3091
3204
  }
3092
3205
  }
3206
+ .md\:p-6 {
3207
+ @media (width >= 48rem) {
3208
+ padding: calc(var(--spacing) * 6);
3209
+ }
3210
+ }
3093
3211
  .lg\:fixed {
3094
3212
  @media (width >= 64rem) {
3095
3213
  position: fixed;
@@ -3264,6 +3382,11 @@
3264
3382
  border-color: var(--color-blue-800);
3265
3383
  }
3266
3384
  }
3385
+ .dark\:border-fuchsia-800 {
3386
+ &:where(.dark, .dark *) {
3387
+ border-color: var(--color-fuchsia-800);
3388
+ }
3389
+ }
3267
3390
  .dark\:border-gray-600 {
3268
3391
  &:where(.dark, .dark *) {
3269
3392
  border-color: var(--color-gray-600);
@@ -3279,6 +3402,16 @@
3279
3402
  border-color: var(--color-gray-800);
3280
3403
  }
3281
3404
  }
3405
+ .dark\:border-green-800 {
3406
+ &:where(.dark, .dark *) {
3407
+ border-color: var(--color-green-800);
3408
+ }
3409
+ }
3410
+ .dark\:border-purple-800 {
3411
+ &:where(.dark, .dark *) {
3412
+ border-color: var(--color-purple-800);
3413
+ }
3414
+ }
3282
3415
  .dark\:border-red-600 {
3283
3416
  &:where(.dark, .dark *) {
3284
3417
  border-color: var(--color-red-600);
@@ -3335,6 +3468,14 @@
3335
3468
  }
3336
3469
  }
3337
3470
  }
3471
+ .dark\:bg-blue-900\/40 {
3472
+ &:where(.dark, .dark *) {
3473
+ background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 40%, transparent);
3474
+ @supports (color: color-mix(in lab, red, red)) {
3475
+ background-color: color-mix(in oklab, var(--color-blue-900) 40%, transparent);
3476
+ }
3477
+ }
3478
+ }
3338
3479
  .dark\:bg-blue-900\/50 {
3339
3480
  &:where(.dark, .dark *) {
3340
3481
  background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 50%, transparent);
@@ -3353,6 +3494,14 @@
3353
3494
  background-color: var(--color-cyan-600);
3354
3495
  }
3355
3496
  }
3497
+ .dark\:bg-fuchsia-900\/40 {
3498
+ &:where(.dark, .dark *) {
3499
+ background-color: color-mix(in srgb, oklch(40.1% 0.17 325.612) 40%, transparent);
3500
+ @supports (color: color-mix(in lab, red, red)) {
3501
+ background-color: color-mix(in oklab, var(--color-fuchsia-900) 40%, transparent);
3502
+ }
3503
+ }
3504
+ }
3356
3505
  .dark\:bg-gray-200 {
3357
3506
  &:where(.dark, .dark *) {
3358
3507
  background-color: var(--color-gray-200);
@@ -3373,6 +3522,14 @@
3373
3522
  background-color: var(--color-gray-700);
3374
3523
  }
3375
3524
  }
3525
+ .dark\:bg-gray-700\/30 {
3526
+ &:where(.dark, .dark *) {
3527
+ background-color: color-mix(in srgb, oklch(37.3% 0.034 259.733) 30%, transparent);
3528
+ @supports (color: color-mix(in lab, red, red)) {
3529
+ background-color: color-mix(in oklab, var(--color-gray-700) 30%, transparent);
3530
+ }
3531
+ }
3532
+ }
3376
3533
  .dark\:bg-gray-800 {
3377
3534
  &:where(.dark, .dark *) {
3378
3535
  background-color: var(--color-gray-800);
@@ -3409,6 +3566,14 @@
3409
3566
  }
3410
3567
  }
3411
3568
  }
3569
+ .dark\:bg-green-900\/40 {
3570
+ &:where(.dark, .dark *) {
3571
+ background-color: color-mix(in srgb, oklch(39.3% 0.095 152.535) 40%, transparent);
3572
+ @supports (color: color-mix(in lab, red, red)) {
3573
+ background-color: color-mix(in oklab, var(--color-green-900) 40%, transparent);
3574
+ }
3575
+ }
3576
+ }
3412
3577
  .dark\:bg-green-900\/50 {
3413
3578
  &:where(.dark, .dark *) {
3414
3579
  background-color: color-mix(in srgb, oklch(39.3% 0.095 152.535) 50%, transparent);
@@ -3524,6 +3689,11 @@
3524
3689
  color: var(--color-blue-300);
3525
3690
  }
3526
3691
  }
3692
+ .dark\:text-blue-300\! {
3693
+ &:where(.dark, .dark *) {
3694
+ color: var(--color-blue-300) !important;
3695
+ }
3696
+ }
3527
3697
  .dark\:text-blue-400 {
3528
3698
  &:where(.dark, .dark *) {
3529
3699
  color: var(--color-blue-400);
@@ -3534,6 +3704,11 @@
3534
3704
  color: var(--color-cyan-400);
3535
3705
  }
3536
3706
  }
3707
+ .dark\:text-fuchsia-300 {
3708
+ &:where(.dark, .dark *) {
3709
+ color: var(--color-fuchsia-300);
3710
+ }
3711
+ }
3537
3712
  .dark\:text-gray-50 {
3538
3713
  &:where(.dark, .dark *) {
3539
3714
  color: var(--color-gray-50);
@@ -3577,6 +3752,11 @@
3577
3752
  color: var(--color-gray-600);
3578
3753
  }
3579
3754
  }
3755
+ .dark\:text-gray-700 {
3756
+ &:where(.dark, .dark *) {
3757
+ color: var(--color-gray-700);
3758
+ }
3759
+ }
3580
3760
  .dark\:text-green-100 {
3581
3761
  &:where(.dark, .dark *) {
3582
3762
  color: var(--color-green-100);
@@ -4271,6 +4451,9 @@
4271
4451
  *, ::after, ::before, ::backdrop, ::file-selector-button {
4272
4452
  border-color: hsl(var(--border));
4273
4453
  }
4454
+ .reasoning .prose-xs p, .reasoning .prose-xs li {
4455
+ font-size: 13px;
4456
+ }
4274
4457
  }
4275
4458
  @layer base {
4276
4459
  [v-cloak] {
@@ -4356,6 +4539,18 @@
4356
4539
  background-color: #f9fafb;
4357
4540
  font-weight: 600;
4358
4541
  }
4542
+ .tool-arguments, .tool-output {
4543
+ margin: 0 !important;
4544
+ padding: 0 !important;
4545
+ background-color: transparent !important;
4546
+ color: inherit !important;
4547
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important;
4548
+ font-size: 0.75rem !important;
4549
+ white-space: pre-wrap !important;
4550
+ word-break: break-all !important;
4551
+ border: none !important;
4552
+ border-radius: 0 !important;
4553
+ }
4359
4554
  .hljs {
4360
4555
  background: white;
4361
4556
  color: black;
llms/ui/ctx.mjs CHANGED
@@ -11,12 +11,13 @@ export class ExtensionScope {
11
11
  this.baseUrl = `${ctx.ai.base}/ext/${this.id}`
12
12
  this.storageKey = `llms.${this.id}`
13
13
  this.state = reactive({})
14
+ this.prefs = reactive(storageObject(this.storageKey))
14
15
  }
15
16
  getPrefs() {
16
- return storageObject(this.storageKey)
17
+ return this.prefs
17
18
  }
18
19
  setPrefs(o) {
19
- storageObject(this.storageKey, Object.assign(this.getPrefs(), o))
20
+ storageObject(this.storageKey, Object.assign(this.prefs, o))
20
21
  }
21
22
  get(url, options) {
22
23
  return this.ctx.ai.get(combinePaths(this.baseUrl, url), options)
@@ -45,7 +46,6 @@ export class AppContext {
45
46
  this.events = new EventBus()
46
47
  this.modalComponents = {}
47
48
  this.extensions = []
48
- this.layout = reactive(storageObject(`llms.layout`))
49
49
  this.chatRequestFilters = []
50
50
  this.chatResponseFilters = []
51
51
  this.chatErrorFilters = []
@@ -53,12 +53,15 @@ export class AppContext {
53
53
  this.updateThreadFilters = []
54
54
  this.top = {}
55
55
  this.left = {}
56
+ this.layout = reactive(storageObject(`llms.layout`))
57
+ this.prefs = reactive(storageObject(ai.prefsKey))
56
58
 
57
59
  if (!Array.isArray(this.layout.hide)) {
58
60
  this.layout.hide = []
59
61
  }
60
62
  Object.assign(app.config.globalProperties, {
61
63
  $ctx: this,
64
+ $prefs: this.prefs,
62
65
  $state: this.state,
63
66
  $layout: this.layout,
64
67
  $ai: ai,
@@ -80,6 +83,12 @@ export class AppContext {
80
83
  this[name] = global
81
84
  })
82
85
  }
86
+ getPrefs() {
87
+ return this.prefs
88
+ }
89
+ setPrefs(o) {
90
+ storageObject(this.ai.prefsKey, Object.assign(this.prefs, o))
91
+ }
83
92
  _validateIcons(icons) {
84
93
  Object.entries(icons).forEach(([id, icon]) => {
85
94
  if (!icon.component) {
@@ -173,12 +182,6 @@ export class AppContext {
173
182
  layoutVisible(key) {
174
183
  return !this.layout.hide.includes(key)
175
184
  }
176
- getPrefs() {
177
- return storageObject(this.ai.prefsKey)
178
- }
179
- setPrefs(o) {
180
- storageObject(this.ai.prefsKey, Object.assign(this.getPrefs(), o))
181
- }
182
185
  toggleTop(name) {
183
186
  console.log('toggleTop', name)
184
187
  this.layout.top = this.layout.top == name ? undefined : name
@@ -193,4 +196,10 @@ export class AppContext {
193
196
  this.router.push({ path })
194
197
  }
195
198
  }
199
+ getJson(url, options) {
200
+ return this.ai.getJson(url, options)
201
+ }
202
+ postJson(url, options) {
203
+ return this.ai.postJson(url, options)
204
+ }
196
205
  }
llms/ui/index.mjs CHANGED
@@ -9,6 +9,7 @@ import ChatModule from './modules/chat/index.mjs'
9
9
  import ThreadsModule from './modules/threads/index.mjs'
10
10
  import ModelSelectorModule from './modules/model-selector.mjs'
11
11
  import AnalyticsModule from './modules/analytics.mjs'
12
+ import ToolsModule from './modules/tools.mjs'
12
13
  import { utilsFunctions, utilsFormatters } from './utils.mjs'
13
14
  import { markdownFormatters } from './markdown.mjs'
14
15
  import { AppContext } from './ctx.mjs'
@@ -22,6 +23,7 @@ const BuiltInModules = {
22
23
  ThreadsModule,
23
24
  ModelSelectorModule,
24
25
  AnalyticsModule,
26
+ ToolsModule,
25
27
  }
26
28
 
27
29
 
@@ -53,10 +55,13 @@ export async function createContext() {
53
55
  }
54
56
  }))
55
57
 
58
+ const installedModules = []
59
+
56
60
  // Install built-in modules sequentially
57
61
  Object.entries(BuiltInModules).forEach(([name, module]) => {
58
62
  try {
59
63
  module.install(ctx)
64
+ installedModules.push({ extension: { id: name }, module: { default: module } })
60
65
  console.log(`Installed built-in: ${name}`)
61
66
  } catch (e) {
62
67
  console.error(`Failed to install built-in ${name}:`, e)
@@ -68,6 +73,7 @@ export async function createContext() {
68
73
  if (result && result.module.default && result.module.default.install) {
69
74
  try {
70
75
  result.module.default.install(ctx)
76
+ installedModules.push(result)
71
77
  console.log(`Installed extension: ${result.extension.id}`)
72
78
  } catch (e) {
73
79
  console.error(`Failed to install extension ${result.extension.id}:`, e)
@@ -103,8 +109,11 @@ export async function createContext() {
103
109
  ctx.router.push({ path: ctx.layout.path })
104
110
  }
105
111
 
112
+ const loadModules = installedModules.filter(x => x.module.default && x.module.default.load)
113
+ console.log('Loading modules: ', loadModules.map(x => x.extension.id))
114
+
106
115
  // Load all extensions in parallel
107
- await Promise.all(ctx.modules.filter(x => x.module.default && x.module.default.load).map(async result => {
116
+ await Promise.all(loadModules.map(async result => {
108
117
  try {
109
118
  await result.module.default.load(ctx)
110
119
  console.log(`Loaded extension: ${result.extension.id}`)