@chrysb/alphaclaw 0.3.4 → 0.3.5-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/alphaclaw.js +82 -3
- package/lib/public/css/explorer.css +385 -9
- package/lib/public/css/theme.css +1 -1
- package/lib/public/js/app.js +102 -8
- package/lib/public/js/components/channels.js +1 -0
- package/lib/public/js/components/file-tree.js +74 -38
- package/lib/public/js/components/file-viewer/constants.js +6 -0
- package/lib/public/js/components/file-viewer/diff-viewer.js +46 -0
- package/lib/public/js/components/file-viewer/editor-surface.js +120 -0
- package/lib/public/js/components/file-viewer/frontmatter-panel.js +56 -0
- package/lib/public/js/components/file-viewer/index.js +164 -0
- package/lib/public/js/components/file-viewer/markdown-split-view.js +51 -0
- package/lib/public/js/components/file-viewer/media-preview.js +44 -0
- package/lib/public/js/components/file-viewer/scroll-sync.js +95 -0
- package/lib/public/js/components/file-viewer/sqlite-viewer.js +167 -0
- package/lib/public/js/components/file-viewer/status-banners.js +59 -0
- package/lib/public/js/components/file-viewer/storage.js +58 -0
- package/lib/public/js/components/file-viewer/toolbar.js +77 -0
- package/lib/public/js/components/file-viewer/use-editor-selection-restore.js +87 -0
- package/lib/public/js/components/file-viewer/use-file-diff.js +49 -0
- package/lib/public/js/components/file-viewer/use-file-loader.js +302 -0
- package/lib/public/js/components/file-viewer/use-file-viewer-draft-sync.js +32 -0
- package/lib/public/js/components/file-viewer/use-file-viewer-hotkeys.js +25 -0
- package/lib/public/js/components/file-viewer/use-file-viewer.js +379 -0
- package/lib/public/js/components/file-viewer/utils.js +11 -0
- package/lib/public/js/components/gateway.js +95 -48
- package/lib/public/js/components/icons.js +26 -0
- package/lib/public/js/components/sidebar-git-panel.js +219 -31
- package/lib/public/js/components/sidebar.js +1 -1
- package/lib/public/js/components/usage-tab.js +4 -1
- package/lib/public/js/components/watchdog-tab.js +6 -2
- package/lib/public/js/lib/api.js +31 -0
- package/lib/public/js/lib/browse-file-policies.js +34 -0
- package/lib/scripts/git +40 -0
- package/lib/scripts/git-askpass +6 -0
- package/lib/server/constants.js +8 -0
- package/lib/server/helpers.js +18 -5
- package/lib/server/internal-files-migration.js +93 -0
- package/lib/server/onboarding/cron.js +6 -4
- package/lib/server/onboarding/index.js +7 -0
- package/lib/server/onboarding/openclaw.js +6 -1
- package/lib/server/routes/browse/constants.js +51 -0
- package/lib/server/routes/browse/file-helpers.js +43 -0
- package/lib/server/routes/browse/git.js +131 -0
- package/lib/server/routes/browse/index.js +572 -0
- package/lib/server/routes/browse/path-utils.js +53 -0
- package/lib/server/routes/browse/sqlite.js +140 -0
- package/lib/server/routes/pairings.js +8 -2
- package/lib/server/routes/proxy.js +11 -5
- package/lib/server/routes/system.js +5 -1
- package/lib/server.js +7 -0
- package/lib/setup/core-prompts/TOOLS.md +0 -4
- package/package.json +1 -1
- package/lib/public/js/components/file-viewer.js +0 -864
- package/lib/server/routes/browse.js +0 -295
package/bin/alphaclaw.js
CHANGED
|
@@ -10,6 +10,9 @@ const {
|
|
|
10
10
|
validateGitSyncFilePath,
|
|
11
11
|
} = require("../lib/cli/git-sync");
|
|
12
12
|
const { buildSecretReplacements } = require("../lib/server/helpers");
|
|
13
|
+
const {
|
|
14
|
+
migrateManagedInternalFiles,
|
|
15
|
+
} = require("../lib/server/internal-files-migration");
|
|
13
16
|
|
|
14
17
|
const kUsageTrackerPluginPath = path.resolve(
|
|
15
18
|
__dirname,
|
|
@@ -143,6 +146,10 @@ if (portFlag) {
|
|
|
143
146
|
|
|
144
147
|
const openclawDir = path.join(rootDir, ".openclaw");
|
|
145
148
|
fs.mkdirSync(openclawDir, { recursive: true });
|
|
149
|
+
const { hourlyGitSyncPath } = migrateManagedInternalFiles({
|
|
150
|
+
fs,
|
|
151
|
+
openclawDir,
|
|
152
|
+
});
|
|
146
153
|
console.log(`[alphaclaw] Root directory: ${rootDir}`);
|
|
147
154
|
|
|
148
155
|
// Check for pending update marker (written by the update endpoint before restart).
|
|
@@ -542,7 +549,6 @@ if (!fs.existsSync(gogConfigFile)) {
|
|
|
542
549
|
// 8. Install/reconcile system cron entry
|
|
543
550
|
// ---------------------------------------------------------------------------
|
|
544
551
|
|
|
545
|
-
const hourlyGitSyncPath = path.join(openclawDir, "hourly-git-sync.sh");
|
|
546
552
|
const packagedHourlyGitSyncPath = path.join(setupDir, "hourly-git-sync.sh");
|
|
547
553
|
|
|
548
554
|
try {
|
|
@@ -747,6 +753,25 @@ if (fs.existsSync(configPath)) {
|
|
|
747
753
|
stdio: "ignore",
|
|
748
754
|
env: gitEnv,
|
|
749
755
|
});
|
|
756
|
+
try {
|
|
757
|
+
execSync("git show-ref --verify --quiet refs/heads/main", {
|
|
758
|
+
cwd: openclawDir,
|
|
759
|
+
stdio: "ignore",
|
|
760
|
+
});
|
|
761
|
+
try {
|
|
762
|
+
execSync("git rev-parse --abbrev-ref --symbolic-full-name main@{upstream}", {
|
|
763
|
+
cwd: openclawDir,
|
|
764
|
+
stdio: "ignore",
|
|
765
|
+
});
|
|
766
|
+
} catch {
|
|
767
|
+
execSync("git branch --set-upstream-to=origin/main main", {
|
|
768
|
+
cwd: openclawDir,
|
|
769
|
+
stdio: "ignore",
|
|
770
|
+
env: gitEnv,
|
|
771
|
+
});
|
|
772
|
+
console.log("[alphaclaw] Set main upstream to origin/main");
|
|
773
|
+
}
|
|
774
|
+
} catch {}
|
|
750
775
|
const remoteConfig = String(
|
|
751
776
|
execSync(`git show "origin/${branch}:openclaw.json"`, {
|
|
752
777
|
cwd: openclawDir,
|
|
@@ -822,7 +847,16 @@ if (fs.existsSync(configPath)) {
|
|
|
822
847
|
const replacements = buildSecretReplacements(process.env);
|
|
823
848
|
for (const [secret, envRef] of replacements) {
|
|
824
849
|
if (secret) {
|
|
825
|
-
|
|
850
|
+
// Only replace the secret if it is an exact match for a JSON string value
|
|
851
|
+
// This ensures we do not replace substrings inside other strings
|
|
852
|
+
const secretJson = JSON.stringify(secret);
|
|
853
|
+
content = content.replace(
|
|
854
|
+
new RegExp(
|
|
855
|
+
secretJson.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"),
|
|
856
|
+
"g",
|
|
857
|
+
),
|
|
858
|
+
JSON.stringify(envRef),
|
|
859
|
+
);
|
|
826
860
|
}
|
|
827
861
|
}
|
|
828
862
|
fs.writeFileSync(configPath, content);
|
|
@@ -856,7 +890,52 @@ try {
|
|
|
856
890
|
}
|
|
857
891
|
|
|
858
892
|
// ---------------------------------------------------------------------------
|
|
859
|
-
// 13.
|
|
893
|
+
// 13. Install git auth shim
|
|
894
|
+
// ---------------------------------------------------------------------------
|
|
895
|
+
|
|
896
|
+
try {
|
|
897
|
+
const gitAskPassSrc = path.join(__dirname, "..", "lib", "scripts", "git-askpass");
|
|
898
|
+
const gitAskPassDest = "/tmp/alphaclaw-git-askpass.sh";
|
|
899
|
+
const gitShimTemplatePath = path.join(__dirname, "..", "lib", "scripts", "git");
|
|
900
|
+
const gitShimDest = "/usr/local/bin/git";
|
|
901
|
+
|
|
902
|
+
if (fs.existsSync(gitAskPassSrc)) {
|
|
903
|
+
fs.copyFileSync(gitAskPassSrc, gitAskPassDest);
|
|
904
|
+
fs.chmodSync(gitAskPassDest, 0o755);
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
if (fs.existsSync(gitShimTemplatePath)) {
|
|
908
|
+
let realGitPath = "/usr/bin/git";
|
|
909
|
+
try {
|
|
910
|
+
const gitCandidates = String(
|
|
911
|
+
execSync("which -a git", {
|
|
912
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
913
|
+
encoding: "utf8",
|
|
914
|
+
}),
|
|
915
|
+
)
|
|
916
|
+
.split("\n")
|
|
917
|
+
.map((candidate) => candidate.trim())
|
|
918
|
+
.filter(Boolean);
|
|
919
|
+
const normalizedShimDest = path.resolve(gitShimDest);
|
|
920
|
+
const selectedCandidate = gitCandidates.find(
|
|
921
|
+
(candidatePath) => path.resolve(candidatePath) !== normalizedShimDest,
|
|
922
|
+
);
|
|
923
|
+
if (selectedCandidate) realGitPath = selectedCandidate;
|
|
924
|
+
} catch {}
|
|
925
|
+
|
|
926
|
+
const gitShimTemplate = fs.readFileSync(gitShimTemplatePath, "utf8");
|
|
927
|
+
const gitShimContent = gitShimTemplate
|
|
928
|
+
.replace("@@REAL_GIT@@", realGitPath)
|
|
929
|
+
.replace("@@OPENCLAW_REPO_ROOT@@", openclawDir);
|
|
930
|
+
fs.writeFileSync(gitShimDest, gitShimContent, { mode: 0o755 });
|
|
931
|
+
console.log("[alphaclaw] git auth shim installed");
|
|
932
|
+
}
|
|
933
|
+
} catch (e) {
|
|
934
|
+
console.log(`[alphaclaw] git auth shim skipped: ${e.message}`);
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
// ---------------------------------------------------------------------------
|
|
938
|
+
// 14. Start Express server
|
|
860
939
|
// ---------------------------------------------------------------------------
|
|
861
940
|
|
|
862
941
|
console.log("[alphaclaw] Setup complete -- starting server");
|
|
@@ -105,6 +105,11 @@
|
|
|
105
105
|
padding: 6px 0 8px;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
.file-tree-wrap-loading {
|
|
109
|
+
min-height: 100%;
|
|
110
|
+
display: flex;
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
.file-tree-search {
|
|
109
114
|
padding: 0 8px 6px;
|
|
110
115
|
}
|
|
@@ -254,6 +259,10 @@
|
|
|
254
259
|
color: #ff7ac6;
|
|
255
260
|
}
|
|
256
261
|
|
|
262
|
+
.file-icon-audio {
|
|
263
|
+
color: #f5a6ff;
|
|
264
|
+
}
|
|
265
|
+
|
|
257
266
|
.file-icon-shell {
|
|
258
267
|
color: #71f8a7;
|
|
259
268
|
}
|
|
@@ -281,6 +290,14 @@
|
|
|
281
290
|
box-shadow: 0 0 6px rgba(45, 226, 255, 0.75);
|
|
282
291
|
}
|
|
283
292
|
|
|
293
|
+
.tree-lock-icon {
|
|
294
|
+
flex: 0 0 auto;
|
|
295
|
+
margin-left: auto;
|
|
296
|
+
width: 11px;
|
|
297
|
+
height: 11px;
|
|
298
|
+
color: var(--text-dim);
|
|
299
|
+
}
|
|
300
|
+
|
|
284
301
|
.tree-children {
|
|
285
302
|
list-style: none;
|
|
286
303
|
}
|
|
@@ -295,6 +312,15 @@
|
|
|
295
312
|
color: var(--text-muted);
|
|
296
313
|
}
|
|
297
314
|
|
|
315
|
+
.file-tree-state-loading {
|
|
316
|
+
width: 100%;
|
|
317
|
+
flex: 1 1 auto;
|
|
318
|
+
min-height: 100%;
|
|
319
|
+
display: flex;
|
|
320
|
+
align-items: center;
|
|
321
|
+
justify-content: center;
|
|
322
|
+
}
|
|
323
|
+
|
|
298
324
|
.file-tree-state-error {
|
|
299
325
|
color: #f87171;
|
|
300
326
|
}
|
|
@@ -331,6 +357,21 @@
|
|
|
331
357
|
background: rgba(234, 179, 8, 0.08);
|
|
332
358
|
}
|
|
333
359
|
|
|
360
|
+
.file-viewer-protected-banner.is-locked {
|
|
361
|
+
background: rgba(220, 38, 38, 0.16);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.file-viewer-protected-banner-icon {
|
|
365
|
+
width: 14px;
|
|
366
|
+
height: 14px;
|
|
367
|
+
color: #fca5a5;
|
|
368
|
+
flex-shrink: 0;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.file-viewer-protected-banner.is-locked .file-viewer-protected-banner-text {
|
|
372
|
+
color: #fecaca;
|
|
373
|
+
}
|
|
374
|
+
|
|
334
375
|
.file-viewer-protected-banner-text {
|
|
335
376
|
font-size: 12px;
|
|
336
377
|
color: #f7cc5e;
|
|
@@ -344,6 +385,15 @@
|
|
|
344
385
|
letter-spacing: 0.01em;
|
|
345
386
|
}
|
|
346
387
|
|
|
388
|
+
.file-viewer-diff-banner {
|
|
389
|
+
background: rgba(59, 130, 246, 0.12);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.file-viewer-diff-banner .file-viewer-protected-banner-text,
|
|
393
|
+
.file-viewer-diff-banner {
|
|
394
|
+
color: #bfdbfe;
|
|
395
|
+
}
|
|
396
|
+
|
|
347
397
|
.file-viewer-tabbar-spacer {
|
|
348
398
|
flex: 1;
|
|
349
399
|
}
|
|
@@ -559,6 +609,48 @@
|
|
|
559
609
|
align-items: stretch;
|
|
560
610
|
}
|
|
561
611
|
|
|
612
|
+
.file-viewer-diff-shell {
|
|
613
|
+
width: 100%;
|
|
614
|
+
min-height: 0;
|
|
615
|
+
height: 100%;
|
|
616
|
+
overflow: auto;
|
|
617
|
+
padding: 8px 0;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
.file-viewer-diff-pre {
|
|
621
|
+
margin: 0;
|
|
622
|
+
padding: 0 12px 12px;
|
|
623
|
+
font-family: inherit;
|
|
624
|
+
font-size: 12px;
|
|
625
|
+
line-height: 1.45;
|
|
626
|
+
color: var(--text-muted);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
.file-viewer-diff-line {
|
|
630
|
+
white-space: pre-wrap;
|
|
631
|
+
word-break: break-word;
|
|
632
|
+
padding: 1px 8px;
|
|
633
|
+
border-radius: 4px;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
.file-viewer-diff-line.is-added {
|
|
637
|
+
color: #86efac;
|
|
638
|
+
background: rgba(34, 197, 94, 0.1);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
.file-viewer-diff-line.is-removed {
|
|
642
|
+
color: #fca5a5;
|
|
643
|
+
background: rgba(239, 68, 68, 0.1);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
.file-viewer-diff-line.is-hunk {
|
|
647
|
+
color: #93c5fd;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
.file-viewer-diff-line.is-header {
|
|
651
|
+
color: var(--text-dim);
|
|
652
|
+
}
|
|
653
|
+
|
|
562
654
|
.file-viewer-editor-line-num-col {
|
|
563
655
|
width: 56px;
|
|
564
656
|
flex-shrink: 0;
|
|
@@ -841,6 +933,187 @@
|
|
|
841
933
|
color: var(--text-muted);
|
|
842
934
|
}
|
|
843
935
|
|
|
936
|
+
.file-viewer-image-shell {
|
|
937
|
+
flex: 1 1 auto;
|
|
938
|
+
min-height: 0;
|
|
939
|
+
height: 100%;
|
|
940
|
+
display: flex;
|
|
941
|
+
align-items: center;
|
|
942
|
+
justify-content: center;
|
|
943
|
+
padding: 18px;
|
|
944
|
+
overflow: auto;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
.file-viewer-image {
|
|
948
|
+
max-width: 100%;
|
|
949
|
+
max-height: 100%;
|
|
950
|
+
width: auto;
|
|
951
|
+
height: auto;
|
|
952
|
+
border-radius: 8px;
|
|
953
|
+
border: 1px solid var(--border);
|
|
954
|
+
background: rgba(255, 255, 255, 0.02);
|
|
955
|
+
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
.file-viewer-audio-shell {
|
|
959
|
+
flex: 1 1 auto;
|
|
960
|
+
min-height: 0;
|
|
961
|
+
height: 100%;
|
|
962
|
+
display: flex;
|
|
963
|
+
align-items: center;
|
|
964
|
+
justify-content: center;
|
|
965
|
+
padding: 18px;
|
|
966
|
+
overflow: auto;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
.file-viewer-audio-player {
|
|
970
|
+
width: min(640px, 100%);
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
.file-viewer-sqlite-shell {
|
|
974
|
+
flex: 1 1 auto;
|
|
975
|
+
min-height: 0;
|
|
976
|
+
height: 100%;
|
|
977
|
+
overflow: auto;
|
|
978
|
+
padding: 14px 16px 22px;
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
.file-viewer-sqlite-header {
|
|
982
|
+
font-size: 12px;
|
|
983
|
+
color: var(--text-dim);
|
|
984
|
+
margin-bottom: 10px;
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
.file-viewer-sqlite-footer {
|
|
988
|
+
margin-top: 10px;
|
|
989
|
+
text-align: center;
|
|
990
|
+
font-size: 12px;
|
|
991
|
+
color: var(--text-dim);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
.file-viewer-sqlite-list {
|
|
995
|
+
flex: 0 0 240px;
|
|
996
|
+
display: flex;
|
|
997
|
+
flex-direction: column;
|
|
998
|
+
gap: 8px;
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
.file-viewer-sqlite-layout {
|
|
1002
|
+
display: flex;
|
|
1003
|
+
gap: 12px;
|
|
1004
|
+
align-items: stretch;
|
|
1005
|
+
min-height: 0;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
.file-viewer-sqlite-card {
|
|
1009
|
+
width: 100%;
|
|
1010
|
+
text-align: left;
|
|
1011
|
+
cursor: pointer;
|
|
1012
|
+
display: flex;
|
|
1013
|
+
align-items: center;
|
|
1014
|
+
border: 1px solid var(--border);
|
|
1015
|
+
border-radius: 8px;
|
|
1016
|
+
padding: 7px 10px;
|
|
1017
|
+
background: rgba(255, 255, 255, 0.02);
|
|
1018
|
+
font: inherit;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
.file-viewer-sqlite-card:hover {
|
|
1022
|
+
background: rgba(255, 255, 255, 0.04);
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
.file-viewer-sqlite-card.is-active {
|
|
1026
|
+
border-color: rgba(99, 235, 255, 0.45);
|
|
1027
|
+
background: rgba(99, 235, 255, 0.08);
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
.file-viewer-sqlite-title {
|
|
1031
|
+
width: 100%;
|
|
1032
|
+
display: flex;
|
|
1033
|
+
align-items: center;
|
|
1034
|
+
justify-content: space-between;
|
|
1035
|
+
gap: 10px;
|
|
1036
|
+
font-size: 12px;
|
|
1037
|
+
color: var(--text);
|
|
1038
|
+
margin-bottom: 0;
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
.file-viewer-sqlite-type {
|
|
1042
|
+
font-size: 10px;
|
|
1043
|
+
letter-spacing: 0.06em;
|
|
1044
|
+
text-transform: uppercase;
|
|
1045
|
+
color: var(--text-dim);
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
.file-viewer-sqlite-table-shell {
|
|
1049
|
+
flex: 1;
|
|
1050
|
+
min-width: 0;
|
|
1051
|
+
border: 1px solid var(--border);
|
|
1052
|
+
border-radius: 8px;
|
|
1053
|
+
padding: 10px;
|
|
1054
|
+
background: rgba(255, 255, 255, 0.015);
|
|
1055
|
+
display: flex;
|
|
1056
|
+
flex-direction: column;
|
|
1057
|
+
min-height: 0;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
.file-viewer-sqlite-table-header {
|
|
1061
|
+
display: flex;
|
|
1062
|
+
align-items: center;
|
|
1063
|
+
justify-content: space-between;
|
|
1064
|
+
gap: 10px;
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
.file-viewer-sqlite-table-name {
|
|
1068
|
+
font-size: 12px;
|
|
1069
|
+
color: var(--text);
|
|
1070
|
+
font-weight: 600;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
.file-viewer-sqlite-table-nav {
|
|
1074
|
+
display: inline-flex;
|
|
1075
|
+
gap: 6px;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
.file-viewer-sqlite-table-meta {
|
|
1079
|
+
margin-top: 4px;
|
|
1080
|
+
margin-bottom: 8px;
|
|
1081
|
+
font-size: 11px;
|
|
1082
|
+
color: var(--text-dim);
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
.file-viewer-sqlite-table-wrap {
|
|
1086
|
+
min-height: 0;
|
|
1087
|
+
overflow: auto;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
.file-viewer-sqlite-table {
|
|
1091
|
+
width: 100%;
|
|
1092
|
+
border-collapse: collapse;
|
|
1093
|
+
table-layout: fixed;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
.file-viewer-sqlite-table th,
|
|
1097
|
+
.file-viewer-sqlite-table td {
|
|
1098
|
+
border: 1px solid var(--border);
|
|
1099
|
+
padding: 6px 8px;
|
|
1100
|
+
font-size: 11px;
|
|
1101
|
+
color: var(--text-muted);
|
|
1102
|
+
text-align: left;
|
|
1103
|
+
white-space: nowrap;
|
|
1104
|
+
overflow: hidden;
|
|
1105
|
+
text-overflow: ellipsis;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
.file-viewer-sqlite-table th {
|
|
1109
|
+
color: var(--text);
|
|
1110
|
+
background: rgba(255, 255, 255, 0.04);
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
.file-viewer-sqlite-table-empty {
|
|
1114
|
+
color: var(--text-dim);
|
|
1115
|
+
}
|
|
1116
|
+
|
|
844
1117
|
.file-viewer-state-error {
|
|
845
1118
|
color: #f87171;
|
|
846
1119
|
}
|
|
@@ -957,35 +1230,138 @@
|
|
|
957
1230
|
text-overflow: ellipsis;
|
|
958
1231
|
}
|
|
959
1232
|
|
|
960
|
-
.sidebar-git-
|
|
961
|
-
font-size:
|
|
962
|
-
|
|
963
|
-
|
|
1233
|
+
.sidebar-git-sync-status {
|
|
1234
|
+
font-size: 12px;
|
|
1235
|
+
font-weight: 600;
|
|
1236
|
+
line-height: 1;
|
|
964
1237
|
}
|
|
965
1238
|
|
|
966
|
-
.sidebar-git-
|
|
1239
|
+
.sidebar-git-sync-status.is-up-to-date {
|
|
967
1240
|
color: #71f8a7;
|
|
968
1241
|
}
|
|
969
1242
|
|
|
970
|
-
.sidebar-git-
|
|
1243
|
+
.sidebar-git-sync-status.is-ahead,
|
|
1244
|
+
.sidebar-git-sync-status.is-diverged {
|
|
971
1245
|
color: #f3a86a;
|
|
972
1246
|
}
|
|
973
1247
|
|
|
1248
|
+
.sidebar-git-sync-status.is-behind {
|
|
1249
|
+
color: #93c5fd;
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
.sidebar-git-sync-status.is-no-upstream,
|
|
1253
|
+
.sidebar-git-sync-status.is-upstream-gone {
|
|
1254
|
+
color: var(--text-dim);
|
|
1255
|
+
}
|
|
1256
|
+
|
|
974
1257
|
.sidebar-git-meta {
|
|
975
1258
|
color: var(--text-muted);
|
|
976
1259
|
}
|
|
977
1260
|
|
|
978
|
-
.sidebar-git-
|
|
1261
|
+
.sidebar-git-changes-label {
|
|
1262
|
+
padding: 7px 10px 4px;
|
|
1263
|
+
font-size: 10px;
|
|
1264
|
+
letter-spacing: 0.06em;
|
|
1265
|
+
text-transform: uppercase;
|
|
1266
|
+
color: var(--text-dim);
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
.sidebar-git-changes-list {
|
|
979
1270
|
list-style: none;
|
|
980
1271
|
display: flex;
|
|
981
1272
|
flex-direction: column;
|
|
982
|
-
gap:
|
|
983
|
-
padding: 6px
|
|
1273
|
+
gap: 2px;
|
|
1274
|
+
padding: 0 6px;
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
.sidebar-git-change-row {
|
|
1278
|
+
display: flex;
|
|
1279
|
+
align-items: center;
|
|
1280
|
+
justify-content: space-between;
|
|
1281
|
+
gap: 8px;
|
|
1282
|
+
min-height: 22px;
|
|
1283
|
+
padding: 2px 6px;
|
|
1284
|
+
border-radius: 6px;
|
|
1285
|
+
line-height: 1.25;
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
.sidebar-git-change-row.is-clickable {
|
|
1289
|
+
cursor: pointer;
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
.sidebar-git-change-row.is-clickable:hover {
|
|
1293
|
+
background: rgba(255, 255, 255, 0.04);
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
.sidebar-git-change-path {
|
|
1297
|
+
min-width: 0;
|
|
1298
|
+
white-space: nowrap;
|
|
1299
|
+
overflow: hidden;
|
|
1300
|
+
text-overflow: ellipsis;
|
|
1301
|
+
color: var(--text-muted);
|
|
1302
|
+
font-weight: 400;
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
.sidebar-git-change-meta {
|
|
1306
|
+
display: inline-flex;
|
|
1307
|
+
align-items: center;
|
|
1308
|
+
gap: 6px;
|
|
1309
|
+
flex-shrink: 0;
|
|
1310
|
+
font-size: 10px;
|
|
1311
|
+
}
|
|
1312
|
+
|
|
1313
|
+
.sidebar-git-change-plus {
|
|
1314
|
+
color: #71f8a7;
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
.sidebar-git-change-minus {
|
|
1318
|
+
color: #f3a86a;
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
.sidebar-git-change-status {
|
|
1322
|
+
font-size: 10px;
|
|
1323
|
+
letter-spacing: 0.06em;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
.sidebar-git-change-row.is-untracked .sidebar-git-change-status {
|
|
1327
|
+
color: #71f8a7;
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
.sidebar-git-change-row.is-modified .sidebar-git-change-status {
|
|
1331
|
+
color: #63ebff;
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
.sidebar-git-change-row.is-deleted .sidebar-git-change-status {
|
|
1335
|
+
color: #f87171;
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
.sidebar-git-change-row.is-deleted .sidebar-git-change-path {
|
|
1339
|
+
text-decoration: line-through;
|
|
1340
|
+
text-decoration-thickness: 1px;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
.sidebar-git-scroll {
|
|
984
1344
|
overflow-y: auto;
|
|
985
1345
|
min-height: 0;
|
|
986
1346
|
flex: 1 1 auto;
|
|
987
1347
|
}
|
|
988
1348
|
|
|
1349
|
+
.sidebar-git-actions {
|
|
1350
|
+
padding: 8px 10px 6px;
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
.sidebar-git-sync-button {
|
|
1354
|
+
width: 100%;
|
|
1355
|
+
}
|
|
1356
|
+
|
|
1357
|
+
.sidebar-git-list {
|
|
1358
|
+
list-style: none;
|
|
1359
|
+
display: flex;
|
|
1360
|
+
flex-direction: column;
|
|
1361
|
+
gap: 3px;
|
|
1362
|
+
padding: 6px 10px 0;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
989
1365
|
.sidebar-git-list li {
|
|
990
1366
|
display: flex;
|
|
991
1367
|
align-items: baseline;
|
package/lib/public/css/theme.css
CHANGED