gitxelectron 1.3.8 → 1.4.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.
@@ -12758,7 +12758,7 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12758
12758
  });
12759
12759
  }
12760
12760
  }, []);
12761
- const checkAuth = async () => {
12761
+ async function checkAuth() {
12762
12762
  const status = await window.api.getAuthStatus();
12763
12763
  if (status.status !== "Verified") {
12764
12764
  startAuth();
@@ -12766,8 +12766,8 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12766
12766
  setStep(2);
12767
12767
  fetchUserRepos();
12768
12768
  }
12769
- };
12770
- const startAuth = async () => {
12769
+ }
12770
+ async function startAuth() {
12771
12771
  try {
12772
12772
  const data = await window.api.startDeviceFlow();
12773
12773
  setDeviceFlowData(data);
@@ -12780,7 +12780,7 @@ function RepositoryWizard({ repoPath, onClose, onSuccess }) {
12780
12780
  } catch (e) {
12781
12781
  setError(e.message);
12782
12782
  }
12783
- };
12783
+ }
12784
12784
  const fetchUserRepos = async () => {
12785
12785
  try {
12786
12786
  const repos = await window.api.getUserRepositories();
@@ -13819,8 +13819,16 @@ const LiveGitHubSpace = React.memo(() => {
13819
13819
  pollEvents();
13820
13820
  const intervalId = setInterval(pollEvents, 6e4);
13821
13821
  let lastSpawnTime = 0;
13822
+ let lastDrawTime = 0;
13823
+ const FPS = 30;
13824
+ const frameInterval = 1e3 / FPS;
13822
13825
  const update = (time2) => {
13823
13826
  if (!isRunning) return;
13827
+ if (time2 - lastDrawTime < frameInterval) {
13828
+ animationFrameId = requestAnimationFrame(update);
13829
+ return;
13830
+ }
13831
+ lastDrawTime = time2;
13824
13832
  if (time2 - lastSpawnTime > 800 && (eventQueue.length > 0 || fallbackQueue.length > 0)) {
13825
13833
  let ev;
13826
13834
  if (eventQueue.length > 0) {
@@ -13846,8 +13854,7 @@ const LiveGitHubSpace = React.memo(() => {
13846
13854
  });
13847
13855
  lastSpawnTime = time2;
13848
13856
  }
13849
- ctx.fillStyle = "#0d1117";
13850
- ctx.fillRect(0, 0, canvas.width, canvas.height);
13857
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
13851
13858
  ctx.fillStyle = "white";
13852
13859
  stars.forEach((s) => {
13853
13860
  s.x -= s.speed;
@@ -14254,7 +14261,7 @@ const DiceGame = () => {
14254
14261
  ) })
14255
14262
  ] }) });
14256
14263
  };
14257
- const SpaceScene = ({ fullScreen, onGameActiveChange }) => {
14264
+ const SpaceScene = ({ fullScreen, liteMode, onGameActiveChange }) => {
14258
14265
  const [isOnline, setIsOnline] = reactExports.useState(navigator.onLine);
14259
14266
  const [activeMode, setActiveMode] = reactExports.useState("none");
14260
14267
  reactExports.useEffect(() => {
@@ -14290,10 +14297,12 @@ const SpaceScene = ({ fullScreen, onGameActiveChange }) => {
14290
14297
  {
14291
14298
  className: `${fullScreen ? "absolute inset-0 z-0" : "relative w-full h-48 rounded-xl mb-6 border border-border mt-2 shadow-inner"} bg-[#0d1117] overflow-hidden group`,
14292
14299
  children: [
14293
- currentMode === "retro" && /* @__PURE__ */ jsxRuntimeExports.jsx(RetroSpaceGame, {}),
14294
- currentMode === "2048" && /* @__PURE__ */ jsxRuntimeExports.jsx(LogicGame2048, {}),
14295
- currentMode === "dice" && /* @__PURE__ */ jsxRuntimeExports.jsx(DiceGame, {}),
14296
- currentMode === "none" && /* @__PURE__ */ jsxRuntimeExports.jsx(LiveGitHubSpace, {}),
14300
+ liteMode ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-[radial-gradient(ellipse_at_center,_var(--tw-gradient-stops))] from-slate-900 via-[#0d1117] to-[#0d1117]", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute bottom-4 right-4 flex items-center justify-center text-white/15 pointer-events-none", title: "Lite Mode Active", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M13 10V3L4 14h7v7l9-11h-7z" }) }) }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
14301
+ currentMode === "retro" && /* @__PURE__ */ jsxRuntimeExports.jsx(RetroSpaceGame, {}),
14302
+ currentMode === "2048" && /* @__PURE__ */ jsxRuntimeExports.jsx(LogicGame2048, {}),
14303
+ currentMode === "dice" && /* @__PURE__ */ jsxRuntimeExports.jsx(DiceGame, {}),
14304
+ currentMode === "none" && /* @__PURE__ */ jsxRuntimeExports.jsx(LiveGitHubSpace, {})
14305
+ ] }),
14297
14306
  /* @__PURE__ */ jsxRuntimeExports.jsx(
14298
14307
  "button",
14299
14308
  {
@@ -23143,7 +23152,7 @@ function UniversalPushWizard({ isOpen, onClose, onAutoHealTrigger }) {
23143
23152
  reset();
23144
23153
  }
23145
23154
  }, [isOpen]);
23146
- const reset = () => {
23155
+ function reset() {
23147
23156
  setStep("START");
23148
23157
  setFiles([]);
23149
23158
  setAccounts([]);
@@ -23163,7 +23172,7 @@ function UniversalPushWizard({ isOpen, onClose, onAutoHealTrigger }) {
23163
23172
  setShowDiff(false);
23164
23173
  setCommitMessage("");
23165
23174
  setErrorMsg("");
23166
- };
23175
+ }
23167
23176
  const handleClose = async () => {
23168
23177
  if (workspacePath) {
23169
23178
  await window.api.cleanupUniversalWorkspace(workspacePath);
@@ -23898,22 +23907,27 @@ function UniversalPushWizard({ isOpen, onClose, onAutoHealTrigger }) {
23898
23907
  function WelcomeWizard({ onComplete }) {
23899
23908
  const [step, setStep] = reactExports.useState(1);
23900
23909
  const [deviceFlowData, setDeviceFlowData] = reactExports.useState(null);
23901
- const [authStatus, setAuthStatus] = reactExports.useState("pending");
23910
+ const [authStatus, setAuthStatus] = reactExports.useState(
23911
+ "pending"
23912
+ );
23902
23913
  const [pinInput, setPinInput] = reactExports.useState("");
23903
23914
  const [isFinishing, setIsFinishing] = reactExports.useState(false);
23904
23915
  const [authError, setAuthError] = reactExports.useState("");
23905
23916
  const [isCopied, setIsCopied] = reactExports.useState(false);
23906
- const copyCodeToClipboard = reactExports.useCallback(async (codeToCopy) => {
23907
- const code = codeToCopy || deviceFlowData?.user_code;
23908
- if (!code) return;
23909
- try {
23910
- await navigator.clipboard.writeText(code);
23911
- setIsCopied(true);
23912
- setTimeout(() => setIsCopied(false), 2500);
23913
- } catch (err) {
23914
- console.warn("Failed to copy to clipboard", err);
23915
- }
23916
- }, [deviceFlowData]);
23917
+ const copyCodeToClipboard = reactExports.useCallback(
23918
+ async (codeToCopy) => {
23919
+ const code = codeToCopy || deviceFlowData?.user_code;
23920
+ if (!code) return;
23921
+ try {
23922
+ await navigator.clipboard.writeText(code);
23923
+ setIsCopied(true);
23924
+ setTimeout(() => setIsCopied(false), 2500);
23925
+ } catch (err) {
23926
+ console.warn("Failed to copy to clipboard", err);
23927
+ }
23928
+ },
23929
+ [deviceFlowData]
23930
+ );
23917
23931
  const startAuth = async () => {
23918
23932
  try {
23919
23933
  setAuthStatus("waiting");
@@ -25083,7 +25097,7 @@ const CommitReceiptPrinter = ({
25083
25097
  commit,
25084
25098
  onClose
25085
25099
  }) => {
25086
- const [isPrinted, setIsPrinted] = reactExports.useState(true);
25100
+ const [isPrinted, setIsPrinted] = reactExports.useState(false);
25087
25101
  const [searchQuery, setSearchQuery] = reactExports.useState("");
25088
25102
  const [scrollTop, setScrollTop] = reactExports.useState(0);
25089
25103
  const scrollRef = reactExports.useRef(null);
@@ -25118,13 +25132,13 @@ const CommitReceiptPrinter = ({
25118
25132
  onClose && /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "printer-close-btn", onClick: onClose, title: "Close Printer", children: "✕" }),
25119
25133
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "printer-machine-head", children: [
25120
25134
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "printer" }),
25121
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "printer-display", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "printer-message", children: searchQuery ? `${filteredFiles.length} found` : `${allFiles.length} files` }) }),
25135
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "printer-display", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "printer-message", children: isPrinted ? searchQuery ? `${filteredFiles.length} found` : `${allFiles.length} files` : "Click 🖨 to print" }) }),
25122
25136
  /* @__PURE__ */ jsxRuntimeExports.jsx(
25123
25137
  "button",
25124
25138
  {
25125
25139
  className: "print-button",
25126
25140
  onClick: () => setIsPrinted(!isPrinted),
25127
- title: isPrinted ? "Toggle Receipt" : "Print Receipt",
25141
+ title: isPrinted ? "Roll Up Receipt" : "Print Receipt",
25128
25142
  children: "🖨"
25129
25143
  }
25130
25144
  )
@@ -25149,6 +25163,16 @@ const CommitReceiptPrinter = ({
25149
25163
  ] }),
25150
25164
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: new Date(commit.date).toLocaleString() })
25151
25165
  ] }),
25166
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "receipt-subheader text-[11px] text-gray-500 opacity-90 border-b border-dashed border-gray-300 pb-1 mb-2", children: [
25167
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
25168
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-semibold", children: "Security:" }),
25169
+ " Verified Commit ✓"
25170
+ ] }),
25171
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
25172
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-semibold", children: "Protocol:" }),
25173
+ " HTTPS (GitHub Models AI)"
25174
+ ] })
25175
+ ] }),
25152
25176
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "receipt-search-bar", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
25153
25177
  "input",
25154
25178
  {
@@ -25171,7 +25195,7 @@ const CommitReceiptPrinter = ({
25171
25195
  className: "receipt-table-scroll custom-scrollbar",
25172
25196
  onScroll: handleScroll,
25173
25197
  style: { height: `${CONTAINER_HEIGHT}px` },
25174
- children: filteredFiles.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "receipt-empty-state", children: "No matching files found." }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
25198
+ children: filteredFiles.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "receipt-empty-state", children: allFiles.length === 0 ? "No file modifications recorded in this commit." : "No matching files found." }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
25175
25199
  "div",
25176
25200
  {
25177
25201
  style: { height: `${totalVirtualHeight}px`, position: "relative", width: "100%" },
@@ -25849,6 +25873,20 @@ function App() {
25849
25873
  const [isResizing, setIsResizing] = reactExports.useState(false);
25850
25874
  const { t, lang, setLang } = useTranslation();
25851
25875
  const [appVersion, setAppVersion] = reactExports.useState("");
25876
+ const [liteMode, setLiteMode] = reactExports.useState(() => {
25877
+ const cores = navigator.hardwareConcurrency || 4;
25878
+ const memory = navigator.deviceMemory || 4;
25879
+ return cores < 6 || memory < 8;
25880
+ });
25881
+ reactExports.useEffect(() => {
25882
+ const handleKeyDown = (e) => {
25883
+ if (e.ctrlKey && e.key === "Delete") {
25884
+ setLiteMode((prev) => !prev);
25885
+ }
25886
+ };
25887
+ window.addEventListener("keydown", handleKeyDown);
25888
+ return () => window.removeEventListener("keydown", handleKeyDown);
25889
+ }, []);
25852
25890
  reactExports.useEffect(() => {
25853
25891
  const initVersion = async () => {
25854
25892
  try {
@@ -25961,6 +25999,11 @@ function App() {
25961
25999
  const [pushFailureData, setPushFailureData] = reactExports.useState(null);
25962
26000
  const [gitErrorData, setGitErrorData] = reactExports.useState(null);
25963
26001
  const [showSettings, setShowSettings] = reactExports.useState(false);
26002
+ const [showPrivacyModal, setShowPrivacyModal] = reactExports.useState(false);
26003
+ const [showForcePushModal, setShowForcePushModal] = reactExports.useState(false);
26004
+ const [isExecutingForcePush, setIsExecutingForcePush] = reactExports.useState(false);
26005
+ const [isClearingCache, setIsClearingCache] = reactExports.useState(false);
26006
+ const [settingsTab, setSettingsTab] = reactExports.useState("appearance");
25964
26007
  const [draftTheme, setDraftTheme] = reactExports.useState("github-dark");
25965
26008
  const [draftLang, setDraftLang] = reactExports.useState("en");
25966
26009
  const [draftDailyAuth, setDraftDailyAuth] = reactExports.useState(true);
@@ -26134,8 +26177,10 @@ function App() {
26134
26177
  });
26135
26178
  }, 3e4);
26136
26179
  } else {
26137
- setCollaboratedRepos([]);
26138
- setInvitations([]);
26180
+ Promise.resolve().then(() => {
26181
+ setCollaboratedRepos([]);
26182
+ setInvitations([]);
26183
+ });
26139
26184
  }
26140
26185
  return () => {
26141
26186
  if (invInterval) clearInterval(invInterval);
@@ -26199,7 +26244,9 @@ function App() {
26199
26244
  };
26200
26245
  window.addEventListener("online", handleOnline);
26201
26246
  if (navigator.onLine) {
26202
- processOfflineQueue();
26247
+ Promise.resolve().then(() => {
26248
+ processOfflineQueue();
26249
+ });
26203
26250
  }
26204
26251
  return () => window.removeEventListener("online", handleOnline);
26205
26252
  }, [repoPath]);
@@ -26486,7 +26533,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26486
26533
  }
26487
26534
  }
26488
26535
  };
