local-operator-ui 0.7.3 → 0.7.4

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.
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- import { L as LRParser, E as ExternalTokenizer, a as LocalTokenGroup, s as styleTags, C as ContextTracker, t as tags, b as LRLanguage, c as snippetCompletion, d as LanguageSupport, i as ifNotIn, e as completeFromList, f as indentNodeProp, g as foldNodeProp, h as continuedIndent, j as delimitedIndent, k as flatIndent, l as foldInside, m as syntaxTree, N as NodeWeakMap, I as IterMode } from "./index-Bxd9cfRL.js";
1
+ import { L as LRParser, E as ExternalTokenizer, a as LocalTokenGroup, s as styleTags, C as ContextTracker, t as tags, b as LRLanguage, c as snippetCompletion, d as LanguageSupport, i as ifNotIn, e as completeFromList, f as indentNodeProp, g as foldNodeProp, h as continuedIndent, j as delimitedIndent, k as flatIndent, l as foldInside, m as syntaxTree, N as NodeWeakMap, I as IterMode } from "./index-CXyUnv28.js";
2
2
  import "./fonts-BAmz1ETd.js";
3
3
  const insertedSemi = 177, space$1 = 179, identifier = 184, String = 12, closeParen$1 = 13, Number = 17, Rune = 20, closeBrace$1 = 25, closeBracket = 53, IncDecOp = 95, _return = 142, _break = 144, _continue = 145, fallthrough = 148;
4
4
  const newline = 10, carriageReturn = 13, space = 32, tab = 9, slash = 47, closeParen = 41, closeBrace = 125;
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-CUWbsc3s.js","./fonts-BAmz1ETd.js","./fonts-B9KBGB-g.css","./index-DlgVvD7O.js","./pug-By0kVCfm.js","./javascript-C3MnDRiU.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-BpktHwp9.js","./fonts-BAmz1ETd.js","./fonts-B9KBGB-g.css","./index-D4xePR3Q.js","./pug-By0kVCfm.js","./javascript-C3MnDRiU.js"])))=>i.map(i=>d[i]);
2
2
  import { c as createStyled, r as resolveProps, u as useTheme, a as reactExports, b as clsx, d as useForkRef, e as extendSxProp, j as jsxRuntimeExports, h as handleBreakpoints, f as resolveBreakpointValues, g as createUnarySpacing, i as deepmerge, m as mergeBreakpointsInOrder, k as composeClasses, l as generateUtilityClass, n as createTheme$1, o as getValue, R as React, p as getDefaultExportFromCjs, q as requireReactDom, s as React$1, t as generateUtilityClasses, v as useDefaultProps, w as styled$1, x as capitalize, y as memoTheme, _ as _inheritsLoose, z as _objectWithoutPropertiesLoose$i, T as TransitionGroupContext, A as duration, B as useTheme$1, C as useTimeout, D as useId, E as ButtonBase, F as alpha$1, G as createSimplePaletteValueFilter, H as CircularProgress, P as Paper, I as darken, J as lighten, K as useEventCallback, L as useEnhancedEffect, M as useRtl, N as globalCss, O as formatMuiErrorMessage, Q as rootShouldForwardProp, S as Typography, U as getPath$2, V as isFocusVisible, W as typographyClasses, X as slotShouldForwardProp, Y as css$1, Z as keyframes, $ as clamp, a0 as emphasize, a1 as Timeout, a2 as Button, a3 as Box, a4 as FontAwesomeIcon, a5 as faExclamationTriangle, a6 as DEFAULT_THEME, a7 as faChevronLeft, a8 as faChevronRight, a9 as faRobot, aa as faCheck, ab as faTimes, ac as faEraser, ad as faPen, ae as faFileImport, af as faUpload, ag as requireReact, ah as LinearProgress, ai as faComment, aj as faSave, ak as faEdit, al as faTrashAlt, am as faComments, an as faInfoCircle, ao as faGear, ap as faPlus, aq as faServer, ar as faStar, as as faTag, at as faIdCard, au as faCalendarAlt, av as faCodeBranch, aw as faShieldAlt, ax as faArrowLeft, ay as faClock, az as faHome, aA as faDownload, aB as faFileAlt, aC as faDesktop, aD as faImage, aE as faMusic, aF as faVideo, aG as faLaptop, aH as faUsers, aI as faDatabase, aJ as faBoxOpen, aK as faBook, aL as faHdd, aM as faBox, aN as faArchive, aO as faNetworkWired, aP as faFolder, aQ as faFolderOpen, aR as faFolderTree, aS as faChevronDown, aT as faTools, aU as _extends$u, aV as faSliders, aW as faTrash, aX as faArrowDown, aY as faPaperclip, aZ as faStop, a_ as faPaperPlane, a$ as faChevronUp, b0 as faQuestion, b1 as faFile, b2 as faExclamationCircle, b3 as faLightbulb, b4 as faCode, b5 as faCommentDots, b6 as faShare, b7 as faPencilAlt, b8 as faUser, b9 as faCopy, ba as isDevelopmentMode, bb as faCommentSlash, bc as faArrowRight, bd as faBrain, be as faWandMagicSparkles, bf as faExternalLinkAlt, bg as faKey, bh as radientTheme, bi as faGlobe, bj as faSearch, bk as commonjsGlobal, bl as PropTypes, bm as faLock, bn as faSignOut, bo as themes, bp as faMoon, bq as faSun, br as faHexagonNodes, bs as faSkull, bt as faLeaf, bu as faMountain, bv as faFire, bw as faIcicles, bx as faEnvelope, by as faHistory, bz as faListAlt, bA as faAdjust, bB as faCreditCard, bC as faPlusCircle, bD as faChartLine, bE as faShield, bF as library$1, bG as icons$1, bH as CssBaseline, bI as ThemeProvider$1, bJ as getTheme, bK as ReactDOM$1, bL as ErrorBoundary } from "./fonts-BAmz1ETd.js";
3
3
  const styled = createStyled();
