@cortexkit/aft-opencode 0.56.2 → 0.57.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bg-notifications.d.ts +1 -0
- package/dist/bg-notifications.d.ts.map +1 -1
- package/dist/entry/server.js +2650 -267
- package/dist/index.js +420 -228
- package/dist/lsp-github-install.d.ts.map +1 -1
- package/dist/permissions/v2-service.d.ts +30 -0
- package/dist/permissions/v2-service.d.ts.map +1 -0
- package/dist/permissions/v2.d.ts +121 -9
- package/dist/permissions/v2.d.ts.map +1 -1
- package/dist/shared/rpc-server.d.ts.map +1 -1
- package/dist/shared/status.d.ts +8 -1
- package/dist/shared/status.d.ts.map +1 -1
- package/dist/subc-tool-schemas.d.ts +11 -0
- package/dist/subc-tool-schemas.d.ts.map +1 -1
- package/dist/tool-registration.d.ts.map +1 -1
- package/dist/tools/definitions/v2.d.ts +6 -0
- package/dist/tools/definitions/v2.d.ts.map +1 -1
- package/dist/tools/hoisted/v2.d.ts +12 -2
- package/dist/tools/hoisted/v2.d.ts.map +1 -1
- package/dist/tools/hoisted.d.ts.map +1 -1
- package/dist/tools/semantic.d.ts.map +1 -1
- package/dist/tui/v2-status.d.ts +8 -0
- package/dist/tui/v2-status.d.ts.map +1 -1
- package/index.js +14 -0
- package/package.json +14 -10
- package/server.js +8 -0
- package/src/shared/rpc-server.ts +5 -0
- package/src/shared/status.ts +16 -9
- package/src/tui/index.tsx +1 -0
- package/src/tui/sidebar-view.tsx +722 -0
- package/src/tui/sidebar.tsx +42 -560
- package/src/tui/v2-status.ts +8 -1
- package/src/tui/v2.tsx +173 -30
- package/src/tui-compiled/index.tsx +1 -1
- package/src/tui-compiled/sidebar-view.tsx +815 -0
- package/src/tui-compiled/sidebar.tsx +45 -693
- package/src/tui-compiled/v2-status.ts +8 -1
- package/src/tui-compiled/v2.tsx +163 -54
- package/tui.js +7 -0
|
@@ -1,11 +1,4 @@
|
|
|
1
1
|
import { createComponent as _$createComponent } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
2
|
-
import { createTextNode as _$createTextNode } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
3
|
-
import { memo as _$memo } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
4
|
-
import { effect as _$effect } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
5
|
-
import { insertNode as _$insertNode } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
6
|
-
import { insert as _$insert } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
7
|
-
import { setProp as _$setProp } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
8
|
-
import { createElement as _$createElement } from "opentui:runtime-module:%40opentui%2Fsolid";
|
|
9
2
|
/** @jsxImportSource @opentui/solid */
|
|
10
3
|
// @ts-nocheck
|
|
11
4
|
|
|
@@ -17,233 +10,35 @@ import { createElement as _$createElement } from "opentui:runtime-module:%40open
|
|
|
17
10
|
import { canonicalizeProjectRoot } from "@cortexkit/aft-bridge";
|
|
18
11
|
import { createEffect, createMemo, createSignal, on, onCleanup } from "opentui:runtime-module:solid-js";
|
|
19
12
|
import { AftRpcClient } from "../shared/rpc-client";
|
|
20
|
-
import { coerceAftStatus
|
|
13
|
+
import { coerceAftStatus } from "../shared/status";
|
|
21
14
|
import { resolveCortexKitStorageRoot } from "../shared/storage-paths";
|
|
22
|
-
import { badgeTextColor } from "./badge-contrast";
|
|
23
15
|
import { createDebouncedStatusRefresh, refreshAftTuiSocketScope, subscribeStatusInvalidations } from "./notification-socket";
|
|
24
|
-
import { computeEffectiveOrder,
|
|
25
|
-
|
|
26
|
-
type: "single"
|
|
27
|
-
};
|
|
28
|
-
const REFRESH_DEBOUNCE_MS = 200;
|
|
29
|
-
function formatBytes(n) {
|
|
30
|
-
if (!Number.isFinite(n) || n <= 0) return "—";
|
|
31
|
-
if (n >= 1_073_741_824) return `${(n / 1_073_741_824).toFixed(1)} GB`;
|
|
32
|
-
if (n >= 1_048_576) return `${(n / 1_048_576).toFixed(1)} MB`;
|
|
33
|
-
if (n >= 1_024) return `${Math.round(n / 1_024)} KB`;
|
|
34
|
-
return `${n} B`;
|
|
35
|
-
}
|
|
36
|
-
function formatCount(n) {
|
|
37
|
-
if (n == null || !Number.isFinite(n)) return "—";
|
|
38
|
-
if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;
|
|
39
|
-
if (n >= 1_000) return `${Math.round(n / 1_000)}K`;
|
|
40
|
-
return String(n);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/** Tagged rows for the Compression section. Each scope (Session / Project)
|
|
44
|
-
* emits a "scope" header followed by two "stat" rows — Tokens Saved and
|
|
45
|
-
* Compression Ratio — so the renderer can use the same StatRow layout as
|
|
46
|
-
* Search Index / Semantic Index above. Pi's monospace overlay and the
|
|
47
|
-
* OpenCode TUI dialog/sidebar all consume this same shape. */
|
|
48
|
-
|
|
49
|
-
function appendScope(rows, label, scope) {
|
|
50
|
-
const savings = scope.savings_tokens;
|
|
51
|
-
const pct = scope.original_tokens > 0 ? Math.round(savings / scope.original_tokens * 100) : 0;
|
|
52
|
-
rows.push({
|
|
53
|
-
kind: "scope",
|
|
54
|
-
label
|
|
55
|
-
});
|
|
56
|
-
rows.push({
|
|
57
|
-
kind: "stat",
|
|
58
|
-
label: "Tokens Saved",
|
|
59
|
-
value: savings.toLocaleString("en-US")
|
|
60
|
-
});
|
|
61
|
-
rows.push({
|
|
62
|
-
kind: "stat",
|
|
63
|
-
label: "Compression Ratio",
|
|
64
|
-
value: `${pct}%`
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
export function formatCompressionSidebarRows(compression) {
|
|
68
|
-
if (!compression || compression.project.events <= 0) return [];
|
|
69
|
-
const rows = [];
|
|
70
|
-
if (compression.session.events > 0) {
|
|
71
|
-
appendScope(rows, "Session", compression.session);
|
|
72
|
-
}
|
|
73
|
-
appendScope(rows, "Project", compression.project);
|
|
74
|
-
return rows;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Map index status → (label, theme color name). The label is what we want
|
|
78
|
-
// the user to see; the color encodes severity so the eye lands on warnings.
|
|
79
|
-
function statusDisplay(status) {
|
|
80
|
-
switch (status) {
|
|
81
|
-
case "ready":
|
|
82
|
-
return {
|
|
83
|
-
label: "ready",
|
|
84
|
-
tone: "ok"
|
|
85
|
-
};
|
|
86
|
-
case "loading":
|
|
87
|
-
case "building":
|
|
88
|
-
return {
|
|
89
|
-
label: status,
|
|
90
|
-
tone: "warn"
|
|
91
|
-
};
|
|
92
|
-
case "failed":
|
|
93
|
-
case "error":
|
|
94
|
-
return {
|
|
95
|
-
label: status,
|
|
96
|
-
tone: "err"
|
|
97
|
-
};
|
|
98
|
-
case "disabled":
|
|
99
|
-
return {
|
|
100
|
-
label: "disabled",
|
|
101
|
-
tone: "muted"
|
|
102
|
-
};
|
|
103
|
-
default:
|
|
104
|
-
return {
|
|
105
|
-
label: status || "unknown",
|
|
106
|
-
tone: "muted"
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
const StatRow = props => {
|
|
111
|
-
const fg = createMemo(() => {
|
|
112
|
-
switch (props.tone) {
|
|
113
|
-
case "ok":
|
|
114
|
-
return props.theme.success ?? props.theme.accent;
|
|
115
|
-
case "warn":
|
|
116
|
-
return props.theme.warning;
|
|
117
|
-
case "err":
|
|
118
|
-
return props.theme.error;
|
|
119
|
-
case "muted":
|
|
120
|
-
return props.theme.textMuted;
|
|
121
|
-
case "accent":
|
|
122
|
-
return props.theme.accent;
|
|
123
|
-
default:
|
|
124
|
-
return props.theme.text;
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
return (() => {
|
|
128
|
-
var _el$ = _$createElement("box"),
|
|
129
|
-
_el$2 = _$createElement("text"),
|
|
130
|
-
_el$3 = _$createElement("text"),
|
|
131
|
-
_el$4 = _$createElement("b");
|
|
132
|
-
_$insertNode(_el$, _el$2);
|
|
133
|
-
_$insertNode(_el$, _el$3);
|
|
134
|
-
_$setProp(_el$, "width", "100%");
|
|
135
|
-
_$setProp(_el$, "flexDirection", "row");
|
|
136
|
-
_$setProp(_el$, "justifyContent", "space-between");
|
|
137
|
-
_$insert(_el$2, () => props.label);
|
|
138
|
-
_$insertNode(_el$3, _el$4);
|
|
139
|
-
_$insert(_el$4, () => props.value);
|
|
140
|
-
_$effect(_p$ => {
|
|
141
|
-
var _v$ = props.theme.textMuted,
|
|
142
|
-
_v$2 = fg();
|
|
143
|
-
_v$ !== _p$.e && (_p$.e = _$setProp(_el$2, "fg", _v$, _p$.e));
|
|
144
|
-
_v$2 !== _p$.t && (_p$.t = _$setProp(_el$3, "fg", _v$2, _p$.t));
|
|
145
|
-
return _p$;
|
|
146
|
-
}, {
|
|
147
|
-
e: undefined,
|
|
148
|
-
t: undefined
|
|
149
|
-
});
|
|
150
|
-
return _el$;
|
|
151
|
-
})();
|
|
152
|
-
};
|
|
153
|
-
const SectionHeader = props => (() => {
|
|
154
|
-
var _el$5 = _$createElement("box"),
|
|
155
|
-
_el$6 = _$createElement("text"),
|
|
156
|
-
_el$7 = _$createElement("b");
|
|
157
|
-
_$insertNode(_el$5, _el$6);
|
|
158
|
-
_$setProp(_el$5, "width", "100%");
|
|
159
|
-
_$insertNode(_el$6, _el$7);
|
|
160
|
-
_$insert(_el$7, () => props.title);
|
|
161
|
-
_$effect(_p$ => {
|
|
162
|
-
var _v$3 = props.marginTop ?? 1,
|
|
163
|
-
_v$4 = props.theme.text;
|
|
164
|
-
_v$3 !== _p$.e && (_p$.e = _$setProp(_el$5, "marginTop", _v$3, _p$.e));
|
|
165
|
-
_v$4 !== _p$.t && (_p$.t = _$setProp(_el$6, "fg", _v$4, _p$.t));
|
|
166
|
-
return _p$;
|
|
167
|
-
}, {
|
|
168
|
-
e: undefined,
|
|
169
|
-
t: undefined
|
|
170
|
-
});
|
|
171
|
-
return _el$5;
|
|
172
|
-
})();
|
|
173
|
-
|
|
174
|
-
// Map a status tone to a theme color — used for the collapsed-view status dots.
|
|
175
|
-
function toneColor(theme, tone) {
|
|
176
|
-
switch (tone) {
|
|
177
|
-
case "ok":
|
|
178
|
-
return theme.success ?? theme.accent;
|
|
179
|
-
case "warn":
|
|
180
|
-
return theme.warning;
|
|
181
|
-
case "err":
|
|
182
|
-
return theme.error;
|
|
183
|
-
default:
|
|
184
|
-
return theme.textMuted;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
16
|
+
import { computeEffectiveOrder, DEFAULT_SLOT_ORDER, PLUGIN_KEY, readTuiPreferencesFile } from "./preferences";
|
|
17
|
+
import { AftSidebarPanel, createSidebarPreferences } from "./sidebar-view";
|
|
187
18
|
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
_$setProp(_el$8, "width", "100%");
|
|
195
|
-
_$setProp(_el$8, "flexDirection", "row");
|
|
196
|
-
_$setProp(_el$8, "justifyContent", "space-between");
|
|
197
|
-
_$insert(_el$9, () => props.label);
|
|
198
|
-
_$insert(_el$8, () => props.children, null);
|
|
199
|
-
_$effect(_$p => _$setProp(_el$9, "fg", props.theme.textMuted, _$p));
|
|
200
|
-
return _el$8;
|
|
201
|
-
})();
|
|
19
|
+
// The panel itself lives in ./sidebar-view, so the newer host's entry
|
|
20
|
+
// (./v2.tsx) renders exactly the same components. These re-exports keep this
|
|
21
|
+
// module the import site it has always been for callers that only want the
|
|
22
|
+
// formatting helpers.
|
|
23
|
+
export { collapsedCompressionValue, collapsedHealthLights, degradedReasonLabel, formatCompressionSidebarRows } from "./sidebar-view";
|
|
24
|
+
const REFRESH_DEBOUNCE_MS = 200;
|
|
202
25
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const {
|
|
211
|
-
savings_tokens,
|
|
212
|
-
original_tokens
|
|
213
|
-
} = compression.project;
|
|
214
|
-
const pct = original_tokens > 0 ? Math.round(savings_tokens / original_tokens * 100) : 0;
|
|
215
|
-
return `${formatCount(savings_tokens)} / ${pct}%`;
|
|
216
|
-
}
|
|
217
|
-
// Degraded-mode reason → human-readable hint. Distinct strings per reason
|
|
218
|
-
// because the UX direction is different: "home_root" tells the user to open a
|
|
219
|
-
// real project subdirectory, "search_too_many_files" tells them the tree is too
|
|
220
|
-
// big for full indexing, and "watcher_unavailable" is an honest soft
|
|
221
|
-
// degradation (AFT continues without live external-change invalidation).
|
|
222
|
-
export function degradedReasonLabel(reason) {
|
|
223
|
-
if (reason === "home_root") {
|
|
224
|
-
return "project root is your home directory";
|
|
225
|
-
}
|
|
226
|
-
if (reason.startsWith("search_too_many_files:")) {
|
|
227
|
-
const threshold = reason.split(":")[1] ?? "20000";
|
|
228
|
-
return `project exceeds ${threshold} files`;
|
|
229
|
-
}
|
|
230
|
-
if (reason === "watcher_unavailable") {
|
|
231
|
-
return "file watcher unavailable; continuing without live external-change invalidation";
|
|
232
|
-
}
|
|
233
|
-
return reason; // unknown reason — surface verbatim so users can grep logs
|
|
234
|
-
}
|
|
235
|
-
// Missing categories are intentionally muted: a green light requires an
|
|
236
|
-
// explicit zero for every category that feeds that light.
|
|
237
|
-
export function collapsedHealthLights(statusBar) {
|
|
238
|
-
if (!statusBar) return null;
|
|
239
|
-
const diagnostics = statusBar.errors !== undefined && statusBar.errors > 0 ? "err" : statusBar.warnings !== undefined && statusBar.warnings > 0 ? "warn" : statusBar.errors === 0 && statusBar.warnings === 0 ? "ok" : "muted";
|
|
240
|
-
const codeValues = [statusBar.dead_code, statusBar.unused_exports, statusBar.duplicates];
|
|
241
|
-
const code = codeValues.some(value => value !== undefined && value > 0) ? "warn" : codeValues.every(value => value === 0) ? "ok" : "muted";
|
|
242
|
-
const todos = statusBar.todos === undefined ? "muted" : statusBar.todos > 0 ? "warn" : "ok";
|
|
26
|
+
/**
|
|
27
|
+
* Slot-plugin theme → the panel's palette. The host this file serves publishes
|
|
28
|
+
* one flat colour per role (`theme.success`, `theme.textMuted`, ...), so the
|
|
29
|
+
* mapping is a rename; `success` keeps its historical fall back to the accent
|
|
30
|
+
* for themes that never defined it.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveV1Palette(theme) {
|
|
243
33
|
return {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
34
|
+
text: theme.text,
|
|
35
|
+
textMuted: theme.textMuted,
|
|
36
|
+
success: theme.success ?? theme.accent,
|
|
37
|
+
warning: theme.warning,
|
|
38
|
+
error: theme.error,
|
|
39
|
+
accent: theme.accent,
|
|
40
|
+
background: theme.background,
|
|
41
|
+
border: theme.borderActive
|
|
247
42
|
};
|
|
248
43
|
}
|
|
249
44
|
|
|
@@ -327,8 +122,7 @@ export function isSnapshotForContext(snapshot, directory, servedDirectory) {
|
|
|
327
122
|
}
|
|
328
123
|
const SidebarContent = props => {
|
|
329
124
|
const [status, setStatus] = createSignal(null);
|
|
330
|
-
const
|
|
331
|
-
const [collapsed, setCollapsed] = createSignal(seedCollapsedFromPrefs(DEFAULT_PREFS));
|
|
125
|
+
const preferences = createSidebarPreferences(() => requestRender());
|
|
332
126
|
let inflight = null;
|
|
333
127
|
let generation = 0;
|
|
334
128
|
const currentDirectory = () => props.api.state.path.directory ?? "";
|
|
@@ -435,19 +229,7 @@ const SidebarContent = props => {
|
|
|
435
229
|
};
|
|
436
230
|
const statusDebouncer = createDebouncedStatusRefresh(refresh, REFRESH_DEBOUNCE_MS);
|
|
437
231
|
const scheduleRefresh = () => statusDebouncer.schedule();
|
|
438
|
-
const reloadPrefs = async () => {
|
|
439
|
-
const root = await readTuiPreferencesFile();
|
|
440
|
-
const next = resolveAftPrefs(root);
|
|
441
|
-
setPrefs(next);
|
|
442
|
-
setCollapsed(seedCollapsedFromPrefs(next));
|
|
443
|
-
requestRender();
|
|
444
|
-
};
|
|
445
|
-
void reloadPrefs();
|
|
446
|
-
const unwatchPrefs = watchTuiPreferences(() => {
|
|
447
|
-
void reloadPrefs();
|
|
448
|
-
});
|
|
449
232
|
onCleanup(() => {
|
|
450
|
-
unwatchPrefs();
|
|
451
233
|
generation++;
|
|
452
234
|
abortInflight();
|
|
453
235
|
statusDebouncer.dispose();
|
|
@@ -477,456 +259,26 @@ const SidebarContent = props => {
|
|
|
477
259
|
defer: false
|
|
478
260
|
}));
|
|
479
261
|
const s = () => scopedSidebarSnapshot(status(), currentDirectory(), props.sessionID());
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
};
|
|
501
|
-
const semanticRefreshing = () => formatSemanticRefreshing(s()?.semantic_index?.refreshing_count ?? 0);
|
|
502
|
-
const trigramBytes = () => s()?.disk?.trigram_disk_bytes ?? 0;
|
|
503
|
-
const semanticBytes = () => s()?.disk?.semantic_disk_bytes ?? 0;
|
|
504
|
-
const compressionRows = () => formatCompressionSidebarRows(s()?.compression);
|
|
505
|
-
const statusBar = () => s()?.status_bar;
|
|
506
|
-
const degradedSummary = () => {
|
|
507
|
-
const snap = s();
|
|
508
|
-
if (!snap?.degraded) return null;
|
|
509
|
-
const reasons = snap.degraded_reasons ?? [];
|
|
510
|
-
if (reasons.length === 0) return null;
|
|
511
|
-
return reasons.map(degradedReasonLabel).join("; ");
|
|
512
|
-
};
|
|
513
|
-
|
|
514
|
-
// Worktree borrow is a shared-index arrangement, not a degraded_reasons
|
|
515
|
-
// entry. Keep this muted and separate from the DEGRADED badge above.
|
|
516
|
-
const worktreeNote = () => worktreeCacheRoleNote(s()?.cache_role);
|
|
517
|
-
return (() => {
|
|
518
|
-
var _el$0 = _$createElement("box"),
|
|
519
|
-
_el$1 = _$createElement("box"),
|
|
520
|
-
_el$10 = _$createElement("box"),
|
|
521
|
-
_el$11 = _$createElement("box"),
|
|
522
|
-
_el$12 = _$createElement("text"),
|
|
523
|
-
_el$13 = _$createElement("b");
|
|
524
|
-
_$insertNode(_el$0, _el$1);
|
|
525
|
-
_$setProp(_el$0, "width", "100%");
|
|
526
|
-
_$setProp(_el$0, "flexDirection", "column");
|
|
527
|
-
_$setProp(_el$0, "border", SINGLE_BORDER);
|
|
528
|
-
_$setProp(_el$0, "paddingTop", 1);
|
|
529
|
-
_$setProp(_el$0, "paddingBottom", 1);
|
|
530
|
-
_$setProp(_el$0, "paddingLeft", 1);
|
|
531
|
-
_$setProp(_el$0, "paddingRight", 1);
|
|
532
|
-
_$insertNode(_el$1, _el$10);
|
|
533
|
-
_$setProp(_el$1, "flexDirection", "row");
|
|
534
|
-
_$setProp(_el$1, "justifyContent", "space-between");
|
|
535
|
-
_$setProp(_el$1, "alignItems", "center");
|
|
536
|
-
_$setProp(_el$1, "onMouseDown", () => {
|
|
537
|
-
if (notInitialized()) return;
|
|
538
|
-
setCollapsed(x => {
|
|
539
|
-
const next = !x;
|
|
540
|
-
persistCollapsedIfEnabled(prefs(), next);
|
|
541
|
-
return next;
|
|
542
|
-
});
|
|
543
|
-
});
|
|
544
|
-
_$insertNode(_el$10, _el$11);
|
|
545
|
-
_$setProp(_el$10, "flexDirection", "row");
|
|
546
|
-
_$setProp(_el$10, "alignItems", "center");
|
|
547
|
-
_$insertNode(_el$11, _el$12);
|
|
548
|
-
_$setProp(_el$11, "paddingLeft", 1);
|
|
549
|
-
_$setProp(_el$11, "paddingRight", 1);
|
|
550
|
-
_$insertNode(_el$12, _el$13);
|
|
551
|
-
_$insert(_el$13, (() => {
|
|
552
|
-
var _c$ = _$memo(() => !!notInitialized());
|
|
553
|
-
return () => _c$() ? "" : collapsed() ? "▶ " : "▼ ";
|
|
554
|
-
})(), null);
|
|
555
|
-
_$insert(_el$13, () => prefs().header.label, null);
|
|
556
|
-
_$insert(_el$10, (() => {
|
|
557
|
-
var _c$2 = _$memo(() => !!s()?.degraded);
|
|
558
|
-
return () => _c$2() && (() => {
|
|
559
|
-
var _el$14 = _$createElement("box"),
|
|
560
|
-
_el$15 = _$createElement("text"),
|
|
561
|
-
_el$16 = _$createElement("b");
|
|
562
|
-
_$insertNode(_el$14, _el$15);
|
|
563
|
-
_$setProp(_el$14, "paddingLeft", 1);
|
|
564
|
-
_$setProp(_el$14, "paddingRight", 1);
|
|
565
|
-
_$setProp(_el$14, "marginLeft", 1);
|
|
566
|
-
_$insertNode(_el$15, _el$16);
|
|
567
|
-
_$insertNode(_el$16, _$createTextNode(`DEGRADED`));
|
|
568
|
-
_$effect(_p$ => {
|
|
569
|
-
var _v$8 = props.theme.warning,
|
|
570
|
-
_v$9 = badgeTextColor(props.theme.warning, props.theme.background);
|
|
571
|
-
_v$8 !== _p$.e && (_p$.e = _$setProp(_el$14, "backgroundColor", _v$8, _p$.e));
|
|
572
|
-
_v$9 !== _p$.t && (_p$.t = _$setProp(_el$15, "fg", _v$9, _p$.t));
|
|
573
|
-
return _p$;
|
|
574
|
-
}, {
|
|
575
|
-
e: undefined,
|
|
576
|
-
t: undefined
|
|
577
|
-
});
|
|
578
|
-
return _el$14;
|
|
579
|
-
})();
|
|
580
|
-
})(), null);
|
|
581
|
-
_$insert(_el$1, (() => {
|
|
582
|
-
var _c$3 = _$memo(() => !!(!notInitialized() && prefs().header.showVersion));
|
|
583
|
-
return () => _c$3() && (() => {
|
|
584
|
-
var _el$18 = _$createElement("text"),
|
|
585
|
-
_el$19 = _$createTextNode(`v`);
|
|
586
|
-
_$insertNode(_el$18, _el$19);
|
|
587
|
-
_$insert(_el$18, () => s()?.version ?? props.pluginVersion, null);
|
|
588
|
-
_$effect(_$p => _$setProp(_el$18, "fg", props.theme.textMuted, _$p));
|
|
589
|
-
return _el$18;
|
|
590
|
-
})();
|
|
591
|
-
})(), null);
|
|
592
|
-
_$insert(_el$0, (() => {
|
|
593
|
-
var _c$4 = _$memo(() => !!(s()?.degraded && degradedSummary()));
|
|
594
|
-
return () => _c$4() && (() => {
|
|
595
|
-
var _el$20 = _$createElement("box"),
|
|
596
|
-
_el$21 = _$createElement("text"),
|
|
597
|
-
_el$22 = _$createTextNode(`⚠ `);
|
|
598
|
-
_$insertNode(_el$20, _el$21);
|
|
599
|
-
_$setProp(_el$20, "marginTop", 1);
|
|
600
|
-
_$setProp(_el$20, "width", "100%");
|
|
601
|
-
_$insertNode(_el$21, _el$22);
|
|
602
|
-
_$insert(_el$21, degradedSummary, null);
|
|
603
|
-
_$effect(_$p => _$setProp(_el$21, "fg", props.theme.warning, _$p));
|
|
604
|
-
return _el$20;
|
|
605
|
-
})();
|
|
606
|
-
})(), null);
|
|
607
|
-
_$insert(_el$0, (() => {
|
|
608
|
-
var _c$5 = _$memo(() => !!(!notInitialized() && worktreeNote()));
|
|
609
|
-
return () => _c$5() && (() => {
|
|
610
|
-
var _el$23 = _$createElement("box"),
|
|
611
|
-
_el$24 = _$createElement("text");
|
|
612
|
-
_$insertNode(_el$23, _el$24);
|
|
613
|
-
_$setProp(_el$23, "marginTop", 1);
|
|
614
|
-
_$setProp(_el$23, "width", "100%");
|
|
615
|
-
_$insert(_el$24, worktreeNote);
|
|
616
|
-
_$effect(_$p => _$setProp(_el$24, "fg", props.theme.textMuted, _$p));
|
|
617
|
-
return _el$23;
|
|
618
|
-
})();
|
|
619
|
-
})(), null);
|
|
620
|
-
_$insert(_el$0, (() => {
|
|
621
|
-
var _c$6 = _$memo(() => !!notInitialized());
|
|
622
|
-
return () => _c$6() && (() => {
|
|
623
|
-
var _el$25 = _$createElement("box"),
|
|
624
|
-
_el$26 = _$createElement("text");
|
|
625
|
-
_$insertNode(_el$25, _el$26);
|
|
626
|
-
_$setProp(_el$25, "marginTop", 1);
|
|
627
|
-
_$setProp(_el$25, "width", "100%");
|
|
628
|
-
_$insert(_el$26, () => s().message || "AFT bridge is now spawned lazily, information here will be populated after first tool call.");
|
|
629
|
-
_$effect(_$p => _$setProp(_el$26, "fg", props.theme.textMuted, _$p));
|
|
630
|
-
return _el$25;
|
|
631
|
-
})();
|
|
632
|
-
})(), null);
|
|
633
|
-
_$insert(_el$0, (() => {
|
|
634
|
-
var _c$7 = _$memo(() => !!(!notInitialized() && collapsed()));
|
|
635
|
-
return () => _c$7() && (() => {
|
|
636
|
-
var _el$27 = _$createElement("box");
|
|
637
|
-
_$setProp(_el$27, "width", "100%");
|
|
638
|
-
_$setProp(_el$27, "flexDirection", "column");
|
|
639
|
-
_$insert(_el$27, (() => {
|
|
640
|
-
var _c$9 = _$memo(() => !!prefs().sections.searchIndex);
|
|
641
|
-
return () => _c$9() && _$createComponent(CollapsedRow, {
|
|
642
|
-
get theme() {
|
|
643
|
-
return props.theme;
|
|
644
|
-
},
|
|
645
|
-
label: "Search Index",
|
|
646
|
-
get children() {
|
|
647
|
-
var _el$28 = _$createElement("text");
|
|
648
|
-
_$insertNode(_el$28, _$createTextNode(`●`));
|
|
649
|
-
_$effect(_$p => _$setProp(_el$28, "fg", toneColor(props.theme, searchStatus().tone), _$p));
|
|
650
|
-
return _el$28;
|
|
651
|
-
}
|
|
652
|
-
});
|
|
653
|
-
})(), null);
|
|
654
|
-
_$insert(_el$27, (() => {
|
|
655
|
-
var _c$0 = _$memo(() => !!prefs().sections.semanticIndex);
|
|
656
|
-
return () => _c$0() && _$createComponent(CollapsedRow, {
|
|
657
|
-
get theme() {
|
|
658
|
-
return props.theme;
|
|
659
|
-
},
|
|
660
|
-
label: "Semantic Index",
|
|
661
|
-
get children() {
|
|
662
|
-
var _el$30 = _$createElement("text");
|
|
663
|
-
_$insertNode(_el$30, _$createTextNode(`●`));
|
|
664
|
-
_$effect(_$p => _$setProp(_el$30, "fg", toneColor(props.theme, semanticStatus().tone), _$p));
|
|
665
|
-
return _el$30;
|
|
666
|
-
}
|
|
667
|
-
});
|
|
668
|
-
})(), null);
|
|
669
|
-
_$insert(_el$27, (() => {
|
|
670
|
-
var _c$1 = _$memo(() => !!(prefs().sections.codeHealth && collapsedHealthLights(statusBar())));
|
|
671
|
-
return () => _c$1() && _$createComponent(CollapsedRow, {
|
|
672
|
-
get theme() {
|
|
673
|
-
return props.theme;
|
|
674
|
-
},
|
|
675
|
-
label: "Code Health",
|
|
676
|
-
get children() {
|
|
677
|
-
var _el$32 = _$createElement("box"),
|
|
678
|
-
_el$33 = _$createElement("text"),
|
|
679
|
-
_el$35 = _$createElement("text"),
|
|
680
|
-
_el$37 = _$createElement("text");
|
|
681
|
-
_$insertNode(_el$32, _el$33);
|
|
682
|
-
_$insertNode(_el$32, _el$35);
|
|
683
|
-
_$insertNode(_el$32, _el$37);
|
|
684
|
-
_$setProp(_el$32, "flexDirection", "row");
|
|
685
|
-
_$setProp(_el$32, "gap", 1);
|
|
686
|
-
_$insertNode(_el$33, _$createTextNode(`●`));
|
|
687
|
-
_$insertNode(_el$35, _$createTextNode(`●`));
|
|
688
|
-
_$insertNode(_el$37, _$createTextNode(`●`));
|
|
689
|
-
_$effect(_p$ => {
|
|
690
|
-
var _v$0 = toneColor(props.theme, collapsedHealthLights(statusBar()).diagnostics),
|
|
691
|
-
_v$1 = toneColor(props.theme, collapsedHealthLights(statusBar()).code),
|
|
692
|
-
_v$10 = toneColor(props.theme, collapsedHealthLights(statusBar()).todos);
|
|
693
|
-
_v$0 !== _p$.e && (_p$.e = _$setProp(_el$33, "fg", _v$0, _p$.e));
|
|
694
|
-
_v$1 !== _p$.t && (_p$.t = _$setProp(_el$35, "fg", _v$1, _p$.t));
|
|
695
|
-
_v$10 !== _p$.a && (_p$.a = _$setProp(_el$37, "fg", _v$10, _p$.a));
|
|
696
|
-
return _p$;
|
|
697
|
-
}, {
|
|
698
|
-
e: undefined,
|
|
699
|
-
t: undefined,
|
|
700
|
-
a: undefined
|
|
701
|
-
});
|
|
702
|
-
return _el$32;
|
|
703
|
-
}
|
|
704
|
-
});
|
|
705
|
-
})(), null);
|
|
706
|
-
_$insert(_el$27, (() => {
|
|
707
|
-
var _c$10 = _$memo(() => !!(prefs().sections.compression && collapsedCompressionValue(s()?.compression)));
|
|
708
|
-
return () => _c$10() && _$createComponent(CollapsedRow, {
|
|
709
|
-
get theme() {
|
|
710
|
-
return props.theme;
|
|
711
|
-
},
|
|
712
|
-
label: "Compression",
|
|
713
|
-
get children() {
|
|
714
|
-
var _el$39 = _$createElement("text"),
|
|
715
|
-
_el$40 = _$createElement("b");
|
|
716
|
-
_$insertNode(_el$39, _el$40);
|
|
717
|
-
_$insert(_el$40, () => collapsedCompressionValue(s()?.compression));
|
|
718
|
-
_$effect(_$p => _$setProp(_el$39, "fg", props.theme.textMuted, _$p));
|
|
719
|
-
return _el$39;
|
|
720
|
-
}
|
|
721
|
-
});
|
|
722
|
-
})(), null);
|
|
723
|
-
return _el$27;
|
|
724
|
-
})();
|
|
725
|
-
})(), null);
|
|
726
|
-
_$insert(_el$0, (() => {
|
|
727
|
-
var _c$8 = _$memo(() => !!(!notInitialized() && !collapsed()));
|
|
728
|
-
return () => _c$8() && [_$memo(() => _$memo(() => !!prefs().sections.searchIndex)() && [_$createComponent(SectionHeader, {
|
|
729
|
-
get theme() {
|
|
730
|
-
return props.theme;
|
|
731
|
-
},
|
|
732
|
-
title: "Search Index"
|
|
733
|
-
}), _$createComponent(StatRow, {
|
|
734
|
-
get theme() {
|
|
735
|
-
return props.theme;
|
|
736
|
-
},
|
|
737
|
-
label: "Status",
|
|
738
|
-
get value() {
|
|
739
|
-
return searchStatus().label;
|
|
740
|
-
},
|
|
741
|
-
get tone() {
|
|
742
|
-
return searchStatus().tone;
|
|
743
|
-
}
|
|
744
|
-
}), _$memo(() => _$memo(() => (s()?.search_index?.files ?? null) != null)() && _$createComponent(StatRow, {
|
|
745
|
-
get theme() {
|
|
746
|
-
return props.theme;
|
|
747
|
-
},
|
|
748
|
-
label: "Files",
|
|
749
|
-
get value() {
|
|
750
|
-
return formatCount(s().search_index.files);
|
|
751
|
-
},
|
|
752
|
-
tone: "muted"
|
|
753
|
-
})), _$createComponent(StatRow, {
|
|
754
|
-
get theme() {
|
|
755
|
-
return props.theme;
|
|
756
|
-
},
|
|
757
|
-
label: "Disk",
|
|
758
|
-
get value() {
|
|
759
|
-
return formatBytes(trigramBytes());
|
|
760
|
-
},
|
|
761
|
-
tone: "muted"
|
|
762
|
-
})]), _$memo(() => _$memo(() => !!prefs().sections.semanticIndex)() && [_$createComponent(SectionHeader, {
|
|
763
|
-
get theme() {
|
|
764
|
-
return props.theme;
|
|
765
|
-
},
|
|
766
|
-
title: "Semantic Index"
|
|
767
|
-
}), _$createComponent(StatRow, {
|
|
768
|
-
get theme() {
|
|
769
|
-
return props.theme;
|
|
770
|
-
},
|
|
771
|
-
label: "Status",
|
|
772
|
-
get value() {
|
|
773
|
-
return semanticStatus().label;
|
|
774
|
-
},
|
|
775
|
-
get tone() {
|
|
776
|
-
return semanticStatus().tone;
|
|
777
|
-
}
|
|
778
|
-
}), _$memo(() => _$memo(() => !!semanticRefreshing())() && (() => {
|
|
779
|
-
var _el$41 = _$createElement("box"),
|
|
780
|
-
_el$42 = _$createElement("text");
|
|
781
|
-
_$insertNode(_el$41, _el$42);
|
|
782
|
-
_$setProp(_el$41, "width", "100%");
|
|
783
|
-
_$insert(_el$42, semanticRefreshing);
|
|
784
|
-
_$effect(_$p => _$setProp(_el$42, "fg", props.theme.textMuted, _$p));
|
|
785
|
-
return _el$41;
|
|
786
|
-
})()), _$memo(() => _$memo(() => !!(s()?.semantic_index?.status === "loading" && s()?.semantic_index?.entries_total != null && s().semantic_index.entries_total > 0))() && _$createComponent(StatRow, {
|
|
787
|
-
get theme() {
|
|
788
|
-
return props.theme;
|
|
789
|
-
},
|
|
790
|
-
label: "Progress",
|
|
791
|
-
get value() {
|
|
792
|
-
return `${formatCount(s().semantic_index.entries_done)} / ${formatCount(s().semantic_index.entries_total)}`;
|
|
793
|
-
},
|
|
794
|
-
tone: "warn"
|
|
795
|
-
})), _$memo(() => _$memo(() => (s()?.semantic_index?.entries ?? null) != null)() && _$createComponent(StatRow, {
|
|
796
|
-
get theme() {
|
|
797
|
-
return props.theme;
|
|
798
|
-
},
|
|
799
|
-
label: "Entries",
|
|
800
|
-
get value() {
|
|
801
|
-
return formatCount(s().semantic_index.entries);
|
|
802
|
-
},
|
|
803
|
-
tone: "muted"
|
|
804
|
-
})), _$createComponent(StatRow, {
|
|
805
|
-
get theme() {
|
|
806
|
-
return props.theme;
|
|
807
|
-
},
|
|
808
|
-
label: "Disk",
|
|
809
|
-
get value() {
|
|
810
|
-
return formatBytes(semanticBytes());
|
|
811
|
-
},
|
|
812
|
-
tone: "muted"
|
|
813
|
-
})]), _$memo(() => _$memo(() => !!(prefs().sections.codeHealth && statusBar()))() && [_$createComponent(SectionHeader, {
|
|
814
|
-
get theme() {
|
|
815
|
-
return props.theme;
|
|
816
|
-
},
|
|
817
|
-
get title() {
|
|
818
|
-
return statusBar().tier2_stale ? "Code Health ~" : "Code Health";
|
|
819
|
-
}
|
|
820
|
-
}), _$memo(() => _$memo(() => statusBar().errors !== undefined)() && _$createComponent(StatRow, {
|
|
821
|
-
get theme() {
|
|
822
|
-
return props.theme;
|
|
823
|
-
},
|
|
824
|
-
label: "Errors",
|
|
825
|
-
get value() {
|
|
826
|
-
return formatCount(statusBar().errors);
|
|
827
|
-
},
|
|
828
|
-
get tone() {
|
|
829
|
-
return statusBar().errors > 0 ? "err" : "muted";
|
|
830
|
-
}
|
|
831
|
-
})), _$memo(() => _$memo(() => statusBar().warnings !== undefined)() && _$createComponent(StatRow, {
|
|
832
|
-
get theme() {
|
|
833
|
-
return props.theme;
|
|
834
|
-
},
|
|
835
|
-
label: "Warnings",
|
|
836
|
-
get value() {
|
|
837
|
-
return formatCount(statusBar().warnings);
|
|
838
|
-
},
|
|
839
|
-
get tone() {
|
|
840
|
-
return statusBar().warnings > 0 ? "warn" : "muted";
|
|
841
|
-
}
|
|
842
|
-
})), _$memo(() => _$memo(() => statusBar().dead_code !== undefined)() && _$createComponent(StatRow, {
|
|
843
|
-
get theme() {
|
|
844
|
-
return props.theme;
|
|
845
|
-
},
|
|
846
|
-
label: "Dead Code",
|
|
847
|
-
get value() {
|
|
848
|
-
return formatCount(statusBar().dead_code);
|
|
849
|
-
},
|
|
850
|
-
tone: "muted"
|
|
851
|
-
})), _$memo(() => _$memo(() => statusBar().unused_exports !== undefined)() && _$createComponent(StatRow, {
|
|
852
|
-
get theme() {
|
|
853
|
-
return props.theme;
|
|
854
|
-
},
|
|
855
|
-
label: "Unused Exports",
|
|
856
|
-
get value() {
|
|
857
|
-
return formatCount(statusBar().unused_exports);
|
|
858
|
-
},
|
|
859
|
-
tone: "muted"
|
|
860
|
-
})), _$memo(() => _$memo(() => statusBar().duplicates !== undefined)() && _$createComponent(StatRow, {
|
|
861
|
-
get theme() {
|
|
862
|
-
return props.theme;
|
|
863
|
-
},
|
|
864
|
-
label: "Duplicates",
|
|
865
|
-
get value() {
|
|
866
|
-
return formatCount(statusBar().duplicates);
|
|
867
|
-
},
|
|
868
|
-
tone: "muted"
|
|
869
|
-
})), _$memo(() => _$memo(() => statusBar().todos !== undefined)() && _$createComponent(StatRow, {
|
|
870
|
-
get theme() {
|
|
871
|
-
return props.theme;
|
|
872
|
-
},
|
|
873
|
-
label: "TODOs",
|
|
874
|
-
get value() {
|
|
875
|
-
return formatCount(statusBar().todos);
|
|
876
|
-
},
|
|
877
|
-
tone: "muted"
|
|
878
|
-
}))]), _$memo(() => _$memo(() => !!(prefs().sections.compression && compressionRows().length > 0))() && [_$createComponent(SectionHeader, {
|
|
879
|
-
get theme() {
|
|
880
|
-
return props.theme;
|
|
881
|
-
},
|
|
882
|
-
title: "Compression"
|
|
883
|
-
}), _$memo(() => compressionRows().map(row => row.kind === "scope" ? (() => {
|
|
884
|
-
var _el$43 = _$createElement("box"),
|
|
885
|
-
_el$44 = _$createElement("text");
|
|
886
|
-
_$insertNode(_el$43, _el$44);
|
|
887
|
-
_$setProp(_el$43, "width", "100%");
|
|
888
|
-
_$insert(_el$44, () => row.label);
|
|
889
|
-
_$effect(_$p => _$setProp(_el$44, "fg", props.theme.text, _$p));
|
|
890
|
-
return _el$43;
|
|
891
|
-
})() : _$createComponent(StatRow, {
|
|
892
|
-
get theme() {
|
|
893
|
-
return props.theme;
|
|
894
|
-
},
|
|
895
|
-
get label() {
|
|
896
|
-
return row.label;
|
|
897
|
-
},
|
|
898
|
-
get value() {
|
|
899
|
-
return row.value;
|
|
900
|
-
},
|
|
901
|
-
tone: "muted"
|
|
902
|
-
})))]), _$memo(() => _$memo(() => !!(s()?.semantic_index?.status === "failed" && s()?.semantic_index?.error))() && (() => {
|
|
903
|
-
var _el$45 = _$createElement("box"),
|
|
904
|
-
_el$46 = _$createElement("text"),
|
|
905
|
-
_el$47 = _$createTextNode(`⚠ `);
|
|
906
|
-
_$insertNode(_el$45, _el$46);
|
|
907
|
-
_$setProp(_el$45, "marginTop", 1);
|
|
908
|
-
_$setProp(_el$45, "width", "100%");
|
|
909
|
-
_$insertNode(_el$46, _el$47);
|
|
910
|
-
_$insert(_el$46, () => s().semantic_index.error, null);
|
|
911
|
-
_$effect(_$p => _$setProp(_el$46, "fg", props.theme.error, _$p));
|
|
912
|
-
return _el$45;
|
|
913
|
-
})())];
|
|
914
|
-
})(), null);
|
|
915
|
-
_$effect(_p$ => {
|
|
916
|
-
var _v$5 = props.theme.borderActive,
|
|
917
|
-
_v$6 = props.theme.accent,
|
|
918
|
-
_v$7 = badgeTextColor(props.theme.accent, props.theme.background);
|
|
919
|
-
_v$5 !== _p$.e && (_p$.e = _$setProp(_el$0, "borderColor", _v$5, _p$.e));
|
|
920
|
-
_v$6 !== _p$.t && (_p$.t = _$setProp(_el$11, "backgroundColor", _v$6, _p$.t));
|
|
921
|
-
_v$7 !== _p$.a && (_p$.a = _$setProp(_el$12, "fg", _v$7, _p$.a));
|
|
922
|
-
return _p$;
|
|
923
|
-
}, {
|
|
924
|
-
e: undefined,
|
|
925
|
-
t: undefined,
|
|
926
|
-
a: undefined
|
|
927
|
-
});
|
|
928
|
-
return _el$0;
|
|
929
|
-
})();
|
|
262
|
+
return _$createComponent(AftSidebarPanel, {
|
|
263
|
+
get palette() {
|
|
264
|
+
return resolveV1Palette(props.theme);
|
|
265
|
+
},
|
|
266
|
+
get snapshot() {
|
|
267
|
+
return s();
|
|
268
|
+
},
|
|
269
|
+
get prefs() {
|
|
270
|
+
return preferences.prefs();
|
|
271
|
+
},
|
|
272
|
+
get collapsed() {
|
|
273
|
+
return preferences.collapsed();
|
|
274
|
+
},
|
|
275
|
+
get onToggleCollapsed() {
|
|
276
|
+
return preferences.toggleCollapsed;
|
|
277
|
+
},
|
|
278
|
+
get pluginVersion() {
|
|
279
|
+
return props.pluginVersion;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
930
282
|
};
|
|
931
283
|
export async function createAftSidebarSlot(api, pluginVersion) {
|
|
932
284
|
const root = await readTuiPreferencesFile();
|