26489
- const refreshRepoState = async () => {
26536
+ async function refreshRepoState() {
26490
26537
  if (refreshLockRef.current) return;
26491
26538
  refreshLockRef.current = true;
26492
26539
  setIsRefreshing(true);
@@ -26500,7 +26547,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26500
26547
  try {
26501
26548
  const dh = await window.api.getDeletedHistory();
26502
26549
  setDeletedHistory(dh);
26503
- } catch (err) {
26550
+ } catch {
26504
26551
  }
26505
26552
  const auth = await window.api.getAuthStatus();
26506
26553
  setAuthStatus(auth);
@@ -26524,7 +26571,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26524
26571
  urlObj.password = "";
26525
26572
  fetchUrl = urlObj.toString();
26526
26573
  }
26527
- } catch (e) {
26574
+ } catch {
26528
26575
  }
26529
26576
  if (fetchUrl.endsWith(".git")) {
26530
26577
  fetchUrl = fetchUrl.replace(/\.git$/, "");
@@ -26556,7 +26603,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26556
26603
  }
26557
26604
  }
26558
26605
  }
26559
- } catch (e) {
26606
+ } catch {
26560
26607
  setBranches({ current: "No commits yet", all: [] });
26561
26608
  }
26562
26609
  })();
@@ -26604,14 +26651,14 @@ Are you SURE you want to link "${repoName}" to this folder?`
26604
26651
  if (!exists) {
26605
26652
  console.warn("Repository path does not exist on disk:", repoPath);
26606
26653
  }
26607
- } catch (err) {
26654
+ } catch {
26608
26655
  }
26609
26656
  }
26610
26657
  } finally {
26611
26658
  setIsRefreshing(false);
26612
26659
  refreshLockRef.current = false;
26613
26660
  }
26614
- };
26661
+ }
26615
26662
  const handleCreateBranchSubmit = async (name, base) => {
26616
26663
  try {
26617
26664
  await window.api.createBranch(name, base);
@@ -26641,7 +26688,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26641
26688
  setShowAuthModal(true);
26642
26689
  try {
26643
26690
  await navigator.clipboard.writeText(data.user_code);
26644
- } catch (err) {
26691
+ } catch {
26645
26692
  }
26646
26693
  await window.api.pollDeviceFlow(data.device_code, data.interval * 1e3);
26647
26694
  setShowAuthModal(false);
@@ -26703,6 +26750,59 @@ Are you SURE you want to link "${repoName}" to this folder?`
26703
26750
  setIsPulling(false);
26704
26751
  }
26705
26752
  };
26753
+ const formatErrorMessage = (msg) => {
26754
+ if (!msg) return "";
26755
+ return msg.replace(/^Error invoking remote method '[^']+':\s*/i, "").replace(/^Error:\s*/i, "").replace(/^error:\s*/i, "").trim();
26756
+ };
26757
+ const handleResolveConflictOurs = async () => {
26758
+ try {
26759
+ showToast("Resolving conflicts: keeping local changes...", "info");
26760
+ await window.api.executeRawGit(["checkout", "--ours", "."]);
26761
+ await window.api.executeRawGit(["add", "."]);
26762
+ await window.api.executeRawGit(["commit", "-m", "Resolved conflicts (kept local changes)"]);
26763
+ setPushFailureData(null);
26764
+ await refreshRepoState();
26765
+ showToast("✅ Conflicts resolved (kept local changes)", "success");
26766
+ } catch (err) {
26767
+ showToast(`Failed to resolve conflicts: ${err.message}`, "error");
26768
+ }
26769
+ };
26770
+ const handleResolveConflictTheirs = async () => {
26771
+ try {
26772
+ showToast("Resolving conflicts: accepting remote changes...", "info");
26773
+ await window.api.executeRawGit(["checkout", "--theirs", "."]);
26774
+ await window.api.executeRawGit(["add", "."]);
26775
+ await window.api.executeRawGit([
26776
+ "commit",
26777
+ "-m",
26778
+ "Resolved conflicts (accepted remote changes)"
26779
+ ]);
26780
+ setPushFailureData(null);
26781
+ await refreshRepoState();
26782
+ showToast("✅ Conflicts resolved (accepted remote changes)", "success");
26783
+ } catch (err) {
26784
+ showToast(`Failed to resolve conflicts: ${err.message}`, "error");
26785
+ }
26786
+ };
26787
+ const handleAbortMerge = async () => {
26788
+ try {
26789
+ showToast("Aborting merge...", "info");
26790
+ try {
26791
+ await window.api.executeRawGit(["merge", "--abort"]);
26792
+ } catch {
26793
+ try {
26794
+ await window.api.executeRawGit(["rebase", "--abort"]);
26795
+ } catch {
26796
+ await window.api.executeRawGit(["reset", "--merge"]);
26797
+ }
26798
+ }
26799
+ setPushFailureData(null);
26800
+ await refreshRepoState();
26801
+ showToast("✅ Merge aborted. Repository restored to clean state.", "success");
26802
+ } catch (err) {
26803
+ showToast(`Failed to abort merge: ${err.message}`, "error");
26804
+ }
26805
+ };
26706
26806
  const handleSyncCollabRepo = async (repo, savedPath) => {
26707
26807
  try {
26708
26808
  showToast(`Syncing ${repo.name} with GitHub...`, "info");
@@ -26768,6 +26868,35 @@ Are you SURE you want to link "${repoName}" to this folder?`
26768
26868
  }, 1500);
26769
26869
  break;
26770
26870
  }
26871
+ const isConflictErr = currentError.includes("unmerged files") || currentError.includes("unresolved conflict") || currentError.includes("automatic merge failed") || currentError.includes("you have unmerged paths");
26872
+ if (isConflictErr) {
26873
+ setHealerMessage(
26874
+ "Unmerged conflict detected. Automatically resolving conflicted files..."
26875
+ );
26876
+ try {
26877
+ await window.api.executeRawGit(["checkout", "--ours", "."]);
26878
+ await window.api.executeRawGit(["add", "."]);
26879
+ await window.api.executeRawGit([
26880
+ "commit",
26881
+ "-m",
26882
+ "Auto-resolved conflicts: kept local changes"
26883
+ ]);
26884
+ } catch {
26885
+ try {
26886
+ await window.api.executeRawGit(["merge", "--abort"]);
26887
+ } catch {
26888
+ }
26889
+ }
26890
+ await refreshRepoState();
26891
+ showToast("Merge conflicts resolved successfully!", "success");
26892
+ setTimeout(() => {
26893
+ setShowHealerOverlay(false);
26894
+ if (overrideRepoPath && repoPath) {
26895
+ window.api.setRepoPath(repoPath);
26896
+ }
26897
+ }, 1500);
26898
+ return true;
26899
+ }
26771
26900
  const currentStatus = await window.api.getStatus();
26772
26901
  const result = await window.api.askAi(
26773
26902
  "gemini",
@@ -26801,14 +26930,18 @@ Are you SURE you want to link "${repoName}" to this folder?`
26801
26930
  setShowHealerOverlay(false);
26802
26931
  await refreshRepoState();
26803
26932
  } else {
26804
- await window.api.pullFromRemote(remotes[0].name, overrideBranch || branches.current);
26933
+ const wasConflict = currentError.includes("unmerged files") || currentError.includes("unresolved conflict") || currentError.includes("automatic merge failed") || currentError.includes("you have unmerged paths");
26934
+ if (!wasConflict) {
26935
+ await window.api.pullFromRemote(remotes[0].name, overrideBranch || branches.current);
26936
+ }
26805
26937
  }
26806
- setHealerMessage(`Successfully auto-healed and ${operation}ed!`);
26938
+ setHealerMessage(`Successfully auto-healed and reconciled!`);
26807
26939
  setTimeout(() => {
26808
26940
  setShowHealerOverlay(false);
26809
26941
  if (overrideRepoPath && repoPath) {
26810
26942
  window.api.setRepoPath(repoPath);
26811
26943
  }
26944
+ refreshRepoState();
26812
26945
  }, 2e3);
26813
26946
  return;
26814
26947
  } else {
@@ -26863,7 +26996,12 @@ Are you SURE you want to link "${repoName}" to this folder?`
26863
26996
  repository: repoPath?.split("\\").pop() || "",
26864
26997
  branch: branches.current,
26865
26998
  files: status.staged.length,
26866
- commitMessage
26999
+ commitMessage,
27000
+ timestamp: (/* @__PURE__ */ new Date()).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }),
27001
+ author: authStatus.username ? `@${authStatus.username}` : "Git Author",
27002
+ authMethod: authStatus.authMethod || "GitHub OAuth",
27003
+ aiProvider: authStatus.aiProvider || "GitHub Models",
27004
+ securityStatus: authStatus.securityStatus || "End-to-End Encrypted"
26867
27005
  });
26868
27006
  setCommitMessage("");
26869
27007
  setShowConfirmPush(false);
@@ -26896,7 +27034,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26896
27034
  setShowAuthModal(true);
26897
27035
  try {
26898
27036
  await navigator.clipboard.writeText(data.user_code);
26899
- } catch (err) {
27037
+ } catch {
26900
27038
  }
26901
27039
  await window.api.pollDeviceFlow(data.device_code, data.interval * 1e3);
26902
27040
  setShowAuthModal(false);
@@ -26919,7 +27057,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
26919
27057
  try {
26920
27058
  name = await window.api.getGitConfig("user.name");
26921
27059
  email = await window.api.getGitConfig("user.email");
26922
- } catch (e) {
27060
+ } catch {
26923
27061
  }
26924
27062
  if ((!name || !email) && accounts.length > 0) {
26925
27063
  const activeAcc = accounts.find((a) => a.id === activeAccountId) || accounts[0];
@@ -26947,13 +27085,34 @@ Are you SURE you want to link "${repoName}" to this folder?`
26947
27085
  document.documentElement.setAttribute("data-theme", theme);
26948
27086
  setShowSettings(false);
26949
27087
  };
27088
+ const handleExecuteForcePush = async () => {
27089
+ setIsExecutingForcePush(true);
27090
+ try {
27091
+ const remotes = await window.api.getRemotes();
27092
+ if (!remotes || remotes.length === 0) {
27093
+ showToast("No remote configured to push to.", "error");
27094
+ return;
27095
+ }
27096
+ const remoteName = remotes[0].name;
27097
+ const branchName = status?.current || "main";
27098
+ showToast(`Executing Master Force Push to ${remoteName}/${branchName}...`, "info");
27099
+ await window.api.masterPush(remoteName, branchName);
27100
+ showToast("Master Force Push successful!", "success");
27101
+ await refreshRepoState();
27102
+ setShowForcePushModal(false);
27103
+ } catch (err) {
27104
+ showToast("Force Push failed: " + (err.message || "Unknown error"), "error");
27105
+ } finally {
27106
+ setIsExecutingForcePush(false);
27107
+ }
27108
+ };
26950
27109
  const viewDiff = async (file, staged) => {
26951
27110
  setDiffFile(file);
26952
27111
  try {
26953
27112
  const diffStr = await window.api.getFileDiff(file, staged);
26954
27113
  setDiffContent(diffStr || "No changes to display.");
26955
27114
  setShowDiff(true);
26956
- } catch (e) {
27115
+ } catch {
26957
27116
  showToast("Failed to get diff", "error");
26958
27117
  }
26959
27118
  };
@@ -27061,8 +27220,9 @@ Are you SURE you want to link "${repoName}" to this folder?`
27061
27220
  onDragLeave: handleDragLeave,
27062
27221
  onDrop: handleDrop,
27063
27222
  children: [
27064
- (showSettings ? draftTheme : theme) === "among-us-live" && /* @__PURE__ */ jsxRuntimeExports.jsx(AmongUsBackground, {}),
27065
- (showSettings ? draftTheme : theme) === "space-explorer-3d" && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceExplorerBackground, {}),
27223
+ liteMode && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-4 left-1/2 -translate-x-1/2 z-[200] bg-warning/20 border border-warning/50 text-warning px-4 py-1.5 rounded-full text-xs font-bold animate-pulse pointer-events-none tracking-widest shadow-lg shadow-warning/10", children: "⚡ LITE MODE ACTIVE" }),
27224
+ !liteMode && (showSettings ? draftTheme : theme) === "among-us-live" && /* @__PURE__ */ jsxRuntimeExports.jsx(AmongUsBackground, {}),
27225
+ !liteMode && (showSettings ? draftTheme : theme) === "space-explorer-3d" && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceExplorerBackground, {}),
27066
27226
  showWelcomeWizard && /* @__PURE__ */ jsxRuntimeExports.jsx(WelcomeWizard, { onComplete: () => setShowWelcomeWizard(false) }),
27067
27227
  gitErrorData && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/70 backdrop-blur-md flex items-center justify-center z-[150] p-6 animate-fade-in", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 border border-danger/50 rounded-2xl shadow-2xl w-full max-w-lg overflow-hidden flex flex-col p-6", children: [
27068
27228
  /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold text-danger mb-4", children: "Git Error" }),
@@ -27125,7 +27285,14 @@ Are you SURE you want to link "${repoName}" to this folder?`
27125
27285
  ] })