4
4
  function getThemeProps(params) {
@@ -22596,7 +22596,7 @@ const styledRootConfig = {
22596
22596
  slot: "Root"
22597
22597
  };
22598
22598
  const StyledInput$1 = styled$1(Input, styledRootConfig)("");
22599
- const StyledOutlinedInput = styled$1(OutlinedInput, styledRootConfig)("");
22599
+ const StyledOutlinedInput$1 = styled$1(OutlinedInput, styledRootConfig)("");
22600
22600
  const StyledFilledInput = styled$1(FilledInput, styledRootConfig)("");
22601
22601
  const Select = /* @__PURE__ */ reactExports.forwardRef(function Select2(inProps, ref) {
22602
22602
  const props2 = useDefaultProps({
@@ -22649,7 +22649,7 @@ const Select = /* @__PURE__ */ reactExports.forwardRef(function Select2(inProps,
22649
22649
  standard: /* @__PURE__ */ jsxRuntimeExports.jsx(StyledInput$1, {
22650
22650
  ownerState
22651
22651
  }),
22652
- outlined: /* @__PURE__ */ jsxRuntimeExports.jsx(StyledOutlinedInput, {
22652
+ outlined: /* @__PURE__ */ jsxRuntimeExports.jsx(StyledOutlinedInput$1, {
22653
22653
  label,
22654
22654
  ownerState
22655
22655
  }),
@@ -35513,19 +35513,48 @@ const ChatLayout = ({ sidebar, content: content2 }) => {
35513
35513
  ] });
35514
35514
  };
35515
35515
  const DEFAULT_DEFER_TIMELINE_MS = 48 * 60 * 60 * 1e3;
35516
+ var UpdateType = /* @__PURE__ */ ((UpdateType2) => {
35517
+ UpdateType2["UI"] = "ui";
35518
+ UpdateType2["BACKEND"] = "backend";
35519
+ return UpdateType2;
35520
+ })(UpdateType || {});
35516
35521
  const useDeferredUpdatesStore = create$1()(
35517
35522
  persist(
35518
35523
  (set, get2) => ({
35519
- deferredVersion: null,
35520
- deferredAt: null,
35521
- deferUpdate: (version2) => {
35522
- set({
35523
- deferredVersion: version2,
35524
- deferredAt: Date.now()
35525
- });
35524
+ uiDeferredVersion: null,
35525
+ uiDeferredAt: null,
35526
+ backendDeferredVersion: null,
35527
+ backendDeferredAt: null,
35528
+ hydrated: false,
35529
+ deferUpdate: (type2, version2) => {
35530
+ if (type2 === "ui") {
35531
+ set({
35532
+ uiDeferredVersion: version2,
35533
+ uiDeferredAt: Date.now()
35534
+ });
35535
+ } else {
35536
+ set({
35537
+ backendDeferredVersion: version2,
35538
+ backendDeferredAt: Date.now()
35539
+ });
35540
+ }
35526
35541
  },
35527
- shouldShowUpdate: (version2) => {
35528
- const { deferredVersion, deferredAt } = get2();
35542
+ shouldShowUpdate: (type2, version2) => {
35543
+ const {
35544
+ uiDeferredVersion,
35545
+ uiDeferredAt,
35546
+ backendDeferredVersion,
35547
+ backendDeferredAt
35548
+ } = get2();
35549
+ let deferredVersion;
35550
+ let deferredAt;
35551
+ if (type2 === "ui") {
35552
+ deferredVersion = uiDeferredVersion;
35553
+ deferredAt = uiDeferredAt;
35554
+ } else {
35555
+ deferredVersion = backendDeferredVersion;
35556
+ deferredAt = backendDeferredAt;
35557
+ }
35529
35558
  if (!deferredVersion || !deferredAt) {
35530
35559
  return true;
35531
35560
  }
@@ -35536,15 +35565,31 @@ const useDeferredUpdatesStore = create$1()(
35536
35565
  const timeElapsed = now - deferredAt;
35537
35566
  return timeElapsed > DEFAULT_DEFER_TIMELINE_MS;
35538
35567
  },
35539
- clearDeferredUpdate: () => {
35540
- set({
35541
- deferredVersion: null,
35542
- deferredAt: null
35543
- });
35568
+ clearDeferredUpdate: (type2) => {
35569
+ if (type2 === "ui") {
35570
+ set({
35571
+ uiDeferredVersion: null,
35572
+ uiDeferredAt: null
35573
+ });
35574
+ } else if (type2 === "backend") {
35575
+ set({
35576
+ backendDeferredVersion: null,
35577
+ backendDeferredAt: null
35578
+ });
35579
+ } else {
35580
+ throw new Error(`Invalid update type: ${type2}`);
35581
+ }
35544
35582
  }
35545
35583
  }),
35546
35584
  {
35547
- name: "deferred-updates-storage"
35585
+ name: "deferred-updates-storage",
35586
+ onRehydrateStorage: () => (store) => {
35587
+ if (store && typeof store === "object" && "setState" in store && typeof store.setState === "function") {
35588
+ store.setState({
35589
+ hydrated: true
35590
+ });
35591
+ }
35592
+ }
35548
35593
  }
35549
35594
  )
35550
35595
  );
@@ -35607,7 +35652,8 @@ const CheckForUpdatesButton = () => {
35607
35652
  try {
35608
35653
  setChecking(true);
35609
35654
  manualCheckRef.current = true;
35610
- clearDeferredUpdate();
35655
+ clearDeferredUpdate(UpdateType.UI);
35656
+ clearDeferredUpdate(UpdateType.BACKEND);
35611
35657
  await window.api.updater.checkForAllUpdates();
35612
35658
  } catch (error) {
35613
35659
  setSnackbarMessage(
@@ -36946,39 +36992,58 @@ const useJobPolling = ({
36946
36992
  queryFn: async () => {
36947
36993
  if (!currentJobId) return null;
36948
36994
  const client2 = createLocalOperatorClient(apiConfig.baseUrl);
36949
- const response = await client2.jobs.getJobStatus(currentJobId);
36950
- return response.result;
36995
+ try {
36996
+ const response = await client2.jobs.getJobStatus(currentJobId);
36997
+ return response.result;
36998
+ } catch (err) {
36999
+ const errorObj = err;
37000
+ if (errorObj?.response?.status === 404 || errorObj?.status === 404 || errorObj?.message?.toString().includes("404")) {
37001
+ return { status: "not_found" };
37002
+ }
37003
+ throw err;
37004
+ }
36951
37005
  },
36952
- // Only run the query if we have a job ID and server is online (bypass internet check)
36953
37006
  enabled: shouldEnableQuery({ bypassInternetCheck: true }) && !!currentJobId,
36954
- // Poll every 1 second while job is active
36955
37007
  refetchInterval: currentJobId ? 1e3 : false,
36956
37008
  refetchIntervalInBackground: false,
36957
37009
  refetchOnWindowFocus: true,
36958
- // Don't cache the result
36959
37010
  gcTime: 0,
36960
37011
  staleTime: 0,
36961
- // Retry failed requests to ensure polling continues
36962
37012
  retry: true,
36963
37013
  retryDelay: 1e3
36964
37014
  });
37015
+ function isJobDetails(data2) {
37016
+ return typeof data2 === "object" && data2 !== null && "id" in data2 && typeof data2.id === "string";
37017
+ }
36965
37018
  reactExports.useEffect(() => {
36966
- if (!jobData || !conversationId) return void 0;
36967
- const jobDataSignature = `${jobData.id}-${jobData.status}-${dataUpdatedAt}`;
36968
- if (jobDataSignature !== lastProcessedJobDataRef.current) {
36969
- lastProcessedJobDataRef.current = jobDataSignature;
36970
- if (jobData.current_execution) {
36971
- setCurrentExecution(jobData.current_execution);
36972
- }
36973
- if (jobData.status === "processing") {
36974
- const debounceTimeout = setTimeout(() => {
36975
- updateConversationMessages(conversationId);
36976
- }, 500);
36977
- return () => clearTimeout(debounceTimeout);
36978
- }
36979
- if (jobData.status === "completed" || jobData.status === "failed") {
36980
- handleJobCompletion(jobData);
37019
+ if (!conversationId) return void 0;
37020
+ if (jobData && jobData.status === "not_found") {
37021
+ (async () => {
37022
+ await updateConversationMessages(conversationId);
37023
+ setCurrentJobId(null);
37024
+ setIsLoading(false);
36981
37025
  setCurrentExecution(null);
37026
+ })();
37027
+ return;
37028
+ }
37029
+ if (!jobData) return void 0;
37030
+ if (isJobDetails(jobData)) {
37031
+ const jobDataSignature = `${jobData.id}-${jobData.status}-${dataUpdatedAt}`;
37032
+ if (jobDataSignature !== lastProcessedJobDataRef.current) {
37033
+ lastProcessedJobDataRef.current = jobDataSignature;
37034
+ if (jobData.current_execution) {
37035
+ setCurrentExecution(jobData.current_execution);
37036
+ }
37037
+ if (jobData.status === "processing") {
37038
+ const debounceTimeout = setTimeout(() => {
37039
+ updateConversationMessages(conversationId);
37040
+ }, 500);
37041
+ return () => clearTimeout(debounceTimeout);
37042
+ }
37043
+ if (jobData.status === "completed" || jobData.status === "failed") {
37044
+ handleJobCompletion(jobData);
37045
+ setCurrentExecution(null);
37046
+ }
36982
37047
  }
36983
37048
  }
36984
37049
  return void 0;
@@ -36988,7 +37053,6 @@ const useJobPolling = ({
36988
37053
  handleJobCompletion,
36989
37054
  conversationId,
36990
37055
  updateConversationMessages,
36991
- setCurrentExecution,
36992
37056
  setCurrentJobId
36993
37057
  ]);
36994
37058
  reactExports.useEffect(() => {
@@ -36999,10 +37063,21 @@ const useJobPolling = ({
36999
37063
  }
37000
37064
  }
37001
37065
  }, [error, currentJobId, queryClient2]);
37066
+ const validJobStatuses = [
37067
+ "pending",
37068
+ "processing",
37069
+ "completed",
37070
+ "failed",
37071
+ "cancelled"
37072
+ ];
37073
+ let jobStatus = null;
37074
+ if (jobData && typeof jobData.status === "string" && validJobStatuses.includes(jobData.status)) {
37075
+ jobStatus = jobData.status;
37076
+ }
37002
37077
  return {
37003
37078
  currentJobId,
37004
37079
  setCurrentJobId,
37005
- jobStatus: jobData?.status || null,
37080
+ jobStatus,
37006
37081
  isLoading,
37007
37082
  setIsLoading,
37008
37083
  checkForActiveJobs,
@@ -39753,7 +39828,7 @@ const StyledIcon$1 = styled$1(FontAwesomeIcon)(({ theme: theme2 }) => ({
39753
39828
  color: theme2.palette.primary.main,
39754
39829
  fontSize: "1.2rem"
39755
39830
  }));
39756
- const StyledTextField$5 = styled$1(TextField)(({ theme: theme2 }) => ({
39831
+ const StyledTextField$4 = styled$1(TextField)(({ theme: theme2 }) => ({
39757
39832
  "& .MuiOutlinedInput-root": {
39758
39833
  borderRadius: 8,
39759
39834
  transition: "all 0.2s ease-in-out",
@@ -39774,7 +39849,7 @@ const StyledTextField$5 = styled$1(TextField)(({ theme: theme2 }) => ({
39774
39849
  padding: "12px 14px"
39775
39850
  }
39776
39851
  }));
39777
- const NameField = styled$1(StyledTextField$5)({
39852
+ const NameField = styled$1(StyledTextField$4)({
39778
39853
  marginBottom: 12,
39779
39854
  "& .MuiInputLabel-root": {
39780
39855
  transform: "translate(12px, 12px) scale(1)"
@@ -39903,7 +39978,7 @@ const CreateAgentDialog = ({
39903
39978
  }
39904
39979
  ),
39905
39980
  /* @__PURE__ */ jsxRuntimeExports.jsx(
39906
- StyledTextField$5,
39981
+ StyledTextField$4,
39907
39982
  {
39908
39983
  margin: "dense",
39909
39984
  id: "description",
@@ -39944,7 +40019,7 @@ const LabelIcon$7 = styled$1(Box)({
39944
40019
  display: "flex",
39945
40020
  alignItems: "center"
39946
40021
  });
39947
- const StyledTextField$4 = styled$1(TextField)(
40022
+ const StyledTextField$3 = styled$1(TextField)(
39948
40023
  ({ theme: theme2, multiline }) => ({
39949
40024
  "& .MuiOutlinedInput-root": {
39950
40025
  borderRadius: 6,
@@ -40245,7 +40320,7 @@ const EditableField = ({
40245
40320
  ] }),
40246
40321
  isEditing ? /* @__PURE__ */ jsxRuntimeExports.jsxs(Box, { sx: { position: "relative" }, children: [
40247
40322
  /* @__PURE__ */ jsxRuntimeExports.jsx(
40248
- StyledTextField$4,
40323
+ StyledTextField$3,
40249
40324
  {
40250
40325
  fullWidth: true,
40251
40326
  variant: "outlined",
@@ -40833,12 +40908,12 @@ const StyledSlider = styled$1(Slider)(({ theme: theme2 }) => ({
40833
40908
  const InputContainer = styled$1(Box)({
40834
40909
  display: "flex",
40835
40910
  alignItems: "center",
40836
- minWidth: "90px"
40837
- // Slightly reduced min-width
40911
+ minWidth: "110px"
40912
+ // Increased min-width for wider input
40838
40913
  });
40839
- const StyledTextField$3 = styled$1(TextField)(({ theme: theme2 }) => ({
40840
- width: "90px",
40841
- // Fixed width
40914
+ const StyledTextField$2 = styled$1(TextField)(({ theme: theme2 }) => ({
40915
+ width: "110px",
40916
+ // Increased width for wider input
40842
40917
  "& .MuiOutlinedInput-root": {
40843
40918
  borderRadius: theme2.shape.borderRadius,
40844
40919
  // Standard border radius
@@ -41021,7 +41096,7 @@ const SliderSetting = ({
41021
41096
  // Consistent loading indicator size
41022
41097
  /* @__PURE__ */ jsxRuntimeExports.jsx(CircularProgress, { size: 20, sx: { margin: "8px 12px" } })
41023
41098
  ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
41024
- StyledTextField$3,
41099
+ StyledTextField$2,
41025
41100
  {
41026
41101
  value: inputValue,
41027
41102
  onChange: handleInputChange,
@@ -43604,10 +43679,13 @@ const UpdateNotification = ({
43604
43679
  const [backendUpdateCompleted, setBackendUpdateCompleted] = reactExports.useState(false);
43605
43680
  const [manualUpdateRequired, setManualUpdateRequired] = reactExports.useState(false);
43606
43681
  const [manualUpdateInfo, setManualUpdateInfo] = reactExports.useState(null);
43607
- const { shouldShowUpdate, deferUpdate } = useDeferredUpdatesStore();
43682
+ const { shouldShowUpdate, deferUpdate, hydrated } = useDeferredUpdatesStore();
43608
43683
  reactExports.useEffect(() => {
43609
43684
  window.api.systemInfo.getAppVersion().then((version2) => setAppVersion(version2)).catch(() => setAppVersion("unknown"));
43610
43685
  }, []);
43686
+ if (!hydrated) {
43687
+ return null;
43688
+ }
43611
43689
  const checkForUpdates = reactExports.useCallback(async () => {
43612
43690
  try {
43613
43691
  setChecking(true);
@@ -43655,7 +43733,7 @@ const UpdateNotification = ({
43655
43733
  }, []);
43656
43734
  const handleDeferBackendUpdate = reactExports.useCallback(() => {
43657
43735
  if (backendUpdateInfo) {
43658
- deferUpdate(backendUpdateInfo.latestVersion);
43736
+ deferUpdate(UpdateType.BACKEND, backendUpdateInfo.latestVersion);
43659
43737
  setSnackbarOpen(false);
43660
43738
  setBackendUpdateAvailable(false);
43661
43739
  setBackendUpdateInfo(null);
@@ -43663,7 +43741,7 @@ const UpdateNotification = ({
43663
43741
  }, [deferUpdate, backendUpdateInfo]);
43664
43742
  const handleDeferUpdate = reactExports.useCallback(() => {
43665
43743
  if (updateInfo) {
43666
- deferUpdate(updateInfo.version);
43744
+ deferUpdate(UpdateType.UI, updateInfo.version);
43667
43745
  setSnackbarOpen(false);
43668
43746
  setUpdateAvailable(false);
43669
43747
  setUpdateDownloaded(false);
@@ -43672,7 +43750,7 @@ const UpdateNotification = ({
43672
43750
  reactExports.useEffect(() => {
43673
43751
  const removeUpdateAvailableListener = window.api.updater.onUpdateAvailable(
43674
43752
  (info) => {
43675
- if (shouldShowUpdate(info.version)) {
43753
+ if (shouldShowUpdate(UpdateType.UI, info.version)) {
43676
43754
  setUpdateAvailable(true);
43677
43755
  setUpdateInfo(info);
43678
43756
  setSnackbarOpen(true);
@@ -43685,7 +43763,7 @@ const UpdateNotification = ({
43685
43763
  });
43686
43764
  const removeUpdateDownloadedListener = window.api.updater.onUpdateDownloaded((info) => {
43687
43765
  setDownloading(false);
43688
- if (shouldShowUpdate(info.version)) {
43766
+ if (shouldShowUpdate(UpdateType.UI, info.version)) {
43689
43767
  setUpdateDownloaded(true);
43690
43768
  setUpdateInfo(info);
43691
43769
  setSnackbarOpen(true);
@@ -43714,7 +43792,7 @@ const UpdateNotification = ({
43714
43792
  }
43715
43793
  );
43716
43794
  const removeBackendUpdateAvailableListener = window.api.updater.onBackendUpdateAvailable((info) => {
43717
- if (shouldShowUpdate(info.latestVersion)) {
43795
+ if (shouldShowUpdate(UpdateType.BACKEND, info.latestVersion)) {
43718
43796
  const enhancedInfo = {
43719
43797
  ...info,
43720
43798
  canManageUpdate: !info.updateCommand.includes("manually")
@@ -49887,7 +49965,7 @@ const MetaInfoContainer$1 = styled$1(Box)(({ theme: theme2 }) => ({
49887
49965
  color: theme2.palette.text.secondary,
49888
49966
  fontSize: "0.875rem"
49889
49967
  }));
49890
- const DescriptionBox$2 = styled$1(Box)(({ theme: theme2 }) => ({
49968
+ const DescriptionBox$1 = styled$1(Box)(({ theme: theme2 }) => ({
49891
49969
  marginTop: theme2.spacing(2),
49892
49970
  marginBottom: theme2.spacing(4),
49893
49971
  lineHeight: 1.6
@@ -50137,7 +50215,7 @@ const AgentDetailsPage = () => {
50137
50215
  ")"
50138
50216
  ] })
50139
50217
  ] }),
50140
- /* @__PURE__ */ jsxRuntimeExports.jsx(DescriptionBox$2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "body1", sx: { fontSize: "0.875rem" }, children: agent.description || "No description provided." }) }),
50218
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DescriptionBox$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "body1", sx: { fontSize: "0.875rem" }, children: agent.description || "No description provided." }) }),
50141
50219
  /* @__PURE__ */ jsxRuntimeExports.jsx(Divider, { sx: { my: 3 } }),
50142
50220
  /* @__PURE__ */ jsxRuntimeExports.jsx(CommentsSection, { agentId: agent.id }),
50143
50221
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
@@ -82795,7 +82873,7 @@ const languages = [
82795
82873
  name: "Go",
82796
82874
  extensions: ["go"],
82797
82875
  load() {
82798
- return __vitePreload(() => import("./index-CUWbsc3s.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m2) => m2.go());
82876
+ return __vitePreload(() => import("./index-BpktHwp9.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m2) => m2.go());
82799
82877
  }
82800
82878
  }),
82801
82879
  /* @__PURE__ */ LanguageDescription.of({
@@ -82972,7 +83050,7 @@ const languages = [
82972
83050
  alias: ["yml"],
82973
83051
  extensions: ["yaml", "yml"],
82974
83052
  load() {
82975
- return __vitePreload(() => import("./index-DlgVvD7O.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m2) => m2.yaml());
83053
+ return __vitePreload(() => import("./index-D4xePR3Q.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m2) => m2.yaml());
82976
83054
  }
82977
83055
  }),
82978
83056
  // Legacy modes ported from CodeMirror 5
@@ -141592,7 +141670,7 @@ const OptionsButton = styled$1(IconButton)(({ theme: theme2 }) => ({
141592
141670
  transform: "translateY(-1px)"
141593
141671
  }
141594
141672
  }));
141595
- const DescriptionBox$1 = styled$1(Box)({
141673
+ const DescriptionBox = styled$1(Box)({
141596
141674
  display: "flex",
141597
141675
  flexDirection: "column",
141598
141676
  width: "90%"
@@ -141626,7 +141704,7 @@ const ChatHeader = ({
141626
141704
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { size: 24 })
141627
141705
  }
141628
141706
  ),
141629
- /* @__PURE__ */ jsxRuntimeExports.jsxs(DescriptionBox$1, { children: [
141707
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DescriptionBox, { children: [
141630
141708
  /* @__PURE__ */ jsxRuntimeExports.jsx(
141631
141709
  Typography,
141632
141710
  {
@@ -142676,7 +142754,7 @@ const SuggestionChip = styled$1(Button)(({ theme: theme2 }) => ({
142676
142754
  }
142677
142755
  }
142678
142756
  }));
142679
- const StyledTextField$2 = styled$1(TextField)(({ theme: theme2 }) => ({
142757
+ const StyledTextField$1 = styled$1(TextField)(({ theme: theme2 }) => ({
142680
142758
  flex: 1,
142681
142759
  "& .MuiOutlinedInput-root": {
142682
142760
  backgroundColor: "transparent",
@@ -142886,7 +142964,7 @@ const MessageInput = ({
142886
142964
  }
142887
142965
  ),
142888
142966
  /* @__PURE__ */ jsxRuntimeExports.jsx(
142889
- StyledTextField$2,
142967
+ StyledTextField$1,
142890
142968
  {
142891
142969
  fullWidth: true,
142892
142970
  placeholder: isInputDisabled ? "Agent is busy" : "Ask me for help",
@@ -180937,8 +181015,13 @@ const FileAttachment = ({
180937
181015
  const state = useCanvasStore.getState();
180938
181016
  const files = state.conversations[conversationId]?.files ?? [];
180939
181017
  const openTabs = state.conversations[conversationId]?.openTabs ?? [];
180940
- const existsFile = files.some((d2) => d2.id === docId);
180941
- const updatedFiles = existsFile ? files : [...files, newDoc];
181018
+ const updatedFiles = (() => {
181019
+ const idx = files.findIndex((d2) => d2.id === docId);
181020
+ if (idx !== -1) {
181021
+ return [...files.slice(0, idx), newDoc, ...files.slice(idx + 1)];
181022
+ }
181023
+ return [...files, newDoc];
181024
+ })();
180942
181025
  setFiles(conversationId, updatedFiles);
180943
181026
  const existsTab = openTabs.some((t2) => t2.id === docId);
180944
181027
  const updatedTabs = existsTab ? openTabs : [...openTabs, { id: docId, title }];
@@ -182346,6 +182429,47 @@ const getAttachmentUrl = (client, path2) => {
182346
182429
  };
182347
182430
  const MessageItem = reactExports.memo(
182348
182431
  ({ message: message2, onMessageComplete, isLastMessage, conversationId }) => {
182432
+ const setFiles = useCanvasStore((s2) => s2.setFiles);
182433
+ reactExports.useEffect(() => {
182434
+ if (!message2.files || message2.files.length === 0) return;
182435
+ const state = useCanvasStore.getState();
182436
+ const conv = state.conversations[conversationId];
182437
+ if (!conv) return;
182438
+ const { openTabs, files } = conv;
182439
+ if (!openTabs || openTabs.length === 0) return;
182440
+ (async () => {
182441
+ let updatedFiles = files;
182442
+ let didUpdate = false;
182443
+ for (const filePath of message2.files ?? []) {
182444
+ const normalizedPath = filePath.startsWith("file://") ? filePath.substring(7) : filePath;
182445
+ const tabIsOpen = openTabs.some((tab2) => tab2.id === normalizedPath);
182446
+ if (!tabIsOpen) continue;
182447
+ const fileIdx = updatedFiles.findIndex(
182448
+ (f2) => f2.id === normalizedPath
182449
+ );
182450
+ if (fileIdx === -1) continue;
182451
+ try {
182452
+ const result = await window.api.readFile(normalizedPath);
182453
+ if (result.success) {
182454
+ const currentDoc = updatedFiles[fileIdx];
182455
+ if (currentDoc.content !== result.data) {
182456
+ const updatedDoc = { ...currentDoc, content: result.data };
182457
+ updatedFiles = [
182458
+ ...updatedFiles.slice(0, fileIdx),
182459
+ updatedDoc,
182460
+ ...updatedFiles.slice(fileIdx + 1)
182461
+ ];
182462
+ didUpdate = true;
182463
+ }
182464
+ }
182465
+ } catch (_2) {
182466
+ }
182467
+ }
182468
+ if (didUpdate) {
182469
+ setFiles(conversationId, updatedFiles);
182470
+ }
182471
+ })();
182472
+ }, [message2, conversationId, setFiles]);
182349
182473
  const shouldHide = (message2.action === "DONE" || message2.action === "ASK") && message2.execution_type === "action" && message2.task_classification === "conversation" || !message2.message && (!message2.files || message2.files.length === 0) && !message2.code && !message2.stdout && !message2.stderr && !message2.logging && message2.is_complete;
182350
182474
  if (shouldHide) {
182351
182475
  return null;
@@ -184084,7 +184208,7 @@ const menuItemSx = (theme2) => ({
184084
184208
  }
184085
184209
  }
184086
184210
  });
184087
- const menuPropsSx = (theme2) => ({
184211
+ const menuPropsSx$1 = (theme2) => ({
184088
184212
  PaperProps: {
184089
184213
  sx: {
184090
184214
  mt: 0.5,
@@ -184100,8 +184224,6 @@ const RECOMMENDED_AGENT_COUNT = 8;
184100
184224
  const StyledGridContainer = styled$1(Grid)(({ theme: theme2 }) => ({
184101
184225
  overflowY: "auto",
184102
184226
  padding: theme2.spacing(2, 0),
184103
- height: 400,
184104
- maxHeight: 400,
184105
184227
  flexGrow: 1,
184106
184228
  width: "100%",
184107
184229
  "&::-webkit-scrollbar": {
@@ -184221,7 +184343,7 @@ const CreateAgentStep = ({
184221
184343
  ] })
184222
184344
  }
184223
184345
  ),
184224
- !isLoadingAgents && !agentsError && /* @__PURE__ */ jsxRuntimeExports.jsx(StyledGridContainer, { container: true, spacing: 2, children: recommendedAgents.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "body1", align: "center", children: "No recommended agents found. You can proceed or add agents later." }) }) : recommendedAgents.map((agent) => /* @__PURE__ */ jsxRuntimeExports.jsx(Grid, { item: true, xs: 12, sm: 6, md: 6, lg: 4, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
184346
+ !isLoadingAgents && !agentsError && /* @__PURE__ */ jsxRuntimeExports.jsx(StyledGridContainer, { container: true, spacing: 2, children: recommendedAgents.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "body1", align: "center", children: "No recommended agents found. You can proceed or add agents later." }) }) : recommendedAgents.map((agent) => /* @__PURE__ */ jsxRuntimeExports.jsx(Grid, { item: true, xs: 12, sm: 6, md: 6, lg: 6, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
184225
184347
  Box,
184226
184348
  {
184227
184349
  sx: {
@@ -184536,7 +184658,7 @@ const DefaultModelStep = () => {
184536
184658
  id: "provider-select",
184537
184659
  value: selectedProvider,
184538
184660
  onChange: handleProviderChange,
184539
- MenuProps: menuPropsSx(theme2),
184661
+ MenuProps: menuPropsSx$1(theme2),
184540
184662
  children: availableProviders.map((provider) => /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { value: provider.id, children: provider.name }, provider.id))
184541
184663
  }
184542
184664
  ),
@@ -184556,7 +184678,7 @@ const DefaultModelStep = () => {
184556
184678
  id: "model-select",
184557
184679
  value: selectedModel,
184558
184680
  onChange: handleModelChange,
184559
- MenuProps: menuPropsSx(theme2),
184681
+ MenuProps: menuPropsSx$1(theme2),
184560
184682
  disabled: availableModels.length === 0,
184561
184683
  children: [
184562
184684
  availableModels.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { disabled: true, value: "", children: "No models found for this provider" }),
@@ -184859,7 +184981,7 @@ const ModelCredentialStep = () => {
184859
184981
  id: "credential-select",
184860
184982
  value: selectedCredential,
184861
184983
  onChange: handleCredentialChange,
184862
- MenuProps: menuPropsSx(theme2),
184984
+ MenuProps: menuPropsSx$1(theme2),
184863
184985
  children: modelProviderCredentials.map((cred) => /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { value: cred.key, children: cred.name }, cred.key))
184864
184986
  }
184865
184987
  ),
@@ -185111,22 +185233,7 @@ const RadientChoiceStep = ({
185111
185233
  "Get started for free with ",
185112
185234
  /* @__PURE__ */ jsxRuntimeExports.jsx(RadientPassText, { children: "Radient Pass" })
185113
185235
  ] }),
185114
- /* @__PURE__ */ jsxRuntimeExports.jsxs(CardSubtitle, { variant: "body2", children: [
185115
- " ",
185116
- "Batteries included with",
185117
- " ",
185118
- /* @__PURE__ */ jsxRuntimeExports.jsx(
185119
- Typography,
185120
- {
185121
- component: "span",
185122
- fontWeight: "medium",
185123
- color: radientTheme.palette.primary.main,
185124
- sx: { fontSize: "inherit" },
185125
- children: "web search, image generation, site crawling, hundreds of AI models"
185126
- }
185127
- ),
185128
- ", and more. One API key instead of many, with potential savings when Radient picks the best model to handle each step. Two-click setup, no credit card required."
185129
- ] })
185236
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CardSubtitle, { variant: "body2", children: "Designed for best speed, accuracy, and performance with Local Operator. Get access to all tools and models at once, with potential savings when Radient picks the best model to handle each step. Two-click setup, no credit card required." })
185130
185237
  ] }),
185131
185238
  /* @__PURE__ */ jsxRuntimeExports.jsx(CardIcon, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
185132
185239
  "img",
@@ -185153,7 +185260,7 @@ const RadientChoiceStep = ({
185153
185260
  "Set up your own keys ",
185154
185261
  /* @__PURE__ */ jsxRuntimeExports.jsx(FreeText, { children: "(Free Forever)" })
185155
185262
  ] }),
185156
- /* @__PURE__ */ jsxRuntimeExports.jsx(CardSubtitle, { variant: "body2", children: "Full flexibility for technical users. Bring your own API keys for providers like OpenAI, Anthropic, SERP API, etc., and manage billing separately." })
185263
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CardSubtitle, { variant: "body2", children: "Full flexibility for technical users. Bring your own API keys for providers like OpenAI, Anthropic, Tavily API, etc., and manage billing separately." })
185157
185264
  ] }),
185158
185265
  /* @__PURE__ */ jsxRuntimeExports.jsx(CardIcon, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { fontSize: "3.5rem", children: "🔧" }) }),
185159
185266
  /* @__PURE__ */ jsxRuntimeExports.jsxs(ChooseOption, { className: "choose-option", children: [
@@ -185466,7 +185573,7 @@ const SearchApiStep = () => {
185466
185573
  id: "search-api-select",
185467
185574
  value: selectedCredential,
185468
185575
  onChange: handleCredentialChange,
185469
- MenuProps: menuPropsSx(theme2),
185576
+ MenuProps: menuPropsSx$1(theme2),
185470
185577
  children: searchApiCredentials.map((cred) => /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { value: cred.key, children: cred.key === RECOMMENDED_CREDENTIAL ? `${cred.name} (Recommended)` : cred.name }, cred.key))
185471
185578
  }
185472
185579
  ),
@@ -185755,7 +185862,6 @@ const OnboardingModal = ({ open: open2 }) => {
185755
185862
  }
185756
185863
  } catch (error) {
185757
185864
  console.error("Error validating session/fetching user info:", error);
185758
- showErrorToast("Session validation failed. Please sign in again.");
185759
185865
  clearSession();
185760
185866
  }
185761
185867
  };
@@ -209383,15 +209489,20 @@ const CredentialCard = ({
209383
209489
  variant: "outlined",
209384
209490
  size: "small",
209385
209491
  color: "primary",
209386
- startIcon: /* @__PURE__ */ jsxRuntimeExports.jsx(FontAwesomeIcon, { icon: faKey, size: "xs" }),
209492
+ startIcon: /* @__PURE__ */ jsxRuntimeExports.jsx(
209493
+ FontAwesomeIcon,
209494
+ {
209495
+ icon: faKey,
209496
+ size: "xs",
209497
+ style: { fontSize: "0.875rem" }
209498
+ }
209499
+ ),
209387
209500
  onClick: () => onAdd?.(credentialKey),
209388
209501
  sx: { ...primaryButtonSx, boxShadow: "none" },
209389
209502
  children: "Configure"
209390
209503
  }
209391
209504
  ),
209392
- credInfo.url && // Keep ts-ignore as requested
209393
- // @ts-ignore
209394
- /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip$1, { title: `Get your ${credInfo.name} key`, placement: "top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
209505
+ credInfo.url && /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip$1, { title: `Get your ${credInfo.name} key`, placement: "top", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
209395
209506
  IconButton,
209396
209507
  {
209397
209508
  size: "small",
@@ -209407,57 +209518,101 @@ const CredentialCard = ({
209407
209518
  ] }) })
209408
209519
  ] });
209409
209520
  };
209410
- const StyledFormControl = styled$1(FormControl)(({ theme: theme2 }) => ({
209411
- marginBottom: theme2.spacing(2.5)
209412
- // Consistent spacing
209413
- }));
209414
- const StyledTextField$1 = styled$1(TextField)(({ theme: theme2 }) => ({
209415
- marginBottom: theme2.spacing(2.5),
209416
- // Consistent spacing
209417
- "& .MuiInputBase-root": {
209418
- borderRadius: theme2.shape.borderRadius * 0.75,
209419
- backgroundColor: theme2.palette.background.paper
209521
+ const StyledOutlinedInput = styled$1(OutlinedInput)(({ theme: theme2 }) => ({
209522
+ borderRadius: theme2.shape.borderRadius * 0.75,
209523
+ backgroundColor: theme2.palette.background.paper,
209524
+ border: `1px solid ${theme2.palette.divider}`,
209525
+ minHeight: "40px",
209526
+ height: "40px",
209527
+ fontSize: "0.875rem",
209528
+ paddingRight: 0,
209529
+ "& .MuiOutlinedInput-notchedOutline": {
209530
+ border: "none"
209420
209531
  },
209532
+ "& .MuiSelect-select": {
209533
+ display: "flex",
209534
+ alignItems: "center",
209535
+ gap: theme2.spacing(1),
209536
+ fontSize: "0.875rem",
209537
+ padding: theme2.spacing(1, 1.5),
209538
+ height: "calc(40px - 16px)",
209539
+ boxSizing: "border-box"
209540
+ },
209541
+ "& .MuiInputBase-input": {
209542
+ padding: theme2.spacing(1, 1.5),
209543
+ fontSize: "0.875rem",
209544
+ height: "calc(40px - 16px)",
209545
+ boxSizing: "border-box"
209546
+ },
209547
+ "& .MuiInputBase-input::placeholder": {
209548
+ color: theme2.palette.text.disabled,
209549
+ opacity: 1
209550
+ },
209551
+ "&:hover": {
209552
+ borderColor: theme2.palette.text.secondary
209553
+ },
209554
+ "&.Mui-focused": {
209555
+ borderColor: theme2.palette.primary.main,
209556
+ boxShadow: `0 0 0 2px ${theme2.palette.primary.main}33`
209557
+ }
209558
+ }));
209559
+ const menuPropsSx = (theme2) => ({
209560
+ PaperProps: {
209561
+ sx: {
209562
+ borderRadius: theme2.shape.borderRadius * 0.75,
209563
+ boxShadow: theme2.shadows[2],
209564
+ mt: 0.5,
209565
+ "& .MuiMenuItem-root": {
209566
+ fontSize: "0.875rem",
209567
+ minHeight: "40px",
209568
+ px: 2
209569
+ }
209570
+ }
209571
+ }
209572
+ });
209573
+ const textFieldInputSx = (theme2) => ({
209421
209574
  "& .MuiOutlinedInput-root": {
209422
- "& .MuiOutlinedInput-notchedOutline": {
209423
- borderColor: theme2.palette.divider
209424
- },
209425
- "&:hover .MuiOutlinedInput-notchedOutline": {
209575
+ borderRadius: theme2.shape.borderRadius * 0.75,
209576
+ backgroundColor: theme2.palette.background.paper,
209577
+ border: `1px solid ${theme2.palette.divider}`,
209578
+ minHeight: "40px",
209579
+ height: "40px",
209580
+ transition: "border-color 0.2s ease, box-shadow 0.2s ease",
209581
+ "&:hover": {
209426
209582
  borderColor: theme2.palette.text.secondary
209427
209583
  },
209428
- "&.Mui-focused .MuiOutlinedInput-notchedOutline": {
209584
+ "&.Mui-focused": {
209429
209585
  borderColor: theme2.palette.primary.main,
209430
- borderWidth: "1px"
209586
+ boxShadow: `0 0 0 2px ${theme2.palette.primary.main}33`
209587
+ },
209588
+ "& .MuiOutlinedInput-notchedOutline": {
209589
+ border: "none"
209431
209590
  }
209432
209591
  },
209433
- "& .MuiInputLabel-root": {
209592
+ "& .MuiInputBase-input": {
209593
+ padding: theme2.spacing(1, 1.5),
209434
209594
  fontSize: "0.875rem",
209435
- "&.Mui-focused": {
209436
- color: theme2.palette.primary.main
209437
- }
209438
- }
209439
- }));
209440
- const StyledSelect = styled$1(Select)(({ theme: theme2 }) => ({
209441
- borderRadius: theme2.shape.borderRadius * 0.75,
209442
- backgroundColor: theme2.palette.background.paper,
209443
- "& .MuiOutlinedInput-notchedOutline": {
209444
- borderColor: theme2.palette.divider
209595
+ height: "calc(40px - 16px)",
209596
+ boxSizing: "border-box"
209445
209597
  },
209446
- "&:hover .MuiOutlinedInput-notchedOutline": {
209447
- borderColor: theme2.palette.text.secondary
209598
+ "& .MuiInputBase-input::placeholder": {
209599
+ color: theme2.palette.text.disabled,
209600
+ opacity: 1
209448
209601
  },
209449
- "&.Mui-focused .MuiOutlinedInput-notchedOutline": {
209450
- borderColor: theme2.palette.primary.main
209602
+ "& .MuiFormHelperText-root": {
209603
+ fontSize: "0.75rem",
209604
+ mt: 0.5,
209605
+ ml: 0.5
209451
209606
  }
209452
- }));
209453
- const DescriptionBox = styled$1(Box)(({ theme: theme2 }) => ({
209607
+ });
209608
+ const DescriptionBoxSx = (theme2) => ({
209454
209609
  marginTop: theme2.spacing(1),
209455
209610
  marginBottom: theme2.spacing(2),
209456
209611
  padding: theme2.spacing(1.5),
209457
- backgroundColor: theme2.palette.action.hover,
209612
+ backgroundColor: alpha$1(theme2.palette.background.default, 0.5),
209458
209613
  border: `1px solid ${theme2.palette.divider}`,
209459
209614
  borderRadius: theme2.shape.borderRadius * 0.75
209460
- }));
209615
+ });
209461
209616
  const CredentialDialog = ({
209462
209617
  open: open2,
209463
209618
  onClose,
@@ -209510,6 +209665,21 @@ const CredentialDialog = ({
209510
209665
  (cred) => cred.key === key
209511
209666
  );
209512
209667
  const dialogTitle = isEditMode ? "Update Credential" : "Add New Credential";
209668
+ const FieldLabel2 = styled$1("div")(({ theme: theme22 }) => ({
209669
+ fontFamily: theme22.typography.fontFamily,
209670
+ fontSize: "0.875rem",
209671
+ fontWeight: 500,
209672
+ color: theme22.palette.text.secondary,
209673
+ marginBottom: 6,
209674
+ display: "flex",
209675
+ alignItems: "center"
209676
+ }));
209677
+ const LabelIcon2 = styled$1(Box)({
209678
+ marginRight: 8,
209679
+ opacity: 0.9,
209680
+ display: "flex",
209681
+ alignItems: "center"
209682
+ });
209513
209683
  const dialogActions = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
209514
209684
  /* @__PURE__ */ jsxRuntimeExports.jsx(
209515
209685
  Button,
@@ -209556,7 +209726,7 @@ const CredentialDialog = ({
209556
209726
  }
209557
209727
  )
209558
209728
  ] });
209559
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
209729
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
209560
209730
  BaseDialog,
209561
209731
  {
209562
209732
  open: open2,
@@ -209565,111 +209735,120 @@ const CredentialDialog = ({
209565
209735
  actions: dialogActions,
209566
209736
  maxWidth: "sm",
209567
209737
  fullWidth: true,
209568
- children: [
209569
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Box, { sx: { pt: 2 }, children: [
209570
- isEditMode ? (
209571
- // Display the key being edited (non-editable)
209572
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Box, { mb: 2.5, children: [
209573
- /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "overline", color: "text.secondary", children: "Credential Key" }),
209574
- /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { fontWeight: 500, children: initialKey })
209575
- ] })
209576
- ) : (
209577
- // Show selection for adding new credentials
209578
- /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
209579
- /* @__PURE__ */ jsxRuntimeExports.jsxs(StyledFormControl, { fullWidth: true, children: [
209580
- /* @__PURE__ */ jsxRuntimeExports.jsx(InputLabel, { id: "credential-key-label", children: "Credential Type" }),
209581
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
209582
- StyledSelect,
209583
- {
209584
- labelId: "credential-key-label",
209585
- value: useCustomKey ? "_custom_" : key,
209586
- label: "Credential Type",
209587
- onChange: (e3) => {
209588
- const selectedValue = e3.target.value;
209589
- if (selectedValue === "_custom_") {
209590
- setUseCustomKey(true);
209591
- setKey("");
209592
- } else {
209593
- setUseCustomKey(false);
209594
- setKey(selectedValue);
209595
- setCustomKey("");
209596
- }
209597
- },
209598
- displayEmpty: !key && !useCustomKey,
209599
- children: [
209600
- /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { value: "", disabled: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("em", { children: "Select a credential type..." }) }),
209601
- CREDENTIAL_MANIFEST.map((cred) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
209602
- MenuItem,
209603
- {
209604
- value: cred.key,
209605
- disabled: isExistingKey(cred.key),
209606
- children: [
209607
- cred.name,
209608
- " ",
209609
- isExistingKey(cred.key) && "(Configured)"
209610
- ]
209611
- },
209612
- cred.key
209613
- )),
209614
- /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { value: "_custom_", children: "Custom Credential" })
209615
- ]
209616
- }
209617
- )
209618
- ] }),
209619
- useCustomKey && /* @__PURE__ */ jsxRuntimeExports.jsx(
209620
- StyledTextField$1,
209621
- {
209622
- label: "Custom Credential Key",
209623
- fullWidth: true,
209624
- value: customKey,
209625
- onChange: (e3) => setCustomKey(e3.target.value),
209626
- error: isExistingKey(customKey),
209627
- helperText: isExistingKey(customKey) ? "This credential already exists" : "",
209628
- required: true,
209629
- autoFocus: true
209630
- }
209631
- ),
209632
- selectedCredentialManifest && !useCustomKey && /* @__PURE__ */ jsxRuntimeExports.jsxs(DescriptionBox, { children: [
209633
- /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "body2", color: "text.secondary", gutterBottom: true, children: selectedCredentialManifest.description }),
209634
- selectedCredentialManifest.url && /* @__PURE__ */ jsxRuntimeExports.jsxs(
209635
- Link,
209636
- {
209637
- href: selectedCredentialManifest.url,
209638
- target: "_blank",
209639
- rel: "noopener noreferrer",
209640
- variant: "body2",
209641
- sx: { display: "inline-flex", alignItems: "center" },
209642
- children: [
209643
- "Get your ",
209644
- selectedCredentialManifest.name,
209645
- " key"
209646
- ]
209647
- }
209648
- )
209649
- ] })
209650
- ] })
209651
- ),
209738
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Box, { sx: { pt: 2 }, children: [
209739
+ isEditMode ? /* @__PURE__ */ jsxRuntimeExports.jsxs(Box, { mb: 2.5, children: [
209652
209740
  /* @__PURE__ */ jsxRuntimeExports.jsx(
209653
- StyledTextField$1,
209741
+ Typography,
209742
+ {
209743
+ variant: "overline",
209744
+ color: "text.secondary",
209745
+ sx: { fontSize: "0.75rem", letterSpacing: 1, fontWeight: 500 },
209746
+ children: "Credential Key"
209747
+ }
209748
+ ),
209749
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { fontWeight: 500, sx: { fontSize: "0.95rem" }, children: initialKey })
209750
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
209751
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FormControl, { fullWidth: true, sx: { mb: 2.5 }, children: [
209752
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldLabel2, { children: [
209753
+ /* @__PURE__ */ jsxRuntimeExports.jsx(LabelIcon2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(FontAwesomeIcon, { icon: faKey, size: "sm" }) }),
209754
+ "Credential Type"
209755
+ ] }),
209756
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
209757
+ Select,
209758
+ {
209759
+ value: useCustomKey ? "_custom_" : key,
209760
+ onChange: (e3) => {
209761
+ const selectedValue = e3.target.value;
209762
+ if (selectedValue === "_custom_") {
209763
+ setUseCustomKey(true);
209764
+ setKey("");
209765
+ } else {
209766
+ setUseCustomKey(false);
209767
+ setKey(selectedValue);
209768
+ setCustomKey("");
209769
+ }
209770
+ },
209771
+ displayEmpty: !key && !useCustomKey,
209772
+ MenuProps: menuPropsSx(theme2),
209773
+ input: /* @__PURE__ */ jsxRuntimeExports.jsx(StyledOutlinedInput, { notched: false, label: void 0 }),
209774
+ children: [
209775
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { value: "", disabled: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("em", { children: "Select a credential type..." }) }),
209776
+ CREDENTIAL_MANIFEST.map((cred) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
209777
+ MenuItem,
209778
+ {
209779
+ value: cred.key,
209780
+ disabled: isExistingKey(cred.key),
209781
+ children: [
209782
+ cred.name,
209783
+ " ",
209784
+ isExistingKey(cred.key) && "(Configured)"
209785
+ ]
209786
+ },
209787
+ cred.key
209788
+ )),
209789
+ /* @__PURE__ */ jsxRuntimeExports.jsx(MenuItem, { value: "_custom_", children: "Custom Credential" })
209790
+ ]
209791
+ }
209792
+ )
209793
+ ] }),
209794
+ useCustomKey && /* @__PURE__ */ jsxRuntimeExports.jsx(
209795
+ TextField,
209654
209796
  {
209655
- label: "Credential Value",
209797
+ label: "Custom Credential Key",
209656
209798
  fullWidth: true,
209657
- type: "password",
209658
- value,
209659
- onChange: (e3) => setValue(e3.target.value),
209660
- onKeyDown: (e3) => {
209661
- if (e3.key === "Enter" && canSave) {
209662
- handleSave();
209663
- }
209664
- },
209799
+ value: customKey,
209800
+ onChange: (e3) => setCustomKey(e3.target.value),
209801
+ error: isExistingKey(customKey),
209802
+ helperText: isExistingKey(customKey) ? "This credential already exists" : "",
209665
209803
  required: true,
209666
- autoFocus: isEditMode,
209667
- helperText: isEditMode ? `Enter the new value for ${initialKey}` : "Enter the credential value or API key."
209804
+ autoFocus: true,
209805
+ sx: textFieldInputSx(theme2)
209668
209806
  }
209669
- )
209807
+ ),
209808
+ selectedCredentialManifest && !useCustomKey && /* @__PURE__ */ jsxRuntimeExports.jsxs(Box, { sx: DescriptionBoxSx(theme2), children: [
209809
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { variant: "body2", color: "text.secondary", gutterBottom: true, children: selectedCredentialManifest.description }),
209810
+ selectedCredentialManifest.url && /* @__PURE__ */ jsxRuntimeExports.jsxs(
209811
+ Link,
209812
+ {
209813
+ href: selectedCredentialManifest.url,
209814
+ target: "_blank",
209815
+ rel: "noopener noreferrer",
209816
+ variant: "body2",
209817
+ sx: { display: "inline-flex", alignItems: "center" },
209818
+ children: [
209819
+ "Get your ",
209820
+ selectedCredentialManifest.name,
209821
+ " key"
209822
+ ]
209823
+ }
209824
+ )
209825
+ ] })
209670
209826
  ] }),
209671
- " "
209672
- ]
209827
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldLabel2, { children: [
209828
+ /* @__PURE__ */ jsxRuntimeExports.jsx(LabelIcon2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(FontAwesomeIcon, { icon: faKey, size: "sm" }) }),
209829
+ "Credential Value"
209830
+ ] }),
209831
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
209832
+ TextField,
209833
+ {
209834
+ fullWidth: true,
209835
+ type: "password",
209836
+ value,
209837
+ onChange: (e3) => setValue(e3.target.value),
209838
+ onKeyDown: (e3) => {
209839
+ if (e3.key === "Enter" && canSave) {
209840
+ handleSave();
209841
+ }
209842
+ },
209843
+ required: true,
209844
+ autoFocus: isEditMode,
209845
+ placeholder: "Enter the credential value or API key.",
209846
+ helperText: isEditMode ? `Enter the new value for ${initialKey}` : "Enter the credential value or API key.",
209847
+ sx: textFieldInputSx(theme2),
209848
+ InputLabelProps: { shrink: false }
209849
+ }
209850
+ )
209851
+ ] })
209673
209852
  }
209674
209853
  );
209675
209854
  };
@@ -210259,6 +210438,10 @@ const StyledTextField = styled$1(TextField)(({ theme: theme2 }) => ({
210259
210438
  fontSize: "0.875rem",
210260
210439
  // Consistent font size
210261
210440
  lineHeight: 1.5,
210441
+ whiteSpace: "pre-wrap",
210442
+ // Ensure text wraps within the input
210443
+ wordBreak: "break-word",
210444
+ // Break long words to prevent overflow
210262
210445
  // Shadcn-like scrollbar
210263
210446
  "&::-webkit-scrollbar": {
210264
210447
  width: "8px",
@@ -211606,7 +211789,7 @@ const SettingsPage = () => {
211606
211789
  {
211607
211790
  value: config2.values.conversation_length,
211608
211791
  label: "Maximum Conversation History",
211609
- description: "Number of messages to keep in conversation history for context. More messages will make the agents have longer memory but more expensive to run.",
211792
+ description: "Number of messages to keep in conversation history for context. More messages will make the agents have longer memory but more expensive to run. Recommended: 100",
211610
211793
  min: 10,
211611
211794
  max: 200,
211612
211795
  step: 10,
@@ -211621,7 +211804,7 @@ const SettingsPage = () => {
211621
211804
  {
211622
211805
  value: config2.values.detail_length,
211623
211806
  label: "Detail View Length",
211624
- description: "Maximum number of messages to show in the detailed conversation view. Messages beyond this limit will be summarized. Shortening this will decrease costs but some important details could get lost from earlier messages.",
211807
+ description: "Maximum number of messages to show in the detailed conversation view. Messages beyond this limit will be summarized. Shortening this will decrease costs but some important details could get lost from earlier messages. Recommended: 20",
211625
211808
  min: 10,
211626
211809
  max: 100,
211627
211810
  step: 5,
@@ -211636,7 +211819,7 @@ const SettingsPage = () => {
211636
211819
  {
211637
211820
  value: config2.values.max_learnings_history,
211638
211821
  label: "Maximum Learnings History",
211639
- description: "Number of learning items to retain for context and personalization. More items will make the agents acquire a longer history of knowledge from your conversations but more expensive to run.",
211822
+ description: "Number of learning items to retain for context and personalization. More items will make the agents acquire a longer history of knowledge from your conversations but more expensive to run. Recommended: 50",
211640
211823
  min: 10,
211641
211824
  max: 100,
211642
211825
  step: 10,
@@ -1,4 +1,4 @@
1
- import { L as LRParser, E as ExternalTokenizer, s as styleTags, C as ContextTracker, t as tags, b as LRLanguage, d as LanguageSupport, p as parseMixed, f as indentNodeProp, g as foldNodeProp, j as delimitedIndent, l as foldInside } from "./index-Bxd9cfRL.js";
1
+ import { L as LRParser, E as ExternalTokenizer, s as styleTags, C as ContextTracker, t as tags, b as LRLanguage, d as LanguageSupport, p as parseMixed, f as indentNodeProp, g as foldNodeProp, j as delimitedIndent, l as foldInside } from "./index-CXyUnv28.js";
2
2
  import "./fonts-BAmz1ETd.js";
3
3
  const blockEnd = 63, eof = 64, DirectiveEnd = 1, DocEnd = 2, sequenceStartMark = 3, sequenceContinueMark = 4, explicitMapStartMark = 5, explicitMapContinueMark = 6, flowMapMark = 7, mapStartMark = 65, mapContinueMark = 66, Literal = 8, QuotedLiteral = 9, Anchor = 10, Alias = 11, Tag = 12, BlockLiteralContent = 13, BracketL = 19, FlowSequence = 20, Colon = 29, BraceL = 33, FlowMapping = 34, BlockLiteralHeader = 47;
4
4
  const type_Top = 0, type_Seq = 1, type_Map = 2, type_Flow = 3, type_Lit = 4;
@@ -9,7 +9,7 @@
9
9
  <meta http-equiv="Content-Security-Policy"
10
10
  content="default-src 'self'; connect-src 'self' http://localhost:1111 http://127.0.0.1:1111 ws://localhost:1111 ws://127.0.0.1:1111 http://localhost:8080 http://127.0.0.1:8080 https://api.radienthq.com https://us.i.posthog.com https://login.microsoftonline.com https://accounts.google.com; script-src 'self' https://us-assets.i.posthog.com https://accounts.google.com https://login.microsoftonline.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: http://localhost:1111 http://127.0.0.1:1111; media-src 'self' http://localhost:1111 http://127.0.0.1:1111; font-src 'self'; frame-src 'self' https://accounts.google.com https://login.microsoftonline.com" />
11
11
  <meta http-equiv="Cross-Origin-Opener-Policy" content="same-origin-allow-popups" />
12
- <script type="module" crossorigin src="./assets/index-Bxd9cfRL.js"></script>
12
+ <script type="module" crossorigin src="./assets/index-CXyUnv28.js"></script>
13
13
  <link rel="modulepreload" crossorigin href="./assets/fonts-BAmz1ETd.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/fonts-B9KBGB-g.css">
15
15
  <link rel="stylesheet" crossorigin href="./assets/index-0vP6mKPB.css">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "local-operator-ui",
3
- "version": "0.7.3",
3
+ "version": "0.7.4",
4
4
  "productName": "Local Operator",
5
5
  "description": "User interface for AI agent assistants that run Python code safely on your device through an intuitive chat interface. Supports local and cloud LLM models with built-in security features.",
6
6
  "main": "./out/main/index.js",