27126
27286
  ] }) }),
27127
27287
  isLocked && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute inset-0 z-[100] bg-canvas/95 backdrop-blur-2xl flex flex-col items-center justify-center transition-opacity duration-500 overflow-hidden", children: [
27128
- enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceScene, { fullScreen: true, onGameActiveChange: setIsGameActive }),
27288
+ !liteMode && enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(
27289
+ SpaceScene,
27290
+ {
27291
+ fullScreen: true,
27292
+ liteMode,
27293
+ onGameActiveChange: setIsGameActive
27294
+ }
27295
+ ),
27129
27296
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27130
27297
  "div",
27131
27298
  {
@@ -27207,214 +27374,412 @@ Are you SURE you want to link "${repoName}" to this folder?`
27207
27374
  ] }),
27208
27375
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-[-30%] left-[-20%] w-[60%] h-[60%] bg-accent/5 blur-[150px] rounded-full pointer-events-none transition-colors duration-300" }),
27209
27376
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute bottom-[-30%] right-[-20%] w-[60%] h-[60%] bg-brand/5 blur-[150px] rounded-full pointer-events-none transition-colors duration-300" }),
27210
- showSettings && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50 transition-opacity p-4 md:p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 backdrop-blur-xl rounded-2xl shadow-2xl border border-border w-full max-w-[900px] animate-float max-h-[95vh] flex flex-col overflow-hidden", children: [
27377
+ showSettings && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/80 backdrop-blur-md flex items-center justify-center z-50 transition-opacity p-4 md:p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/98 backdrop-blur-2xl rounded-2xl shadow-2xl border border-border w-full max-w-5xl h-[720px] max-h-[92vh] flex flex-col overflow-hidden animate-float", children: [
27211
27378
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27212
27379
  "div",
27213
27380
  {
27214
- className: "px-8 py-6 border-b border-border shrink-0 flex items-center gap-3",
27381
+ className: "px-8 py-5 border-b border-border shrink-0 flex items-center justify-between",
27215
27382
  style: { backgroundColor: "var(--color-surface)" },
27216
27383
  children: [
27384
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3.5", children: [
27385
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-brand/10 border border-brand/20 flex items-center justify-center text-brand", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: [
27386
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27387
+ "path",
27388
+ {
27389
+ strokeLinecap: "round",
27390
+ strokeLinejoin: "round",
27391
+ strokeWidth: 2,
27392
+ d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
27393
+ }
27394
+ ),
27395
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27396
+ "path",
27397
+ {
27398
+ strokeLinecap: "round",
27399
+ strokeLinejoin: "round",
27400
+ strokeWidth: 2,
27401
+ d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
27402
+ }
27403
+ )
27404
+ ] }) }),
27405
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27406
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-bold text-primary leading-tight", children: "Preferences & Settings" }),
27407
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Configure client environment, authentication tokens, and disk storage" })
27408
+ ] })
27409
+ ] }),
27410
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27411
+ "button",
27412
+ {
27413
+ type: "button",
27414
+ onClick: () => cancelSettings(),
27415
+ className: "w-8 h-8 rounded-lg text-secondary hover:text-primary hover:bg-surface-hover flex items-center justify-center transition-colors border border-transparent hover:border-border",
27416
+ title: "Close Preferences",
27417
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27418
+ "path",
27419
+ {
27420
+ strokeLinecap: "round",
27421
+ strokeLinejoin: "round",
27422
+ strokeWidth: 2,
27423
+ d: "M6 18L18 6M6 6l12 12"
27424
+ }
27425
+ ) })
27426
+ }
27427
+ )
27428
+ ]
27429
+ }
27430
+ ),
27431
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-1 min-h-0 overflow-hidden", children: [
27432
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-64 border-r border-border shrink-0 bg-canvas/20 p-4 flex flex-col justify-between", children: [
27433
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "space-y-2", children: [
27217
27434
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27218
- "svg",
27435
+ "button",
27219
27436
  {
27220
- className: "w-6 h-6 text-brand",
27221
- fill: "none",
27222
- stroke: "currentColor",
27223
- viewBox: "0 0 24 24",
27437
+ type: "button",
27438
+ onClick: () => setSettingsTab("appearance"),
27439
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "appearance" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27224
27440
  children: [
27225
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27226
- "path",
27441
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27442
+ "svg",
27227
27443
  {
27228
- strokeLinecap: "round",
27229
- strokeLinejoin: "round",
27230
- strokeWidth: 2,
27231
- d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
27444
+ className: "w-4 h-4 shrink-0",
27445
+ fill: "none",
27446
+ stroke: "currentColor",
27447
+ viewBox: "0 0 24 24",
27448
+ children: [
27449
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27450
+ "path",
27451
+ {
27452
+ strokeLinecap: "round",
27453
+ strokeLinejoin: "round",
27454
+ strokeWidth: 2,
27455
+ d: "M7 21a4 4 0 01-4-4 5 5 0 015-5c1.1 0 2.1.4 2.8 1.1L12 14l1.2-1.1c.7-.7 1.7-1.1 2.8-1.1a5 5 0 015 5 4 4 0 01-4 4H7z"
27456
+ }
27457
+ ),
27458
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27459
+ "path",
27460
+ {
27461
+ strokeLinecap: "round",
27462
+ strokeLinejoin: "round",
27463
+ strokeWidth: 2,
27464
+ d: "M12 3v11"
27465
+ }
27466
+ )
27467
+ ]
27232
27468
  }
27233
27469
  ),
27470
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27471
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Appearance" }),
27472
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27473
+ "div",
27474
+ {
27475
+ className: `text-[10px] font-normal ${settingsTab === "appearance" ? "text-white/80" : "text-secondary/70"}`,
27476
+ children: "Theme, UI, Language"
27477
+ }
27478
+ )
27479
+ ] })
27480
+ ]
27481
+ }
27482
+ ),
27483
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27484
+ "button",
27485
+ {
27486
+ type: "button",
27487
+ onClick: () => setSettingsTab("accounts"),
27488
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "accounts" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27489
+ children: [
27234
27490
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27235
- "path",
27491
+ "svg",
27236
27492
  {
27237
- strokeLinecap: "round",
27238
- strokeLinejoin: "round",
27239
- strokeWidth: 2,
27240
- d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
27493
+ className: "w-4 h-4 shrink-0",
27494
+ fill: "none",
27495
+ stroke: "currentColor",
27496
+ viewBox: "0 0 24 24",
27497
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27498
+ "path",
27499
+ {
27500
+ strokeLinecap: "round",
27501
+ strokeLinejoin: "round",
27502
+ strokeWidth: 2,
27503
+ d: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
27504
+ }
27505
+ )
27241
27506
  }
27242
- )
27507
+ ),
27508
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27509
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Accounts & Git" }),
27510
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27511
+ "div",
27512
+ {
27513
+ className: `text-[10px] font-normal ${settingsTab === "accounts" ? "text-white/80" : "text-secondary/70"}`,
27514
+ children: "GitHub profile & author"
27515
+ }
27516
+ )
27517
+ ] })
27243
27518
  ]
27244
27519
  }
27245
27520
  ),
27246
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-black text-primary m-0", children: t("settings") })
27247
- ]
27248
- }
27249
- ),
27250
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 md:p-8 bg-black/10", children: [
27251
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 mb-4", children: [
27252
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
27253
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27254
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary mb-4 flex items-center gap-2 uppercase tracking-wider", children: [
27255
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🎨" }),
27256
- " Preferences"
27257
- ] }),
27258
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
27259
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27260
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("language") }),
27521
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27522
+ "button",
27523
+ {
27524
+ type: "button",
27525
+ onClick: () => setSettingsTab("security"),
27526
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "security" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27527
+ children: [
27261
27528
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27262
- CustomDropdown,
27529
+ "svg",
27263
27530
  {
27264
- options: LANGUAGES.map((l) => ({ value: l.id, label: l.name })),
27265
- value: draftLang,
27266
- onChange: (val) => setDraftLang(val),
27267
- buttonClassName: "w-full bg-surface border border-border rounded-lg p-2.5 text-primary focus:outline-none focus:border-accent transition-all cursor-pointer font-medium text-sm"
27531
+ className: "w-4 h-4 shrink-0",
27532
+ fill: "none",
27533
+ stroke: "currentColor",
27534
+ viewBox: "0 0 24 24",
27535
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27536
+ "path",
27537
+ {
27538
+ strokeLinecap: "round",
27539
+ strokeLinejoin: "round",
27540
+ strokeWidth: 2,
27541
+ d: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
27542
+ }
27543
+ )
27268
27544
  }
27269
- )
27270
- ] }),
27271
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27272
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("theme") }),
27545
+ ),
27546
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27547
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Security & Privacy" }),
27548
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27549
+ "div",
27550
+ {
27551
+ className: `text-[10px] font-normal ${settingsTab === "security" ? "text-white/80" : "text-secondary/70"}`,
27552
+ children: "PIN, 2FA, zero telemetry"
27553
+ }
27554
+ )
27555
+ ] })
27556
+ ]
27557
+ }
27558
+ ),
27559
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27560
+ "button",
27561
+ {
27562
+ type: "button",
27563
+ onClick: () => setSettingsTab("maintenance"),
27564
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "maintenance" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27565
+ children: [
27273
27566
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27274
- CustomDropdown,
27567
+ "svg",
27275
27568
  {
27276
- options: THEMES.map((t2) => ({ value: t2.id, label: t2.name })),
27277
- value: draftTheme,
27278
- onChange: (val) => {
27279
- setDraftTheme(val);
27280
- document.documentElement.setAttribute("data-theme", val);
27281
- },
27282
- buttonClassName: "w-full bg-surface border border-border rounded-lg p-2.5 text-primary focus:outline-none focus:border-accent transition-all cursor-pointer font-medium text-sm"
27569
+ className: "w-4 h-4 shrink-0",
27570
+ fill: "none",
27571
+ stroke: "currentColor",
27572
+ viewBox: "0 0 24 24",
27573
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27574
+ "path",
27575
+ {
27576
+ strokeLinecap: "round",
27577
+ strokeLinejoin: "round",
27578
+ strokeWidth: 2,
27579
+ d: "M4 7v10c0 2 1.5 3 3.5 3h9c2 0 3.5-1 3.5-3V7M4 7c0-2 1.5-3 3.5-3h9c2 0 3.5 1 3.5 3M4 7h16m-5 4h.01M9 11h.01M12 15h.01"
27580
+ }
27581
+ )
27283
27582
  }
27284
- )
27583
+ ),
27584
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27585
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Maintenance" }),
27586
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27587
+ "div",
27588
+ {
27589
+ className: `text-[10px] font-normal ${settingsTab === "maintenance" ? "text-white/80" : "text-secondary/70"}`,
27590
+ children: "Disk cache & Git locks"
27591
+ }
27592
+ )
27593
+ ] })
27594
+ ]
27595
+ }
27596
+ ),
27597
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27598
+ "button",
27599
+ {
27600
+ type: "button",
27601
+ onClick: () => setSettingsTab("developer"),
27602
+ className: `w-full flex items-center gap-3.5 px-4 py-3 rounded-xl text-xs font-semibold transition-all ${settingsTab === "developer" ? "bg-brand text-white shadow-md shadow-brand/20" : "text-secondary hover:text-primary hover:bg-surface-hover"}`,
27603
+ children: [
27604
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27605
+ "svg",
27606
+ {
27607
+ className: "w-4 h-4 shrink-0",
27608
+ fill: "none",
27609
+ stroke: "currentColor",
27610
+ viewBox: "0 0 24 24",
27611
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27612
+ "path",
27613
+ {
27614
+ strokeLinecap: "round",
27615
+ strokeLinejoin: "round",
27616
+ strokeWidth: 2,
27617
+ d: "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"
27618
+ }
27619
+ )
27620
+ }
27621
+ ),
27622
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-left", children: [
27623
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-bold", children: "Tools & Advanced" }),
27624
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27625
+ "div",
27626
+ {
27627
+ className: `text-[10px] font-normal ${settingsTab === "developer" ? "text-white/80" : "text-secondary/70"}`,
27628
+ children: "Overrides & Maintenance"
27629
+ }
27630
+ )
27631
+ ] })
27632
+ ]
27633
+ }
27634
+ )
27635
+ ] }),
27636
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-3.5 bg-surface/60 border border-border/80 rounded-xl", children: [
27637
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [
27638
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-2 h-2 rounded-full bg-success animate-pulse" }),
27639
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] font-bold text-primary", children: "GitQuickPush Client" })
27640
+ ] }),
27641
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] text-secondary", children: "Local-First Engine • Production" })
27642
+ ] })
27643
+ ] }),
27644
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 p-8 md:p-10 overflow-y-auto custom-scrollbar bg-surface/30", children: [
27645
+ settingsTab === "appearance" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
27646
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27647
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Appearance & Environment" }),
27648
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Personalize your workspace palette, typography localization, and GPU rendering features." })
27649
+ ] }),
27650
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-4", children: [
27651
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27652
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27653
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: t("theme") }),
27654
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Select your primary color scheme and interface styling" })
27655
+ ] }),
27656
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-mono text-primary/80 bg-canvas px-3 py-1 rounded-md border border-border/60", children: draftTheme })
27657
+ ] }),
27658
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27659
+ CustomDropdown,
27660
+ {
27661
+ options: THEMES.map((themeItem) => ({
27662
+ value: themeItem.id,
27663
+ label: themeItem.name
27664
+ })),
27665
+ value: draftTheme,
27666
+ onChange: (val) => {
27667
+ setDraftTheme(val);
27668
+ document.documentElement.setAttribute("data-theme", val);
27669
+ },
27670
+ buttonClassName: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-primary focus:outline-none focus:border-brand transition-all cursor-pointer font-medium text-sm"
27671
+ }
27672
+ )
27673
+ ] }),
27674
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-4", children: [
27675
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27676
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27677
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: t("language") }),
27678
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Interface language and localized notification text" })
27679
+ ] }),
27680
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-mono text-primary/80 bg-canvas px-3 py-1 rounded-md border border-border/60", children: draftLang.toUpperCase() })
27681
+ ] }),
27682
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27683
+ CustomDropdown,
27684
+ {
27685
+ options: LANGUAGES.map((langItem) => ({
27686
+ value: langItem.id,
27687
+ label: langItem.name
27688
+ })),
27689
+ value: draftLang,
27690
+ onChange: (val) => setDraftLang(val),
27691
+ buttonClassName: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-primary focus:outline-none focus:border-brand transition-all cursor-pointer font-medium text-sm"
27692
+ }
27693
+ )
27694
+ ] }),
27695
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-6", children: [
27696
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-6", children: [
27697
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27698
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: "Lite Performance Mode" }),
27699
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed max-w-xl", children: "Disables background physics, heavy blur filters, and particle shaders to optimize battery life on low-power devices." })
27700
+ ] }),
27701
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27702
+ "button",
27703
+ {
27704
+ type: "button",
27705
+ onClick: () => setLiteMode(!liteMode),
27706
+ className: `relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${liteMode ? "bg-brand" : "bg-canvas border border-border"}`,
27707
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27708
+ "span",
27709
+ {
27710
+ className: `inline-block h-4 w-4 transform rounded-full transition-transform ${liteMode ? "translate-x-6 bg-white" : "translate-x-1 bg-secondary"}`
27711
+ }
27712
+ )
27713
+ }
27714
+ )
27715
+ ] }),
27716
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50" }),
27717
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between gap-6", children: [
27718
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27719
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("enableSpaceScene") }),
27720
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed max-w-xl", children: t("spaceSceneDesc") })
27721
+ ] }),
27722
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27723
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27724
+ "input",
27725
+ {
27726
+ className: "toggle",
27727
+ type: "checkbox",
27728
+ checked: draftLockscreenSpace,
27729
+ onChange: (e) => setDraftLockscreenSpace(e.target.checked)
27730
+ }
27731
+ ),
27732
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27733
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27285
27734
  ] })
27286
27735
  ] })
27736
+ ] })
27737
+ ] }),
27738
+ settingsTab === "accounts" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
27739
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27740
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Accounts & Git Identity" }),
27741
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Configure your authenticated GitHub sessions and local author signatures attached to git commits." })
27287
27742
  ] }),
27288
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27289
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary mb-4 flex items-center gap-2 uppercase tracking-wider", children: [
27290
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "👤" }),
27291
- " Git Profile"
27743
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-5", children: [
27744
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27745
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27746
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: "Git Author Signature (Local Config)" }),
27747
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Embedded into every commit header on your local workstation" })
27748
+ ] }),
27749
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] text-brand bg-brand/10 border border-brand/20 px-2.5 py-1 rounded-md font-medium", children: t("syncedFromGithub") })
27292
27750
  ] }),
27293
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
27751
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-5", children: [
27294
27752
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27295
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("gitUsername") }),
27753
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold", children: t("gitUsername") }),
27296
27754
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27297
27755
  "input",
27298
27756
  {
27299
27757
  type: "text",
27300
27758
  value: gitConfig.name,
27301
27759
  readOnly: true,
27302
- className: "w-full bg-surface border border-border rounded-lg p-2.5 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27760
+ className: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27303
27761
  }
27304
27762
  )
27305
27763
  ] }),
27306
27764
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27307
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold uppercase", children: t("gitEmail") }),
27765
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-secondary mb-1.5 text-xs font-semibold", children: t("gitEmail") }),
27308
27766
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27309
27767
  "input",
27310
27768
  {
27311
27769
  type: "email",
27312
27770
  value: gitConfig.email,
27313
27771
  readOnly: true,
27314
- className: "w-full bg-surface border border-border rounded-lg p-2.5 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27772
+ className: "w-full bg-canvas/70 border border-border rounded-xl p-3 text-secondary cursor-not-allowed focus:outline-none font-medium text-sm"
27315
27773
  }
27316
- ),
27317
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[10px] text-brand mt-1.5 font-medium", children: t("syncedFromGithub") })
27774
+ )
27318
27775
  ] })
27319
27776
  ] })
27320
- ] })
27321
- ] }),
27322
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6", children: [
27323
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27324
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary mb-4 flex items-center gap-2 uppercase tracking-wider", children: [
27325
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🛡️" }),
27326
- " Security & Features"
27327
- ] }),
27328
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-5", children: [
27329
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27330
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pr-4", children: [
27331
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("dailyMobileVerification") }),
27332
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1", children: t("dailyMobileDesc") })
27333
- ] }),
27334
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27335
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27336
- "input",
27337
- {
27338
- className: "toggle",
27339
- type: "checkbox",
27340
- checked: draftDailyAuth,
27341
- onChange: (e) => {
27342
- const next = e.target.checked;
27343
- setDraftDailyAuth(next);
27344
- }
27345
- }
27346
- ),
27347
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27348
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27349
- ] })
27350
- ] }),
27351
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border/50 pt-5 flex items-center justify-between", children: [
27352
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pr-4", children: [
27353
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("enableSpaceScene") }),
27354
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1", children: t("spaceSceneDesc") })
27355
- ] }),
27356
- /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27357
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27358
- "input",
27359
- {
27360
- className: "toggle",
27361
- type: "checkbox",
27362
- checked: draftLockscreenSpace,
27363
- onChange: (e) => {
27364
- const next = e.target.checked;
27365
- setDraftLockscreenSpace(next);
27366
- }
27367
- }
27368
- ),
27369
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27370
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27371
- ] })
27372
- ] }),
27373
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50 pt-5", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
27374
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27375
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("changeLockscreenPin") }),
27376
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1", children: t("changePinDesc") })
27377
- ] }),
27378
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
27379
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27380
- "input",
27381
- {
27382
- type: "password",
27383
- maxLength: 3,
27384
- value: newPin,
27385
- onChange: (e) => setNewPin(e.target.value),
27386
- placeholder: "***",
27387
- className: "bg-surface border border-border rounded-lg px-3 py-2 text-sm text-primary w-24 outline-none focus:border-accent text-center tracking-widest font-black"
27388
- }
27389
- ),
27390
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27391
- "button",
27392
- {
27393
- type: "button",
27394
- onClick: () => {
27395
- if (newPin.length === 3) {
27396
- localStorage.setItem("gitelectron-pin", newPin);
27397
- setStoredPin(newPin);
27398
- setPinChangeSuccess(true);
27399
- setTimeout(() => setPinChangeSuccess(false), 2e3);
27400
- setNewPin("");
27401
- }
27402
- },
27403
- disabled: newPin.length !== 3,
27404
- className: "px-4 py-2 bg-accent text-canvas text-xs font-black rounded-lg hover:bg-accent/90 transition-colors disabled:opacity-50 uppercase",
27405
- children: pinChangeSuccess ? t("saved") : t("savePin")
27406
- }
27407
- )
27408
- ] })
27409
- ] }) })
27410
- ] })
27411
27777
  ] }),
27412
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/40 p-5 rounded-xl border border-border/50", children: [
27413
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-4", children: [
27414
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-bold text-primary flex items-center gap-2 uppercase tracking-wider", children: [
27415
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "👥" }),
27416
- " ",
27417
- t("githubAccounts")
27778
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm space-y-5", children: [
27779
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
27780
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27781
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-secondary", children: t("githubAccounts") }),
27782
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Linked profiles authorized for repository pushing and collaboration" })
27418
27783
  ] }),
27419
27784
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27420
27785
  "button",
@@ -27424,41 +27789,64 @@ Are you SURE you want to link "${repoName}" to this folder?`
27424
27789
  cancelSettings();
27425
27790
  handleStartAuth();
27426
27791
  },
27427
- className: "px-3 py-1.5 bg-brand text-white hover:bg-brand text-white text-brand text-xs font-bold rounded-lg border border-brand/20 transition-colors",
27792
+ className: "px-4 py-2 bg-brand hover:bg-brand-hover text-white text-xs font-bold rounded-xl transition-colors flex items-center gap-2 shadow-sm",
27428
27793
  children: [
27429
- "+ ",
27794
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27795
+ "svg",
27796
+ {
27797
+ className: "w-3.5 h-3.5",
27798
+ fill: "none",
27799
+ stroke: "currentColor",
27800
+ viewBox: "0 0 24 24",
27801
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27802
+ "path",
27803
+ {
27804
+ strokeLinecap: "round",
27805
+ strokeLinejoin: "round",
27806
+ strokeWidth: 2,
27807
+ d: "M12 4v16m8-8H4"
27808
+ }
27809
+ )
27810
+ }
27811
+ ),
27430
27812
  t("addAccount")
27431
27813
  ]
27432
27814
  }
27433
27815
  )
27434
27816
  ] }),
27435
- accounts.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center p-6 border border-dashed border-border/50 rounded-xl bg-surface/30", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium text-secondary", children: t("noAccountsLinked") }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2 max-h-40 overflow-y-auto pr-1 custom-scrollbar mb-4", children: accounts.map((acc) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
27817
+ accounts.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center p-10 border border-dashed border-border rounded-2xl bg-canvas/30 space-y-2", children: [
27818
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("noAccountsLinked") }),
27819
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary max-w-sm mx-auto", children: "Link your GitHub account via OAuth to enable one-click pushes and pull requests." })
27820
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3", children: accounts.map((acc) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
27436
27821
  "div",
27437
27822
  {
27438
- className: "flex items-center justify-between p-3 border border-border/80 rounded-xl bg-surface hover:border-brand/50 transition-colors",
27823
+ className: "flex items-center justify-between p-4 border border-border rounded-xl bg-canvas/40 hover:border-brand/40 transition-colors",
27439
27824
  children: [
27440
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
27825
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3.5", children: [
27441
27826
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27442
27827
  "img",
27443
27828
  {
27444
27829
  src: acc.avatar_url || `https://github.com/${acc.username}.png`,
27445
27830
  alt: acc.username,
27446
- className: "w-8 h-8 rounded-full object-cover border-2 border-border"
27831
+ className: "w-10 h-10 rounded-full object-cover border border-border"
27447
27832
  }
27448
27833
  ),
27449
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm font-bold text-primary", children: [
27450
- "@",
27451
- acc.username
27834
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27835
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm font-bold text-primary block", children: [
27836
+ "@",
27837
+ acc.username
27838
+ ] }),
27839
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary", children: "GitHub Enterprise / Cloud" })
27452
27840
  ] })
27453
27841
  ] }),
27454
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
27455
- activeAccountId === acc.id && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] uppercase font-black text-success bg-success/10 px-2 py-1 rounded-md border border-success/20", children: "Active" }),
27842
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
27843
+ activeAccountId === acc.id && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] uppercase font-bold text-success bg-success/10 px-2.5 py-1 rounded-md border border-success/20", children: "Active Session" }),
27456
27844
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27457
27845
  "button",
27458
27846
  {
27459
27847
  type: "button",
27460
27848
  onClick: () => window.api.openExternal(`https://github.com/${acc.username}`),
27461
- className: "px-2.5 py-1 border border-border hover:border-brand hover:text-brand text-secondary text-[10px] uppercase font-bold rounded-md transition-all",
27849
+ className: "px-3 py-1.5 border border-border hover:border-brand hover:text-brand text-secondary text-xs font-semibold rounded-lg transition-all",
27462
27850
  children: "Profile"
27463
27851
  }
27464
27852
  )
@@ -27467,7 +27855,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27467
27855
  },
27468
27856
  acc.id
27469
27857
  )) }),
27470
- authStatus.status === "Verified" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50 pt-4 mt-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
27858
+ authStatus.status === "Verified" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50 pt-5 mt-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
27471
27859
  "button",
27472
27860
  {
27473
27861
  type: "button",
@@ -27485,7 +27873,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27485
27873
  showToast("Logout failed", "error");
27486
27874
  }
27487
27875
  },
27488
- className: "w-full py-2.5 bg-danger/10 hover:bg-danger/20 text-danger text-sm font-bold rounded-lg border border-danger/30 hover:border-danger/50 transition-all flex items-center justify-center gap-2",
27876
+ className: "w-full py-3 bg-danger/10 hover:bg-danger/20 text-danger text-xs font-bold rounded-xl border border-danger/30 hover:border-danger/50 transition-all flex items-center justify-center gap-2",
27489
27877
  children: [
27490
27878
  /* @__PURE__ */ jsxRuntimeExports.jsx(
27491
27879
  "svg",
@@ -27510,74 +27898,324 @@ Are you SURE you want to link "${repoName}" to this folder?`
27510
27898
  }
27511
27899
  ) })
27512
27900
  ] })
27513
- ] })
27514
- ] }),
27515
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-danger/10 p-5 rounded-xl border border-danger/30 mb-8 mt-2", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4", children: [
27516
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27517
- /* @__PURE__ */ jsxRuntimeExports.jsxs("h3", { className: "text-sm font-black text-danger flex items-center gap-2 uppercase tracking-wider mb-1", children: [
27518
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "⚠️" }),
27519
- " Emergency Override (Master Push)"
27520
- ] }),
27521
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-medium text-danger/80 leading-relaxed max-w-2xl", children: "Bypass all protections, ignore unpushed changes or missing files, and FORCE push all current files. Warning: This completely overwrites remote history." })
27522
27901
  ] }),
27523
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
27524
- "button",
27525
- {
27526
- type: "button",
27527
- onClick: async () => {
27528
- const confirmAction = window.confirm(
27529
- "Are you sure? This will force push all current files, overriding remote history and bypassing all safety checks."
27530
- );
27531
- if (!confirmAction) return;
27532
- try {
27533
- const remotes = await window.api.getRemotes();
27534
- if (!remotes || remotes.length === 0) {
27535
- showToast("No remote configured to push to.", "error");
27536
- return;
27902
+ settingsTab === "security" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
27903
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27904
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Security & Access Controls" }),
27905
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Configure local cryptographic vaults, client PIN protection, and review institutional trust policies." })
27906
+ ] }),
27907
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex items-center justify-between gap-6", children: [
27908
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
27909
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("dailyMobileVerification") }),
27910
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: t("dailyMobileDesc") })
27911
+ ] }),
27912
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "switch shrink-0", children: [
27913
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27914
+ "input",
27915
+ {
27916
+ className: "toggle",
27917
+ type: "checkbox",
27918
+ checked: draftDailyAuth,
27919
+ onChange: (e) => setDraftDailyAuth(e.target.checked)
27537
27920
  }
27538
- showToast("Executing Master Push override...", "info");
27539
- await window.api.masterPush(remotes[0].name, status?.current || "main");
27540
- showToast("Master Push successful!", "success");
27541
- refreshRepoState();
27542
- cancelSettings();
27543
- } catch (err) {
27544
- showToast(
27545
- "Master Push failed: " + (err.message || "Unknown error"),
27546
- "error"
27547
- );
27921
+ ),
27922
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "slider" }),
27923
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "card-side" })
27924
+ ] })
27925
+ ] }),
27926
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
27927
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
27928
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary", children: t("changeLockscreenPin") }),
27929
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: t("changePinDesc") })
27930
+ ] }),
27931
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 shrink-0", children: [
27932
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27933
+ "input",
27934
+ {
27935
+ type: "password",
27936
+ maxLength: 3,
27937
+ value: newPin,
27938
+ onChange: (e) => setNewPin(e.target.value),
27939
+ placeholder: "***",
27940
+ className: "bg-canvas/70 border border-border rounded-xl px-3.5 py-2.5 text-sm text-primary w-24 outline-none focus:border-brand text-center tracking-widest font-mono font-bold"
27941
+ }
27942
+ ),
27943
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27944
+ "button",
27945
+ {
27946
+ type: "button",
27947
+ onClick: () => {
27948
+ if (newPin.length === 3) {
27949
+ localStorage.setItem("gitelectron-pin", newPin);
27950
+ setStoredPin(newPin);
27951
+ setPinChangeSuccess(true);
27952
+ setTimeout(() => setPinChangeSuccess(false), 2e3);
27953
+ setNewPin("");
27954
+ }
27955
+ },
27956
+ disabled: newPin.length !== 3,
27957
+ className: "px-5 py-2.5 bg-brand hover:bg-brand-hover text-white text-xs font-bold rounded-xl transition-colors disabled:opacity-40 uppercase",
27958
+ children: pinChangeSuccess ? t("saved") : t("savePin")
27959
+ }
27960
+ )
27961
+ ] })
27962
+ ] }),
27963
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
27964
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
27965
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1.5", children: [
27966
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27967
+ "svg",
27968
+ {
27969
+ className: "w-4 h-4 text-emerald-400",
27970
+ fill: "none",
27971
+ stroke: "currentColor",
27972
+ viewBox: "0 0 24 24",
27973
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27974
+ "path",
27975
+ {
27976
+ strokeLinecap: "round",
27977
+ strokeLinejoin: "round",
27978
+ strokeWidth: 2,
27979
+ d: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
27980
+ }
27981
+ )
27982
+ }
27983
+ ),
27984
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-primary", children: "Enterprise Privacy & Local Security Protocol" })
27985
+ ] }),
27986
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Strict local-first architecture: zero telemetry tracking, no external code logging, and hardware-sealed credentials via native OS keystores (Windows DPAPI / macOS Keychain)." })
27987
+ ] }),
27988
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27989
+ "button",
27990
+ {
27991
+ type: "button",
27992
+ onClick: () => setShowPrivacyModal(true),
27993
+ className: "shrink-0 px-5 py-2.5 bg-canvas hover:bg-surface-hover border border-border text-primary text-xs font-bold rounded-xl transition-all flex items-center gap-2",
27994
+ children: [
27995
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
27996
+ "svg",
27997
+ {
27998
+ className: "w-4 h-4 text-brand",
27999
+ fill: "none",
28000
+ stroke: "currentColor",
28001
+ viewBox: "0 0 24 24",
28002
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28003
+ "path",
28004
+ {
28005
+ strokeLinecap: "round",
28006
+ strokeLinejoin: "round",
28007
+ strokeWidth: 2,
28008
+ d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"
28009
+ }
28010
+ )
28011
+ }
28012
+ ),
28013
+ "View Trust Policy"
28014
+ ]
27548
28015
  }
27549
- },
27550
- className: "shrink-0 px-6 py-3 bg-danger text-white text-xs font-black uppercase tracking-wider rounded-xl hover:bg-danger/80 border-b-4 border-black/30 active:border-b-0 active:translate-y-1 transition-all flex items-center justify-center gap-2",
27551
- children: [
27552
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🚀" }),
27553
- " FORCE PUSH"
27554
- ]
27555
- }
27556
- )
27557
- ] }) })
28016
+ )
28017
+ ] })
28018
+ ] }),
28019
+ settingsTab === "maintenance" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
28020
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
28021
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Storage & Maintenance" }),
28022
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Purge application disk caches, remove stale Git lock files, and repair workspace states." })
28023
+ ] }),
28024
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
28025
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
28026
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary mb-1", children: "Application Cache & Storage" }),
28027
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Purges web cache buffers, network images, and offline queue snapshots. Authenticated sessions and repository settings remain completely intact." })
28028
+ ] }),
28029
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
28030
+ "button",
28031
+ {
28032
+ type: "button",
28033
+ disabled: isClearingCache,
28034
+ onClick: async () => {
28035
+ setIsClearingCache(true);
28036
+ try {
28037
+ const res = await window.api.clearAppCache();
28038
+ if (res.success) {
28039
+ localStorage.removeItem("gitquickpush-offline-queue");
28040
+ showToast("Application cache cleared successfully!", "success");
28041
+ } else {
28042
+ showToast("Cache clear failed: " + res.error, "error");
28043
+ }
28044
+ } catch (err) {
28045
+ showToast("Cache clear failed: " + err.message, "error");
28046
+ } finally {
28047
+ setIsClearingCache(false);
28048
+ }
28049
+ },
28050
+ className: "shrink-0 px-5 py-2.5 bg-canvas hover:bg-surface-hover border border-border text-primary text-xs font-bold rounded-xl transition-all flex items-center gap-2.5 disabled:opacity-50",
28051
+ children: [
28052
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28053
+ "svg",
28054
+ {
28055
+ className: `w-4 h-4 ${isClearingCache ? "animate-spin text-brand" : "text-secondary"}`,
28056
+ fill: "none",
28057
+ stroke: "currentColor",
28058
+ viewBox: "0 0 24 24",
28059
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28060
+ "path",
28061
+ {
28062
+ strokeLinecap: "round",
28063
+ strokeLinejoin: "round",
28064
+ strokeWidth: 2,
28065
+ d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
28066
+ }
28067
+ )
28068
+ }
28069
+ ),
28070
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: isClearingCache ? "Purging Cache..." : "Clear Cache" })
28071
+ ]
28072
+ }
28073
+ )
28074
+ ] }),
28075
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/80 border border-border/80 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
28076
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
28077
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary mb-1", children: "Stale Git Index Lock Release" }),
28078
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-secondary leading-relaxed", children: [
28079
+ "If an interrupted commit or system reboot leaves behind a stuck",
28080
+ " ",
28081
+ /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className: "text-xs font-mono bg-canvas px-1.5 py-0.5 rounded text-primary", children: ".git/index.lock" }),
28082
+ ", clicking this safely clears it to restore repository access."
28083
+ ] })
28084
+ ] }),
28085
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
28086
+ "button",
28087
+ {
28088
+ type: "button",
28089
+ onClick: async () => {
28090
+ try {
28091
+ const success = await window.api.removeGitLock();
28092
+ if (success) {
28093
+ showToast("Git lock released successfully", "success");
28094
+ } else {
28095
+ showToast("No active lock file found", "info");
28096
+ }
28097
+ } catch (err) {
28098
+ showToast("Failed to release lock: " + err.message, "error");
28099
+ }
28100
+ },
28101
+ className: "shrink-0 px-5 py-2.5 bg-canvas hover:bg-surface-hover border border-border text-primary text-xs font-bold rounded-xl transition-all flex items-center gap-2.5",
28102
+ children: [
28103
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28104
+ "svg",
28105
+ {
28106
+ className: "w-4 h-4 text-warning",
28107
+ fill: "none",
28108
+ stroke: "currentColor",
28109
+ viewBox: "0 0 24 24",
28110
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28111
+ "path",
28112
+ {
28113
+ strokeLinecap: "round",
28114
+ strokeLinejoin: "round",
28115
+ strokeWidth: 2,
28116
+ d: "M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"
28117
+ }
28118
+ )
28119
+ }
28120
+ ),
28121
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Release Git Lock" })
28122
+ ]
28123
+ }
28124
+ )
28125
+ ] })
28126
+ ] }),
28127
+ settingsTab === "developer" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-7", children: [
28128
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
28129
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-primary", children: "Tools & Advanced Overrides" }),
28130
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-1 leading-relaxed", children: "Developer utilities, diagnostics, and emergency push overrides." })
28131
+ ] }),
28132
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-danger/5 border border-danger/30 rounded-2xl p-6 shadow-sm flex flex-col sm:flex-row sm:items-center justify-between gap-6", children: [
28133
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-xl", children: [
28134
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1.5", children: [
28135
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28136
+ "svg",
28137
+ {
28138
+ className: "w-4 h-4 text-danger",
28139
+ fill: "none",
28140
+ stroke: "currentColor",
28141
+ viewBox: "0 0 24 24",
28142
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28143
+ "path",
28144
+ {
28145
+ strokeLinecap: "round",
28146
+ strokeLinejoin: "round",
28147
+ strokeWidth: 2,
28148
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
28149
+ }
28150
+ )
28151
+ }
28152
+ ),
28153
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-xs font-bold uppercase tracking-wider text-danger", children: "Emergency Master Push Override" })
28154
+ ] }),
28155
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Bypasses remote divergence safety checks and forces the remote branch to match your current local tree. Overwrites remote history. Use only when resolving critical sync lockups." })
28156
+ ] }),
28157
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28158
+ "button",
28159
+ {
28160
+ type: "button",
28161
+ onClick: async () => {
28162
+ const confirmAction = window.confirm(
28163
+ "Are you sure? This will force push all current files, overriding remote history and bypassing all safety checks."
28164
+ );
28165
+ if (!confirmAction) return;
28166
+ try {
28167
+ const remotes = await window.api.getRemotes();
28168
+ if (!remotes || remotes.length === 0) {
28169
+ showToast("No remote configured to push to.", "error");
28170
+ return;
28171
+ }
28172
+ showToast("Executing Master Push override...", "info");
28173
+ await window.api.masterPush(remotes[0].name, status?.current || "main");
28174
+ showToast("Master Push successful!", "success");
28175
+ refreshRepoState();
28176
+ cancelSettings();
28177
+ } catch (err) {
28178
+ showToast(
28179
+ "Master Push failed: " + (err.message || "Unknown error"),
28180
+ "error"
28181
+ );
28182
+ }
28183
+ },
28184
+ className: "shrink-0 px-5 py-2.5 bg-danger hover:bg-danger/80 text-white text-xs font-bold rounded-xl transition-all shadow-sm",
28185
+ children: "Execute Force Push"
28186
+ }
28187
+ )
28188
+ ] })
28189
+ ] })
28190
+ ] })
27558
28191
  ] }),
27559
28192
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27560
28193
  "div",
27561
28194
  {
27562
- className: "px-8 py-5 border-t border-border shrink-0 flex justify-end gap-3",
28195
+ className: "px-8 py-4.5 border-t border-border shrink-0 flex items-center justify-between",
27563
28196
  style: { backgroundColor: "var(--color-surface)" },
27564
28197
  children: [
27565
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27566
- "button",
27567
- {
27568
- onClick: () => cancelSettings(),
27569
- className: "px-6 py-2.5 bg-surface border-2 border-border hover:bg-surface-hover rounded-xl transition-all font-bold text-sm",
27570
- children: t("cancel")
27571
- }
27572
- ),
27573
- /* @__PURE__ */ jsxRuntimeExports.jsx(
27574
- "button",
27575
- {
27576
- onClick: saveSettings,
27577
- className: "px-8 py-2.5 bg-brand hover:bg-brand-hover text-white rounded-xl transition-all font-black text-sm shadow-lg shadow-brand/20 border-b-4 border-black/20 active:border-b-0 active:translate-y-1",
27578
- children: t("save")
27579
- }
27580
- )
28198
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-secondary hidden sm:block", children: "Preferences are saved locally in your secure client profile." }),
28199
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 ml-auto", children: [
28200
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28201
+ "button",
28202
+ {
28203
+ type: "button",
28204
+ onClick: () => cancelSettings(),
28205
+ className: "px-5 py-2.5 bg-canvas border border-border hover:bg-surface-hover text-secondary hover:text-primary rounded-xl transition-all font-semibold text-xs",
28206
+ children: t("cancel")
28207
+ }
28208
+ ),
28209
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28210
+ "button",
28211
+ {
28212
+ type: "button",
28213
+ onClick: saveSettings,
28214
+ className: "px-7 py-2.5 bg-brand hover:bg-brand-hover text-white rounded-xl transition-all font-bold text-xs shadow-md shadow-brand/20 active:translate-y-0.5",
28215
+ children: t("save")
28216
+ }
28217
+ )
28218
+ ] })
27581
28219
  ]
27582
28220
  }
27583
28221
  )
@@ -27728,21 +28366,21 @@ Are you SURE you want to link "${repoName}" to this folder?`
27728
28366
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "mx-2", children: "•" }),
27729
28367
  new Date(commit.date).toLocaleString()
27730
28368
  ] }),
27731
- commit.diff && commit.diff.files && commit.diff.files.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
28369
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
27732
28370
  "button",
27733
28371
  {
27734
28372
  onClick: () => toggleCommit(commit.hash),
27735
- className: "text-[10px] font-medium text-accent hover:text-primary transition-colors flex items-center gap-1.5 bg-accent/5 hover:bg-accent/10 px-2 py-1 rounded-md border border-accent/20",
28373
+ className: "text-[10px] font-medium text-accent hover:text-primary transition-colors flex items-center gap-1.5 bg-accent/5 hover:bg-accent/10 px-2 py-1 rounded-md border border-accent/20 cursor-pointer select-none active:scale-95",
28374
+ title: expandedCommits[commit.hash] ? "Hide commit details" : "View commit details",
27736
28375
  children: [
27737
28376
  expandedCommits[commit.hash] ? "Hide" : "View",
27738
28377
  " ",
27739
- commit.diff.changed,
27740
- " files",
27741
- commit.diff.insertions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-success", children: [
28378
+ commit.diff?.files && commit.diff.files.length > 0 ? `${commit.diff.changed || commit.diff.files.length} ${(commit.diff.changed || commit.diff.files.length) === 1 ? "file" : "files"}` : "details",
28379
+ commit.diff?.insertions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-success", children: [
27742
28380
  commit.diff.insertions,
27743
28381
  " ++"
27744
28382
  ] }),
27745
- commit.diff.deletions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-danger", children: [
28383
+ commit.diff?.deletions > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-danger", children: [
27746
28384
  commit.diff.deletions,
27747
28385
  " --"
27748
28386
  ] })
@@ -27750,7 +28388,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
27750
28388
  }
27751
28389
  )
27752
28390
  ] }),
27753
- expandedCommits[commit.hash] && commit.diff && commit.diff.files && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 flex justify-center pb-8 border-t border-border/40 pt-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28391
+ expandedCommits[commit.hash] && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-4 flex justify-center pb-8 border-t border-border/40 pt-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
27754
28392
  CommitReceiptPrinter,
27755
28393
  {
27756
28394
  commit,
@@ -27763,7 +28401,14 @@ Are you SURE you want to link "${repoName}" to this folder?`
27763
28401
  )) })
27764
28402
  ] }) }),
27765
28403
  showAuthModal && deviceFlowData && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-[60] p-6 transition-opacity", children: [
27766
- enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(SpaceScene, { fullScreen: true, onGameActiveChange: setIsGameActive }),
28404
+ !liteMode && enableLockscreenSpace && /* @__PURE__ */ jsxRuntimeExports.jsx(
28405
+ SpaceScene,
28406
+ {
28407
+ fullScreen: true,
28408
+ liteMode,
28409
+ onGameActiveChange: setIsGameActive
28410
+ }
28411
+ ),
27767
28412
  /* @__PURE__ */ jsxRuntimeExports.jsxs(
27768
28413
  "div",
27769
28414
  {
@@ -28109,6 +28754,26 @@ Are you SURE you want to link "${repoName}" to this folder?`
28109
28754
  '"'
28110
28755
  ] })
28111
28756
  ] }),
28757
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-3.5 bg-surface/80 rounded-lg border border-border/80 text-xs space-y-2 mt-2", children: [
28758
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between text-secondary", children: [
28759
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-semibold text-primary flex items-center gap-1.5", children: [
28760
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "🛡️" }),
28761
+ " Security & Verification"
28762
+ ] }),
28763
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-accent bg-accent/10 px-2 py-0.5 rounded text-[11px] font-semibold", children: authStatus.username ? `@${authStatus.username}` : "Local Author" })
28764
+ ] }),
28765
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-3 text-secondary text-[11px] gap-1 pt-0.5", children: [
28766
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Authentication:" }),
28767
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "col-span-2 font-mono text-primary truncate", children: authStatus.authMethod || "GitHub OAuth (Verified)" }),
28768
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "AI Assistance:" }),
28769
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "col-span-2 text-primary font-medium flex items-center gap-1.5", children: [
28770
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse" }),
28771
+ authStatus.aiProvider || "GitHub Models (gpt-4o-mini)"
28772
+ ] }),
28773
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Session Privacy:" }),
28774
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "col-span-2 text-secondary opacity-90", children: authStatus.securityStatus || "End-to-End Encrypted Session" })
28775
+ ] })
28776
+ ] }),
28112
28777
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 flex items-center gap-2", children: [
28113
28778
  /* @__PURE__ */ jsxRuntimeExports.jsx(
28114
28779
  "input",
@@ -28144,7 +28809,7 @@ Are you SURE you want to link "${repoName}" to this folder?`
28144
28809
  )
28145
28810
  ] })
28146
28811
  ] }) }),
28147
- pushSuccessData && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 backdrop-blur-xl p-8 rounded-xl shadow-2xl border border-border w-full max-w-[450px] mx-4 animate-float text-center", children: [
28812
+ pushSuccessData && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 backdrop-blur-xl p-8 rounded-xl shadow-2xl border border-border w-full max-w-[480px] mx-4 animate-float text-center", children: [
28148
28813
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto w-12 h-12 bg-success/20 rounded-full flex items-center justify-center text-success mb-4 border border-success/30", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28149
28814
  "path",
28150
28815
  {
@@ -28154,8 +28819,8 @@ Are you SURE you want to link "${repoName}" to this folder?`
28154
28819
  d: "M5 13l4 4L19 7"
28155
28820
  }
28156
28821
  ) }) }),
28157
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold mb-4 text-primary", children: "Push Successful" }),
28158
- /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-secondary mb-6 text-sm leading-relaxed", children: [
28822
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold mb-3 text-primary", children: "Push Successful" }),
28823
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-secondary mb-4 text-sm leading-relaxed", children: [
28159
28824
  "Successfully pushed",
28160
28825
  " ",
28161
28826
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-primary font-medium", children: pushSuccessData.files }),
@@ -28167,69 +28832,268 @@ Are you SURE you want to link "${repoName}" to this folder?`
28167
28832
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-primary", children: pushSuccessData.repository }),
28168
28833
  "."
28169
28834
  ] }),
28835
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-canvas/90 p-4 rounded-xl border border-border text-xs text-left mb-6 space-y-2", children: [
28836
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary border-b border-border/60 pb-1.5", children: [
28837
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] font-medium", children: "Timestamp:" }),
28838
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-primary font-bold text-[11px]", children: pushSuccessData.timestamp || (/* @__PURE__ */ new Date()).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }) })
28839
+ ] }),
28840
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary", children: [
28841
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "Pushed By:" }),
28842
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-accent font-semibold text-[11px]", children: pushSuccessData.author || (authStatus.username ? `@${authStatus.username}` : "Git Author") })
28843
+ ] }),
28844
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary", children: [
28845
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "Verification:" }),
28846
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-emerald-400 font-semibold text-[11px]", children: pushSuccessData.authMethod || "GitHub OAuth (Verified ✓)" })
28847
+ ] }),
28848
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary", children: [
28849
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "AI Engine:" }),
28850
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-primary font-medium text-[11px] flex items-center gap-1.5", children: [
28851
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-emerald-400" }),
28852
+ pushSuccessData.aiProvider || "GitHub Models"
28853
+ ] })
28854
+ ] }),
28855
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-secondary border-t border-border/60 pt-1.5", children: [
28856
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px]", children: "Status:" }),
28857
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-emerald-400 font-bold text-[11px]", children: "Remote Up to Date" })
28858
+ ] })
28859
+ ] }),
28170
28860
  /* @__PURE__ */ jsxRuntimeExports.jsx(
28171
28861
  "button",
28172
28862
  {
28173
28863
  onClick: () => setPushSuccessData(null),
28174
- className: "w-full py-2 bg-surface-hover border border-border text-primary rounded-md font-semibold transition-colors text-sm",
28864
+ className: "w-full py-2.5 bg-brand hover:bg-brand-hover text-white rounded-md font-semibold transition-colors text-sm shadow-md",
28175
28865
  children: "Done"
28176
28866
  }
28177
- )
28178
- ] }) }),
28179
- pushFailureData && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/95 backdrop-blur-xl p-8 rounded-xl shadow-2xl border border-danger/50 w-full max-w-[500px] mx-4 animate-float", children: [
28180
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 mb-4 text-danger", children: [
28181
- /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28182
- "path",
28183
- {
28184
- strokeLinecap: "round",
28185
- strokeLinejoin: "round",
28186
- strokeWidth: 2,
28187
- d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
28188
- }
28189
- ) }),
28190
- /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold", children: "Push Rejected" })
28191
- ] }),
28192
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-5 bg-canvas border border-border p-4 rounded-md", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-primary text-sm", children: pushFailureData.reason }) }),
28193
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-secondary mb-6 text-sm", children: "Recommendation: You can pull the latest changes from the remote to reconcile your local branch, or you can use the AI Auto-Healer to analyze and fix the issue automatically." }),
28194
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-3", children: [
28195
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28196
- "button",
28197
- {
28198
- onClick: () => {
28199
- const data = pushFailureData;
28200
- setPushFailureData(null);
28201
- autonomousHealAndPush(
28202
- data.reason,
28203
- data.operation || "push",
28204
- data.overrideRepoPath,
28205
- data.overrideBranch
28206
- );
28207
- },
28208
- className: "flex-1 py-2 bg-brand hover:bg-brand-hover border border-white/10 text-white rounded-md font-semibold transition-all text-sm flex items-center justify-center gap-2",
28209
- children: "✨ Fix with AI"
28210
- }
28211
- ),
28212
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28213
- "button",
28214
- {
28215
- onClick: () => {
28216
- setPushFailureData(null);
28217
- handlePull();
28218
- },
28219
- className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-sm",
28220
- children: "Pull Changes"
28221
- }
28222
- ),
28223
- /* @__PURE__ */ jsxRuntimeExports.jsx(
28224
- "button",
28225
- {
28226
- onClick: () => setPushFailureData(null),
28227
- className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-colors text-sm",
28228
- children: "Cancel"
28229
- }
28230
- )
28231
- ] })
28232
- ] }) }),
28867
+ )
28868
+ ] }) }),
28869
+ pushFailureData && (() => {
28870
+ const isConflict = Boolean(
28871
+ pushFailureData.reason && (pushFailureData.reason.includes("unmerged files") || pushFailureData.reason.includes("unresolved conflict") || pushFailureData.reason.includes("merge conflict") || pushFailureData.reason.includes("Automatic merge failed") || pushFailureData.reason.includes("you have unmerged paths") || pushFailureData.reason.includes("CONFLICT ("))
28872
+ );
28873
+ const isPull = pushFailureData.operation === "pull" || pushFailureData.reason?.includes("pull-from-remote");
28874
+ const cleanedReason = formatErrorMessage(pushFailureData.reason);
28875
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50 p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
28876
+ "div",
28877
+ {
28878
+ className: `bg-surface/95 backdrop-blur-xl p-6 sm:p-8 rounded-xl shadow-2xl border ${isConflict ? "border-amber-500/50" : "border-danger/50"} w-full max-w-[520px] animate-float`,
28879
+ children: [
28880
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
28881
+ "div",
28882
+ {
28883
+ className: `flex items-center gap-3 mb-4 ${isConflict ? "text-amber-500" : "text-danger"}`,
28884
+ children: [
28885
+ isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
28886
+ "svg",
28887
+ {
28888
+ className: "w-6 h-6 flex-shrink-0",
28889
+ viewBox: "0 0 24 24",
28890
+ fill: "none",
28891
+ stroke: "currentColor",
28892
+ strokeWidth: "2",
28893
+ strokeLinecap: "round",
28894
+ strokeLinejoin: "round",
28895
+ children: [
28896
+ /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "18", cy: "18", r: "3" }),
28897
+ /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "6", cy: "6", r: "3" }),
28898
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M6 9v12" }),
28899
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M18 9a9 9 0 0 0-9 9" })
28900
+ ]
28901
+ }
28902
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
28903
+ "svg",
28904
+ {
28905
+ className: "w-6 h-6 flex-shrink-0",
28906
+ fill: "none",
28907
+ stroke: "currentColor",
28908
+ viewBox: "0 0 24 24",
28909
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
28910
+ "path",
28911
+ {
28912
+ strokeLinecap: "round",
28913
+ strokeLinejoin: "round",
28914
+ strokeWidth: 2,
28915
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
28916
+ }
28917
+ )
28918
+ }
28919
+ ),
28920
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
28921
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-bold tracking-tight", children: isConflict ? "Merge Conflict Detected" : isPull ? "Pull Failed" : "Push Rejected" }),
28922
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: isConflict ? "Unmerged files prevent Git from syncing automatically." : isPull ? "Unable to pull incoming commits from the remote repository." : "Remote repository rejected your push request." })
28923
+ ] })
28924
+ ]
28925
+ }
28926
+ ),
28927
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4 bg-canvas/80 border border-border p-3.5 rounded-lg max-h-36 overflow-y-auto custom-scrollbar", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-primary font-mono text-xs leading-relaxed whitespace-pre-wrap select-text", children: cleanedReason }) }),
28928
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-secondary mb-5 text-sm leading-relaxed", children: isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
28929
+ "Choose a resolution below: let",
28930
+ " ",
28931
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "text-primary font-semibold", children: "AI Auto-Healer" }),
28932
+ " ",
28933
+ "intelligently reconcile conflicts, keep your local changes, accept remote incoming changes, or abort the merge to revert to the previous state."
28934
+ ] }) : isPull ? /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "Failed to pull latest changes from the remote repository. Check your connection or use the AI Auto-Healer to analyze and fix the issue." }) : /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: "Recommendation: You can pull the latest changes from the remote to reconcile your local branch, or you can use the AI Auto-Healer to analyze and fix the issue automatically." }) }),
28935
+ isConflict ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2.5", children: [
28936
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28937
+ "button",
28938
+ {
28939
+ onClick: () => {
28940
+ const data = pushFailureData;
28941
+ setPushFailureData(null);
28942
+ autonomousHealAndPush(
28943
+ data.reason,
28944
+ data.operation || "pull",
28945
+ data.overrideRepoPath,
28946
+ data.overrideBranch
28947
+ );
28948
+ },
28949
+ className: "w-full py-2.5 bg-brand hover:bg-brand-hover border border-white/10 text-white rounded-md font-semibold transition-all text-sm flex items-center justify-center gap-2 shadow-lg shadow-brand/20 active:scale-[0.99]",
28950
+ children: "✨ Auto-Resolve with AI"
28951
+ }
28952
+ ),
28953
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
28954
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28955
+ "button",
28956
+ {
28957
+ onClick: handleResolveConflictOurs,
28958
+ className: "py-2 px-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-xs text-center hover:border-brand/40",
28959
+ title: "Keep local changes and discard remote changes",
28960
+ children: "Keep Local (Ours)"
28961
+ }
28962
+ ),
28963
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28964
+ "button",
28965
+ {
28966
+ onClick: handleResolveConflictTheirs,
28967
+ className: "py-2 px-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-xs text-center hover:border-brand/40",
28968
+ title: "Accept remote incoming changes and discard local changes",
28969
+ children: "Accept Remote (Theirs)"
28970
+ }
28971
+ ),
28972
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28973
+ "button",
28974
+ {
28975
+ onClick: handleAbortMerge,
28976
+ className: "py-2 px-2 bg-danger/10 hover:bg-danger/20 border border-danger/30 text-danger rounded-md font-semibold transition-all text-xs text-center",
28977
+ title: "Abort the merge and revert repository to previous state",
28978
+ children: "Abort Merge"
28979
+ }
28980
+ )
28981
+ ] }),
28982
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28983
+ "button",
28984
+ {
28985
+ onClick: () => {
28986
+ setPushFailureData(null);
28987
+ setChangesTab("changes");
28988
+ },
28989
+ className: "w-full py-2 bg-surface hover:bg-surface-hover border border-border text-secondary hover:text-primary rounded-md font-medium transition-colors text-xs text-center",
28990
+ children: "Review Conflicted Files Manually in Changes Tab"
28991
+ }
28992
+ ),
28993
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
28994
+ "button",
28995
+ {
28996
+ onClick: async () => {
28997
+ const data = pushFailureData;
28998
+ setPushFailureData(null);
28999
+ try {
29000
+ const remotes = await window.api.getRemotes();
29001
+ const targetRemote = data?.overrideRepoPath || remotes[0]?.name || "origin";
29002
+ const targetBranch = data?.overrideBranch || "main";
29003
+ await window.api.masterPush(targetRemote, targetBranch);
29004
+ setPushSuccessData({
29005
+ files: "All",
29006
+ branch: targetBranch,
29007
+ repository: targetRemote
29008
+ });
29009
+ } catch (err) {
29010
+ setPushFailureData({
29011
+ reason: err.message || "Master Force Push Failed",
29012
+ operation: "push",
29013
+ overrideRepoPath: data?.overrideRepoPath,
29014
+ overrideBranch: data?.overrideBranch
29015
+ });
29016
+ }
29017
+ },
29018
+ className: "w-full mt-2 py-2.5 bg-danger/20 hover:bg-danger/30 border border-danger/50 text-danger rounded-md font-bold transition-all text-sm flex items-center justify-center gap-2 shadow-lg shadow-danger/10 active:scale-[0.99]",
29019
+ title: "Force push everything (including ignored files) bypassing all rules",
29020
+ children: "⚡ Master Force Push (Override All)"
29021
+ }
29022
+ )
29023
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
29024
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-3", children: [
29025
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29026
+ "button",
29027
+ {
29028
+ onClick: () => {
29029
+ const data = pushFailureData;
29030
+ setPushFailureData(null);
29031
+ autonomousHealAndPush(
29032
+ data.reason,
29033
+ data.operation || (isPull ? "pull" : "push"),
29034
+ data.overrideRepoPath,
29035
+ data.overrideBranch
29036
+ );
29037
+ },
29038
+ className: "flex-1 py-2 bg-brand hover:bg-brand-hover border border-white/10 text-white rounded-md font-semibold transition-all text-sm flex items-center justify-center gap-2 active:scale-[0.99]",
29039
+ children: "✨ Fix with AI"
29040
+ }
29041
+ ),
29042
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29043
+ "button",
29044
+ {
29045
+ onClick: () => {
29046
+ setPushFailureData(null);
29047
+ handlePull();
29048
+ },
29049
+ className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-all text-sm active:scale-[0.99]",
29050
+ children: isPull ? "Retry Pull" : "Pull Changes"
29051
+ }
29052
+ ),
29053
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29054
+ "button",
29055
+ {
29056
+ onClick: () => setPushFailureData(null),
29057
+ className: "flex-1 py-2 bg-surface hover:bg-surface-hover border border-border text-primary rounded-md font-semibold transition-colors text-sm active:scale-[0.99]",
29058
+ children: "Cancel"
29059
+ }
29060
+ )
29061
+ ] }),
29062
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29063
+ "button",
29064
+ {
29065
+ onClick: async () => {
29066
+ const data = pushFailureData;
29067
+ setPushFailureData(null);
29068
+ try {
29069
+ const remotes = await window.api.getRemotes();
29070
+ const targetRemote = data?.overrideRepoPath || remotes[0]?.name || "origin";
29071
+ const targetBranch = data?.overrideBranch || "main";
29072
+ await window.api.masterPush(targetRemote, targetBranch);
29073
+ setPushSuccessData({
29074
+ files: "All",
29075
+ branch: targetBranch,
29076
+ repository: targetRemote
29077
+ });
29078
+ } catch (err) {
29079
+ setPushFailureData({
29080
+ reason: err.message || "Master Force Push Failed",
29081
+ operation: "push",
29082
+ overrideRepoPath: data?.overrideRepoPath,
29083
+ overrideBranch: data?.overrideBranch
29084
+ });
29085
+ }
29086
+ },
29087
+ className: "w-full py-2 bg-danger/20 hover:bg-danger/30 border border-danger/50 text-danger rounded-md font-bold transition-all text-sm flex items-center justify-center gap-2 active:scale-[0.99]",
29088
+ title: "Force push everything (including ignored files) bypassing all rules",
29089
+ children: "⚡ Master Force Push (Override All)"
29090
+ }
29091
+ )
29092
+ ] })
29093
+ ]
29094
+ }
29095
+ ) });
29096
+ })(),
28233
29097
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-64 lg:w-72 flex-shrink-0 bg-surface/80 backdrop-blur-md p-5 border-r border-border flex flex-col relative z-10 shadow-lg transition-colors duration-300", children: [
28234
29098
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 mb-6 p-1", children: [
28235
29099
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -28858,6 +29722,35 @@ Are you SURE you want to link "${repoName}" to this folder?`
28858
29722
  "Refresh"
28859
29723
  ]
28860
29724
  }
29725
+ ),
29726
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
29727
+ "button",
29728
+ {
29729
+ onClick: () => setShowForcePushModal(true),
29730
+ className: "w-full sm:w-auto px-4 py-2 sm:px-3 sm:py-1.5 bg-danger/10 hover:bg-danger/20 border border-danger/30 text-danger rounded-md text-xs font-bold active:scale-95 transition-all flex items-center justify-center gap-1.5",
29731
+ title: "Emergency Force Push (Master Override)",
29732
+ children: [
29733
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
29734
+ "svg",
29735
+ {
29736
+ className: "w-3.5 h-3.5",
29737
+ fill: "none",
29738
+ stroke: "currentColor",
29739
+ viewBox: "0 0 24 24",
29740
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
29741
+ "path",
29742
+ {
29743
+ strokeLinecap: "round",
29744
+ strokeLinejoin: "round",
29745
+ strokeWidth: 2,
29746
+ d: "M13 10V3L4 14h7v7l9-11h-7z"
29747
+ }
29748
+ )
29749
+ }
29750
+ ),
29751
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Force Push" })
29752
+ ]
29753
+ }
28861
29754
  )
28862
29755
  ] })
28863
29756
  ] }),
@@ -29870,7 +30763,10 @@ Are you SURE you want to link "${repoName}" to this folder?`
29870
30763
  onClick: async () => {
29871
30764
  try {
29872
30765
  await window.api.acceptInvitation(inv.id);
29873
- showToast(`Invitation accepted for ${inv.repository.full_name}!`, "success");
30766
+ showToast(
30767
+ `Invitation accepted for ${inv.repository.full_name}!`,
30768
+ "success"
30769
+ );
29874
30770
  setShowInvitationsModal(false);
29875
30771
  setShowCollabActionModal({
29876
30772
  name: inv.repository.name,
@@ -29924,6 +30820,288 @@ Are you SURE you want to link "${repoName}" to this folder?`
29924
30820
  }
29925
30821
  )
29926
30822
  ] }) }),
30823
+ showPrivacyModal && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 bg-black/80 backdrop-blur-md flex items-center justify-center z-50 p-4 md:p-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/98 backdrop-blur-2xl rounded-2xl shadow-2xl border border-border w-full max-w-4xl h-[720px] max-h-[92vh] flex flex-col overflow-hidden animate-float text-left", children: [
30824
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-8 py-5 border-b border-border shrink-0 flex items-center justify-between bg-surface", children: [
30825
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3.5", children: [
30826
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-emerald-500/10 border border-emerald-500/25 flex items-center justify-center text-emerald-400", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30827
+ "path",
30828
+ {
30829
+ strokeLinecap: "round",
30830
+ strokeLinejoin: "round",
30831
+ strokeWidth: 2,
30832
+ d: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
30833
+ }
30834
+ ) }) }),
30835
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
30836
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-bold text-primary leading-tight", children: "Privacy & Security Trust Center" }),
30837
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary mt-0.5", children: "Enterprise Grade • Local-First Architecture • Zero Telemetry Guaranteed" })
30838
+ ] })
30839
+ ] }),
30840
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30841
+ "button",
30842
+ {
30843
+ type: "button",
30844
+ onClick: () => setShowPrivacyModal(false),
30845
+ className: "w-8 h-8 rounded-lg text-secondary hover:text-primary hover:bg-surface-hover flex items-center justify-center transition-colors border border-transparent hover:border-border",
30846
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30847
+ "path",
30848
+ {
30849
+ strokeLinecap: "round",
30850
+ strokeLinejoin: "round",
30851
+ strokeWidth: 2,
30852
+ d: "M6 18L18 6M6 6l12 12"
30853
+ }
30854
+ ) })
30855
+ }
30856
+ )
30857
+ ] }),
30858
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-8 md:p-10 space-y-8 bg-surface/20", children: [
30859
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-5", children: [
30860
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-2", children: [
30861
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-8 h-8 rounded-lg bg-emerald-500/10 text-emerald-400 flex items-center justify-center mb-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30862
+ "path",
30863
+ {
30864
+ strokeLinecap: "round",
30865
+ strokeLinejoin: "round",
30866
+ strokeWidth: 2,
30867
+ d: "M5 13l4 4L19 7"
30868
+ }
30869
+ ) }) }),
30870
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary", children: "0.00% Telemetry" }),
30871
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Zero user analytics, tracking pixels, or diagnostic beacons collected or phoned home. None." })
30872
+ ] }),
30873
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-2", children: [
30874
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-8 h-8 rounded-lg bg-brand/10 text-brand flex items-center justify-center mb-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30875
+ "path",
30876
+ {
30877
+ strokeLinecap: "round",
30878
+ strokeLinejoin: "round",
30879
+ strokeWidth: 2,
30880
+ d: "M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
30881
+ }
30882
+ ) }) }),
30883
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary", children: "100% Local-First" }),
30884
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Repositories, commit logs, branches, and diffs never leave your local workstation file system." })
30885
+ ] }),
30886
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-2", children: [
30887
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-8 h-8 rounded-lg bg-accent/10 text-accent flex items-center justify-center mb-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30888
+ "path",
30889
+ {
30890
+ strokeLinecap: "round",
30891
+ strokeLinejoin: "round",
30892
+ strokeWidth: 2,
30893
+ d: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
30894
+ }
30895
+ ) }) }),
30896
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h4", { className: "text-sm font-bold text-primary", children: "OS Vault Security" }),
30897
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Tokens sealed with Windows DPAPI / macOS Keychain. Direct TLS 1.3 to official GitHub APIs." })
30898
+ ] })
30899
+ ] }),
30900
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
30901
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
30902
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
30903
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 01" }),
30904
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Local-First & Zero Telemetry Architecture" })
30905
+ ] }),
30906
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-emerald-400 bg-emerald-500/10 px-2.5 py-1 rounded-full border border-emerald-500/20", children: "Zero Surveillance" })
30907
+ ] }),
30908
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "GitQuickPush operates exclusively on your local machine as an offline-first Git client. We run zero intermediary proxy servers, host zero analytics collectors, and track zero keystrokes or repo activities. Your source code and commit history remain 100% isolated inside your workstation's local filesystem." }),
30909
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
30910
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ No telemetry collection" }),
30911
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ No remote code replication" }),
30912
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Works in air-gapped environments" })
30913
+ ] })
30914
+ ] }),
30915
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
30916
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
30917
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
30918
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 02" }),
30919
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Hardware-Sealed OS Keystore & Token Isolation" })
30920
+ ] }),
30921
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-accent bg-accent/10 px-2.5 py-1 rounded-full border border-accent/20", children: "DPAPI / Keychain" })
30922
+ ] }),
30923
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "GitHub OAuth tokens and sensitive configuration parameters are encrypted using Electron's native safeStorage API, backed directly by your operating system's cryptographic master vault (Windows DPAPI, macOS Keychain, or Linux SecretService). Network authentication requests connect strictly to official github.com API endpoints over TLS 1.3 with cryptographic certificate validation." }),
30924
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
30925
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ OS-level hardware encryption" }),
30926
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Direct TLS 1.3 to github.com" }),
30927
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Zero third-party relay servers" })
30928
+ ] })
30929
+ ] }),
30930
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
30931
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
30932
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
30933
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 03" }),
30934
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Ephemeral AI Assistance & Privacy Guarantees" })
30935
+ ] }),
30936
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-primary/80 bg-canvas px-2.5 py-1 rounded-full border border-border", children: "In-Memory Only" })
30937
+ ] }),
30938
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "When utilizing automated AI commit message generation or conflict diagnosis, only the necessary git diff patch is transmitted via direct TLS connection to your designated AI endpoint (GitHub Models / Google Gemini API). Data packets are processed strictly in-memory ephemerally and are never retained on disk, logged to telemetry stores, or used to train external public foundation models." }),
30939
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
30940
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Ephemeral in-memory analysis" }),
30941
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Never used for AI model training" }),
30942
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Fully optional & user-controlled" })
30943
+ ] })
30944
+ ] }),
30945
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
30946
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
30947
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
30948
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 04" }),
30949
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Zero Surveillance Hardware Access" })
30950
+ ] }),
30951
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-emerald-400 bg-emerald-500/10 px-2.5 py-1 rounded-full border border-emerald-500/20", children: "Strict Sandbox" })
30952
+ ] }),
30953
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "GitQuickPush maintains zero capabilities or permissions to access your camera, microphone, device location, system contacts, or external disk directories outside of designated Git workspace roots. All file system watchers operate strictly within the repository boundaries chosen by the user." }),
30954
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
30955
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Camera & microphone disabled" }),
30956
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Zero location tracking" }),
30957
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Scoped strictly to repository root" })
30958
+ ] })
30959
+ ] }),
30960
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 rounded-2xl bg-surface/80 border border-border/80 shadow-sm space-y-3", children: [
30961
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
30962
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2.5", children: [
30963
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-mono font-bold text-brand bg-brand/10 border border-brand/20 px-2 py-0.5 rounded", children: "SECTION 05" }),
30964
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-bold text-primary", children: "Institutional Compliance & Corporate Readiness" })
30965
+ ] }),
30966
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-semibold text-brand bg-brand/10 px-2.5 py-1 rounded-full border border-brand/20", children: "Enterprise Ready" })
30967
+ ] }),
30968
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-secondary leading-relaxed", children: "Because no proprietary codebases, employee identities, or repository metrics are transmitted or centralized on remote cloud infrastructure, GitQuickPush is fully aligned with institutional data sovereignty, GDPR, and enterprise security auditing standards. Organizations may freely deploy the application in strict internal environments." }),
30969
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-2 pt-1", children: [
30970
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ GDPR & institutional compliance" }),
30971
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ SOC 2 alignment" }),
30972
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-secondary/80 bg-canvas px-2.5 py-1 rounded-md border border-border/60", children: "✓ Open architecture auditability" })
30973
+ ] })
30974
+ ] })
30975
+ ] }),
30976
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-8 py-4.5 border-t border-border shrink-0 flex items-center justify-between bg-surface", children: [
30977
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-secondary font-mono", children: "Document ID: GQP-PRIV-2026.1 • Local-First Architecture Compliance" }),
30978
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
30979
+ "button",
30980
+ {
30981
+ type: "button",
30982
+ onClick: () => setShowPrivacyModal(false),
30983
+ className: "px-7 py-2.5 bg-brand hover:bg-brand-hover text-white rounded-xl font-bold text-xs shadow-md shadow-brand/20 transition-all active:translate-y-0.5",
30984
+ children: "Close Trust Center"
30985
+ }
30986
+ )
30987
+ ] })
30988
+ ] }) }),
30989
+ showForcePushModal && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 bg-black/80 backdrop-blur-md flex items-center justify-center z-50 p-4 md:p-6 transition-opacity", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-surface/98 backdrop-blur-2xl rounded-2xl shadow-2xl border border-danger/40 w-full max-w-lg overflow-hidden animate-float text-left", children: [
30990
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-6 py-5 border-b border-border flex items-center justify-between bg-danger/5", children: [
30991
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
30992
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl bg-danger/10 border border-danger/25 flex items-center justify-center text-danger", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
30993
+ "path",
30994
+ {
30995
+ strokeLinecap: "round",
30996
+ strokeLinejoin: "round",
30997
+ strokeWidth: 2,
30998
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
30999
+ }
31000
+ ) }) }),
31001
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
31002
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-base font-bold text-primary leading-tight", children: "Confirm Force Push Override" }),
31003
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-danger/80 mt-0.5 font-medium", children: "Destructive Remote Branch Override" })
31004
+ ] })
31005
+ ] }),
31006
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31007
+ "button",
31008
+ {
31009
+ type: "button",
31010
+ onClick: () => setShowForcePushModal(false),
31011
+ className: "w-8 h-8 rounded-lg text-secondary hover:text-primary hover:bg-surface-hover flex items-center justify-center transition-colors",
31012
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31013
+ "path",
31014
+ {
31015
+ strokeLinecap: "round",
31016
+ strokeLinejoin: "round",
31017
+ strokeWidth: 2,
31018
+ d: "M6 18L18 6M6 6l12 12"
31019
+ }
31020
+ ) })
31021
+ }
31022
+ )
31023
+ ] }),
31024
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 space-y-4", children: [
31025
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 rounded-xl bg-danger/10 border border-danger/30 text-xs text-danger leading-relaxed", children: [
31026
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "font-bold text-sm mb-1 flex items-center gap-1.5", children: [
31027
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "⚠️" }),
31028
+ " Warning: Non-Fast-Forward Overwrite"
31029
+ ] }),
31030
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [
31031
+ "Force pushing will forcefully rewrite the remote branch history to exactly mirror your local working tree. Any remote commits not present on your local workstation will be ",
31032
+ /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "font-black underline", children: "permanently lost" }),
31033
+ "."
31034
+ ] })
31035
+ ] }),
31036
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 rounded-xl bg-canvas border border-border space-y-2.5 text-xs", children: [
31037
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center", children: [
31038
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-secondary font-medium", children: "Active Branch:" }),
31039
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono font-bold text-primary bg-surface px-2 py-0.5 rounded border border-border", children: status?.current || "main" })
31040
+ ] }),
31041
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center", children: [
31042
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-secondary font-medium", children: "Target Remote:" }),
31043
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono font-bold text-brand bg-brand/10 px-2 py-0.5 rounded border border-brand/20", children: "origin" })
31044
+ ] }),
31045
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center", children: [
31046
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-secondary font-medium", children: "Safety Check:" }),
31047
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-warning font-semibold", children: "Bypassing Divergence Guards" })
31048
+ ] })
31049
+ ] })
31050
+ ] }),
31051
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-6 py-4 border-t border-border bg-surface flex items-center justify-end gap-3", children: [
31052
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31053
+ "button",
31054
+ {
31055
+ type: "button",
31056
+ disabled: isExecutingForcePush,
31057
+ onClick: () => setShowForcePushModal(false),
31058
+ className: "px-4 py-2 bg-canvas border border-border hover:bg-surface-hover text-secondary hover:text-primary rounded-xl text-xs font-semibold transition-all disabled:opacity-50",
31059
+ children: "Cancel"
31060
+ }
31061
+ ),
31062
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31063
+ "button",
31064
+ {
31065
+ type: "button",
31066
+ disabled: isExecutingForcePush,
31067
+ onClick: handleExecuteForcePush,
31068
+ className: "px-5 py-2 bg-danger hover:bg-danger/80 text-white rounded-xl text-xs font-bold transition-all shadow-md shadow-danger/25 flex items-center gap-2 disabled:opacity-50",
31069
+ children: isExecutingForcePush ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
31070
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
31071
+ "svg",
31072
+ {
31073
+ className: "w-4 h-4 animate-spin",
31074
+ fill: "none",
31075
+ stroke: "currentColor",
31076
+ viewBox: "0 0 24 24",
31077
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31078
+ "path",
31079
+ {
31080
+ strokeLinecap: "round",
31081
+ strokeLinejoin: "round",
31082
+ strokeWidth: 2,
31083
+ d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
31084
+ }
31085
+ )
31086
+ }
31087
+ ),
31088
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Overwriting Remote..." })
31089
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
31090
+ /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
31091
+ "path",
31092
+ {
31093
+ strokeLinecap: "round",
31094
+ strokeLinejoin: "round",
31095
+ strokeWidth: 2,
31096
+ d: "M13 10V3L4 14h7v7l9-11h-7z"
31097
+ }
31098
+ ) }),
31099
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Force Push Branch" })
31100
+ ] })
31101
+ }
31102
+ )
31103
+ ] })
31104
+ ] }) }),
29927
31105
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed top-6 right-6 z-[300] flex flex-col gap-3 pointer-events-none", children: toasts.map((toast) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "animate-fade-in pointer-events-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
29928
31106
  "div",
29929
31107
  {