@cortexkit/aft-opencode 0.57.2 → 0.58.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.
Files changed (66) hide show
  1. package/dist/bash-wait-detach.d.ts +14 -5
  2. package/dist/bash-wait-detach.d.ts.map +1 -1
  3. package/dist/bridge-bootstrap.d.ts +199 -0
  4. package/dist/bridge-bootstrap.d.ts.map +1 -0
  5. package/dist/config-error-surface.d.ts +23 -0
  6. package/dist/config-error-surface.d.ts.map +1 -0
  7. package/dist/config-live-reload.d.ts +315 -0
  8. package/dist/config-live-reload.d.ts.map +1 -0
  9. package/dist/config.d.ts +112 -54
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/entry/server.js +10449 -7872
  12. package/dist/hooks/auto-update-checker/checker.d.ts +1 -0
  13. package/dist/hooks/auto-update-checker/checker.d.ts.map +1 -1
  14. package/dist/hooks/auto-update-checker/index.d.ts +6 -0
  15. package/dist/hooks/auto-update-checker/index.d.ts.map +1 -1
  16. package/dist/index.d.ts +3 -2
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +10315 -7815
  19. package/dist/logger.d.ts.map +1 -1
  20. package/dist/lsp-auto-install.d.ts.map +1 -1
  21. package/dist/lsp-npm-table.d.ts +1 -1
  22. package/dist/lsp-npm-table.d.ts.map +1 -1
  23. package/dist/rpc/register.d.ts +7 -1
  24. package/dist/rpc/register.d.ts.map +1 -1
  25. package/dist/shared/read-vision.d.ts +10 -0
  26. package/dist/shared/read-vision.d.ts.map +1 -0
  27. package/dist/shared/status.d.ts +45 -0
  28. package/dist/shared/status.d.ts.map +1 -1
  29. package/dist/shared/subagent-detect.d.ts.map +1 -1
  30. package/dist/shutdown-hooks.d.ts +3 -9
  31. package/dist/shutdown-hooks.d.ts.map +1 -1
  32. package/dist/subc-tool-schemas.d.ts +9 -1
  33. package/dist/subc-tool-schemas.d.ts.map +1 -1
  34. package/dist/tool-perf.d.ts +1 -0
  35. package/dist/tool-perf.d.ts.map +1 -1
  36. package/dist/tool-registration.d.ts +19 -12
  37. package/dist/tool-registration.d.ts.map +1 -1
  38. package/dist/tools/ast.d.ts.map +1 -1
  39. package/dist/tools/bash.d.ts +1 -1
  40. package/dist/tools/bash.d.ts.map +1 -1
  41. package/dist/tools/bash_watch.d.ts +3 -0
  42. package/dist/tools/bash_watch.d.ts.map +1 -1
  43. package/dist/tools/definitions/v2.d.ts.map +1 -1
  44. package/dist/tools/hoisted.d.ts +9 -12
  45. package/dist/tools/hoisted.d.ts.map +1 -1
  46. package/dist/tools/inspect.d.ts +5 -7
  47. package/dist/tools/inspect.d.ts.map +1 -1
  48. package/dist/tools/permissions.d.ts.map +1 -1
  49. package/dist/tools/reading.d.ts.map +1 -1
  50. package/dist/tools/search.d.ts.map +1 -1
  51. package/dist/tui/v2-status.d.ts +1 -1
  52. package/dist/tui/v2-status.d.ts.map +1 -1
  53. package/dist/workflow-hints.d.ts +1 -7
  54. package/dist/workflow-hints.d.ts.map +1 -1
  55. package/package.json +8 -8
  56. package/src/entry/server-runtime.mjs +133 -34
  57. package/src/logger.ts +5 -6
  58. package/src/shared/read-vision.ts +100 -0
  59. package/src/shared/status.ts +83 -4
  60. package/src/shared/subagent-detect.ts +56 -1
  61. package/src/tui/index.tsx +4 -10
  62. package/src/tui/sidebar-view.tsx +36 -15
  63. package/src/tui/v2-status.ts +25 -4
  64. package/src/tui-compiled/index.tsx +3 -3
  65. package/src/tui-compiled/sidebar-view.tsx +168 -126
  66. package/src/tui-compiled/v2-status.ts +25 -4
@@ -14,8 +14,10 @@
14
14
  import { createMemo, createSignal, onCleanup } from "solid-js";
15
15
  import {
16
16
  type AftStatusSnapshot,
17
- formatSemanticIndexStatus,
17
+ degradedHeaderMarker,
18
+ formatSemanticIndexLabel,
18
19
  formatSemanticRefreshing,
20
+ NOT_STARTED_STATUS_TEXT,
19
21
  type StatusBar,
20
22
  type StatusCompression,
21
23
  semanticIndexStatusKind,
@@ -215,10 +217,16 @@ const StatRow = (props: {
215
217
  }
216
218
  });
217
219
 
220
+ // The label never shrinks and the value wraps in the space left beside it:
221
+ // left to flexbox, a long value (a semantic index that is unavailable, with
222
+ // its reason) squeezed the label and drew over it, so "Status" came out as
223
+ // "Statu" followed by the value.
218
224
  return (
219
225
  <box width="100%" flexDirection="row" justifyContent="space-between">
220
- <text fg={props.palette.textMuted}>{props.label}</text>
221
- <text fg={fg()}>
226
+ <text fg={props.palette.textMuted} flexShrink={0}>
227
+ {props.label}
228
+ </text>
229
+ <text fg={fg()} flexShrink={1} marginLeft={1} wrapMode="word">
222
230
  <b>{props.value}</b>
223
231
  </text>
224
232
  </box>
@@ -397,12 +405,15 @@ export const AftSidebarPanel = (props: AftSidebarPanelProps) => {
397
405
  return {
398
406
  ...display,
399
407
  // The error is passed through so a capability failure (a missing ONNX
400
- // Runtime) is named here instead of arriving as a bare status word.
401
- label: formatSemanticIndexStatus(
402
- rawStatus,
403
- s()?.semantic_index?.stage,
404
- s()?.semantic_index?.error,
405
- ),
408
+ // Runtime) is named here instead of arriving as a bare status word, and
409
+ // an unreachable backend carries its URL and reason.
410
+ label: formatSemanticIndexLabel({
411
+ status: rawStatus,
412
+ stage: s()?.semantic_index?.stage,
413
+ error: s()?.semantic_index?.error,
414
+ reason: s()?.semantic_index?.reason,
415
+ backend_url: s()?.semantic_index?.backend_url,
416
+ }),
406
417
  };
407
418
  };
408
419
  const semanticRefreshing = () =>
@@ -459,7 +470,14 @@ export const AftSidebarPanel = (props: AftSidebarPanelProps) => {
459
470
  </b>
460
471
  </text>
461
472
  </box>
462
- {s()?.degraded && (
473
+ {s()?.degraded && degradedHeaderMarker(s()?.degraded_reasons ?? []).calm && (
474
+ <box marginLeft={1}>
475
+ <text fg={props.palette.warning}>
476
+ {degradedHeaderMarker(s()?.degraded_reasons ?? []).text}
477
+ </text>
478
+ </box>
479
+ )}
480
+ {s()?.degraded && !degradedHeaderMarker(s()?.degraded_reasons ?? []).calm && (
463
481
  <box
464
482
  paddingLeft={1}
465
483
  paddingRight={1}
@@ -467,7 +485,7 @@ export const AftSidebarPanel = (props: AftSidebarPanelProps) => {
467
485
  backgroundColor={props.palette.warning}
468
486
  >
469
487
  <text fg={badgeForeground(props.palette.warning, props.palette.background)}>
470
- <b>DEGRADED</b>
488
+ <b>{degradedHeaderMarker(s()?.degraded_reasons ?? []).text}</b>
471
489
  </text>
472
490
  </box>
473
491
  )}
@@ -501,10 +519,13 @@ export const AftSidebarPanel = (props: AftSidebarPanelProps) => {
501
519
  rows so users understand why metrics are blank. */}
502
520
  {notInitialized() && (
503
521
  <box marginTop={1} width="100%">
504
- <text fg={props.palette.textMuted}>
505
- {s()!.message ||
506
- "AFT bridge is now spawned lazily, information here will be populated after first tool call."}
507
- </text>
522
+ {s()!.config_error ? (
523
+ // Config error state: no bridge will ever start in this process,
524
+ // so the placeholder text would mislead; show the error instead.
525
+ <text fg={props.palette.error}>✖ {s()!.message}</text>
526
+ ) : (
527
+ <text fg={props.palette.textMuted}>{s()!.message || NOT_STARTED_STATUS_TEXT}</text>
528
+ )}
508
529
  </box>
509
530
  )}
510
531
 
@@ -1,9 +1,25 @@
1
- import type { AftStatusSnapshot, StatusBar } from "../shared/status";
1
+ import { type AftStatusSnapshot, degradedHeaderMarker, type StatusBar } from "../shared/status";
2
2
 
3
3
  function count(value: number | undefined): string {
4
4
  return value === undefined ? "?" : String(value);
5
5
  }
6
6
 
7
+ /**
8
+ * The errors/warnings part of the footer. With no language server running the
9
+ * counts will never arrive, so the footer says that instead of showing `E? W?`
10
+ * indefinitely.
11
+ */
12
+ function diagnosticsPart(bar: StatusBar): string {
13
+ if (
14
+ bar.errors === undefined &&
15
+ bar.warnings === undefined &&
16
+ bar.diagnostics === "no_language_server"
17
+ ) {
18
+ return "no LSP";
19
+ }
20
+ return `E${count(bar.errors)} W${count(bar.warnings)}`;
21
+ }
22
+
7
23
  /**
8
24
  * The V2 footer segment. "AFT starting…" is only true before the bridge has
9
25
  * delivered a real snapshot. After that the footer shows every health category
@@ -12,11 +28,14 @@ function count(value: number | undefined): string {
12
28
  * can leave the complete `status_bar` missing for the whole session.
13
29
  */
14
30
  export function formatAftStatusSegment(status: AftStatusSnapshot | null): string {
31
+ // The config error state never produces a real snapshot; say so instead of
32
+ // "starting", which would suggest the bridge is on its way.
33
+ if (status?.config_error) return "AFT config error";
15
34
  if (!status || status.cache_role === "not_initialized") return "AFT starting…";
16
35
  const bar: StatusBar = status.status_bar ?? status.status_bar_values ?? {};
17
36
  const stale = bar.tier2_stale ? "~" : "";
18
37
  return (
19
- `AFT E${count(bar.errors)} W${count(bar.warnings)} | ` +
38
+ `AFT ${diagnosticsPart(bar)} | ` +
20
39
  `${stale}D${count(bar.dead_code)} U${count(bar.unused_exports)} ` +
21
40
  `C${count(bar.duplicates)} | T${count(bar.todos)}`
22
41
  );
@@ -33,7 +52,7 @@ function healthSummary(bar: StatusBar | undefined): string {
33
52
  if (!bar) return "health pending";
34
53
  const stale = bar.tier2_stale ? "~" : "";
35
54
  return (
36
- `E${count(bar.errors)} W${count(bar.warnings)} ` +
55
+ `${diagnosticsPart(bar)} ` +
37
56
  `${stale}D${count(bar.dead_code)} U${count(bar.unused_exports)} ` +
38
57
  `C${count(bar.duplicates)} T${count(bar.todos)}`
39
58
  );
@@ -61,7 +80,9 @@ export function summarizeAftSidebar(status: AftStatusSnapshot | null): AftSideba
61
80
  ? `${status.semantic_index.status} (${status.semantic_index.stage})`
62
81
  : status.semantic_index.status;
63
82
  return {
64
- title: status.degraded ? "AFT · DEGRADED" : "AFT",
83
+ title: status.degraded
84
+ ? `AFT · ${degradedHeaderMarker(status.degraded_reasons ?? []).text}`
85
+ : "AFT",
65
86
  version: status.version || undefined,
66
87
  search: status.search_index.status,
67
88
  semantic,
@@ -12,7 +12,7 @@ import { createElement as _$createElement } from "opentui:runtime-module:%40open
12
12
  import { createMemo, createSignal, onCleanup } from "opentui:runtime-module:solid-js";
13
13
  import { version as packageVersion } from "../../package.json";
14
14
  import { AftRpcClient } from "../shared/rpc-client";
15
- import { coerceAftStatus, formatBytes, formatCacheRoleLabel, formatSemanticIndexStatus, formatSemanticRefreshing } from "../shared/status";
15
+ import { coerceAftStatus, formatBytes, formatCacheRoleLabel, formatSemanticIndexLabel, formatSemanticRefreshing, NOT_STARTED_STATUS_TEXT } from "../shared/status";
16
16
  import { createDebouncedStatusRefresh, refreshAftTuiSocketScope, startAftTuiSocket, stopAftTuiSocket, subscribeStatusInvalidations } from "./notification-socket";
17
17
  import { createAftSidebarSlot, formatCompressionSidebarRows, isSnapshotForContext, resolveTuiStorageDir, shouldSuppressUninitializedDowngrade } from "./sidebar";
18
18
  import { setupV2Tui } from "./v2";
@@ -253,7 +253,7 @@ const StatusDialog = props => {
253
253
  _$setProp(_el$14, "width", "100%");
254
254
  _$setProp(_el$14, "marginTop", 1);
255
255
  _$setProp(_el$14, "justifyContent", "center");
256
- _$insert(_el$15, () => status().message || "AFT bridge is now spawned lazily, information here will be populated after first tool call.");
256
+ _$insert(_el$15, () => status().message || NOT_STARTED_STATUS_TEXT);
257
257
  _$effect(_$p => _$setProp(_el$15, "fg", t().textMuted, _$p));
258
258
  return _el$14;
259
259
  })() : null;
@@ -467,7 +467,7 @@ const StatusDialog = props => {
467
467
  },
468
468
  label: "Status",
469
469
  get value() {
470
- return formatSemanticIndexStatus(status().semantic_index.status, status().semantic_index.stage, status().semantic_index.error);
470
+ return formatSemanticIndexLabel(status().semantic_index);
471
471
  },
472
472
  get tone() {
473
473
  return statusTone(status().semantic_index.status);
@@ -20,7 +20,7 @@ import { createElement as _$createElement } from "opentui:runtime-module:%40open
20
20
  // smaller, differently-worded panel, which is exactly what happened before.
21
21
 
22
22
  import { createMemo, createSignal, onCleanup } from "opentui:runtime-module:solid-js";
23
- import { formatSemanticIndexStatus, formatSemanticRefreshing, semanticIndexStatusKind, worktreeCacheRoleNote } from "../shared/status";
23
+ import { degradedHeaderMarker, formatSemanticIndexLabel, formatSemanticRefreshing, NOT_STARTED_STATUS_TEXT, semanticIndexStatusKind, worktreeCacheRoleNote } from "../shared/status";
24
24
  import { badgeTextColor } from "./badge-contrast";
25
25
  import { DEFAULT_PREFS, persistCollapsedIfEnabled, readTuiPreferencesFile, resolveAftPrefs, seedCollapsedFromPrefs, watchTuiPreferences } from "./preferences";
26
26
  const SINGLE_BORDER = {
@@ -197,6 +197,11 @@ const StatRow = props => {
197
197
  return props.palette.text;
198
198
  }
199
199
  });
200
+
201
+ // The label never shrinks and the value wraps in the space left beside it:
202
+ // left to flexbox, a long value (a semantic index that is unavailable, with
203
+ // its reason) squeezed the label and drew over it, so "Status" came out as
204
+ // "Statu" followed by the value.
200
205
  return (() => {
201
206
  var _el$ = _$createElement("box"),
202
207
  _el$2 = _$createElement("text"),
@@ -207,8 +212,12 @@ const StatRow = props => {
207
212
  _$setProp(_el$, "width", "100%");
208
213
  _$setProp(_el$, "flexDirection", "row");
209
214
  _$setProp(_el$, "justifyContent", "space-between");
215
+ _$setProp(_el$2, "flexShrink", 0);
210
216
  _$insert(_el$2, () => props.label);
211
217
  _$insertNode(_el$3, _el$4);
218
+ _$setProp(_el$3, "flexShrink", 1);
219
+ _$setProp(_el$3, "marginLeft", 1);
220
+ _$setProp(_el$3, "wrapMode", "word");
212
221
  _$insert(_el$4, () => props.value);
213
222
  _$effect(_p$ => {
214
223
  var _v$ = props.palette.textMuted,
@@ -383,8 +392,15 @@ export const AftSidebarPanel = props => {
383
392
  return {
384
393
  ...display,
385
394
  // The error is passed through so a capability failure (a missing ONNX
386
- // Runtime) is named here instead of arriving as a bare status word.
387
- label: formatSemanticIndexStatus(rawStatus, s()?.semantic_index?.stage, s()?.semantic_index?.error)
395
+ // Runtime) is named here instead of arriving as a bare status word, and
396
+ // an unreachable backend carries its URL and reason.
397
+ label: formatSemanticIndexLabel({
398
+ status: rawStatus,
399
+ stage: s()?.semantic_index?.stage,
400
+ error: s()?.semantic_index?.error,
401
+ reason: s()?.semantic_index?.reason,
402
+ backend_url: s()?.semantic_index?.backend_url
403
+ })
388
404
  };
389
405
  };
390
406
  const semanticRefreshing = () => formatSemanticRefreshing(s()?.semantic_index?.refreshing_count ?? 0);
@@ -439,178 +455,204 @@ export const AftSidebarPanel = props => {
439
455
  })(), null);
440
456
  _$insert(_el$13, () => props.prefs.header.label, null);
441
457
  _$insert(_el$10, (() => {
442
- var _c$2 = _$memo(() => !!s()?.degraded);
458
+ var _c$2 = _$memo(() => !!(s()?.degraded && degradedHeaderMarker(s()?.degraded_reasons ?? []).calm));
443
459
  return () => _c$2() && (() => {
444
460
  var _el$14 = _$createElement("box"),
445
- _el$15 = _$createElement("text"),
446
- _el$16 = _$createElement("b");
461
+ _el$15 = _$createElement("text");
447
462
  _$insertNode(_el$14, _el$15);
448
- _$setProp(_el$14, "paddingLeft", 1);
449
- _$setProp(_el$14, "paddingRight", 1);
450
463
  _$setProp(_el$14, "marginLeft", 1);
451
- _$insertNode(_el$15, _el$16);
452
- _$insertNode(_el$16, _$createTextNode(`DEGRADED`));
464
+ _$insert(_el$15, () => degradedHeaderMarker(s()?.degraded_reasons ?? []).text);
465
+ _$effect(_$p => _$setProp(_el$15, "fg", props.palette.warning, _$p));
466
+ return _el$14;
467
+ })();
468
+ })(), null);
469
+ _$insert(_el$10, (() => {
470
+ var _c$3 = _$memo(() => !!(s()?.degraded && !degradedHeaderMarker(s()?.degraded_reasons ?? []).calm));
471
+ return () => _c$3() && (() => {
472
+ var _el$16 = _$createElement("box"),
473
+ _el$17 = _$createElement("text"),
474
+ _el$18 = _$createElement("b");
475
+ _$insertNode(_el$16, _el$17);
476
+ _$setProp(_el$16, "paddingLeft", 1);
477
+ _$setProp(_el$16, "paddingRight", 1);
478
+ _$setProp(_el$16, "marginLeft", 1);
479
+ _$insertNode(_el$17, _el$18);
480
+ _$insert(_el$18, () => degradedHeaderMarker(s()?.degraded_reasons ?? []).text);
453
481
  _$effect(_p$ => {
454
482
  var _v$8 = props.palette.warning,
455
483
  _v$9 = badgeForeground(props.palette.warning, props.palette.background);
456
- _v$8 !== _p$.e && (_p$.e = _$setProp(_el$14, "backgroundColor", _v$8, _p$.e));
457
- _v$9 !== _p$.t && (_p$.t = _$setProp(_el$15, "fg", _v$9, _p$.t));
484
+ _v$8 !== _p$.e && (_p$.e = _$setProp(_el$16, "backgroundColor", _v$8, _p$.e));
485
+ _v$9 !== _p$.t && (_p$.t = _$setProp(_el$17, "fg", _v$9, _p$.t));
458
486
  return _p$;
459
487
  }, {
460
488
  e: undefined,
461
489
  t: undefined
462
490
  });
463
- return _el$14;
491
+ return _el$16;
464
492
  })();
465
493
  })(), null);
466
494
  _$insert(_el$1, (() => {
467
- var _c$3 = _$memo(() => !!(!notInitialized() && props.prefs.header.showVersion));
468
- return () => _c$3() && (() => {
469
- var _el$18 = _$createElement("text"),
470
- _el$19 = _$createTextNode(`v`);
471
- _$insertNode(_el$18, _el$19);
472
- _$insert(_el$18, () => s()?.version ?? props.pluginVersion, null);
473
- _$effect(_$p => _$setProp(_el$18, "fg", props.palette.textMuted, _$p));
474
- return _el$18;
475
- })();
476
- })(), null);
477
- _$insert(_el$0, (() => {
478
- var _c$4 = _$memo(() => !!(s()?.degraded && degradedSummary()));
495
+ var _c$4 = _$memo(() => !!(!notInitialized() && props.prefs.header.showVersion));
479
496
  return () => _c$4() && (() => {
480
- var _el$20 = _$createElement("box"),
481
- _el$21 = _$createElement("text"),
482
- _el$22 = _$createTextNode(`⚠ `);
483
- _$insertNode(_el$20, _el$21);
484
- _$setProp(_el$20, "marginTop", 1);
485
- _$setProp(_el$20, "width", "100%");
486
- _$insertNode(_el$21, _el$22);
487
- _$insert(_el$21, degradedSummary, null);
488
- _$effect(_$p => _$setProp(_el$21, "fg", props.palette.warning, _$p));
489
- return _el$20;
497
+ var _el$19 = _$createElement("text"),
498
+ _el$20 = _$createTextNode(`v`);
499
+ _$insertNode(_el$19, _el$20);
500
+ _$insert(_el$19, () => s()?.version ?? props.pluginVersion, null);
501
+ _$effect(_$p => _$setProp(_el$19, "fg", props.palette.textMuted, _$p));
502
+ return _el$19;
490
503
  })();
491
504
  })(), null);
492
505
  _$insert(_el$0, (() => {
493
- var _c$5 = _$memo(() => !!(!notInitialized() && worktreeNote()));
506
+ var _c$5 = _$memo(() => !!(s()?.degraded && degradedSummary()));
494
507
  return () => _c$5() && (() => {
495
- var _el$23 = _$createElement("box"),
496
- _el$24 = _$createElement("text");
497
- _$insertNode(_el$23, _el$24);
498
- _$setProp(_el$23, "marginTop", 1);
499
- _$setProp(_el$23, "width", "100%");
500
- _$insert(_el$24, worktreeNote);
501
- _$effect(_$p => _$setProp(_el$24, "fg", props.palette.textMuted, _$p));
502
- return _el$23;
508
+ var _el$21 = _$createElement("box"),
509
+ _el$22 = _$createElement("text"),
510
+ _el$23 = _$createTextNode(`⚠ `);
511
+ _$insertNode(_el$21, _el$22);
512
+ _$setProp(_el$21, "marginTop", 1);
513
+ _$setProp(_el$21, "width", "100%");
514
+ _$insertNode(_el$22, _el$23);
515
+ _$insert(_el$22, degradedSummary, null);
516
+ _$effect(_$p => _$setProp(_el$22, "fg", props.palette.warning, _$p));
517
+ return _el$21;
503
518
  })();
504
519
  })(), null);
505
520
  _$insert(_el$0, (() => {
506
- var _c$6 = _$memo(() => !!notInitialized());
521
+ var _c$6 = _$memo(() => !!(!notInitialized() && worktreeNote()));
507
522
  return () => _c$6() && (() => {
508
- var _el$25 = _$createElement("box"),
509
- _el$26 = _$createElement("text");
510
- _$insertNode(_el$25, _el$26);
511
- _$setProp(_el$25, "marginTop", 1);
512
- _$setProp(_el$25, "width", "100%");
513
- _$insert(_el$26, () => s().message || "AFT bridge is now spawned lazily, information here will be populated after first tool call.");
514
- _$effect(_$p => _$setProp(_el$26, "fg", props.palette.textMuted, _$p));
515
- return _el$25;
523
+ var _el$24 = _$createElement("box"),
524
+ _el$25 = _$createElement("text");
525
+ _$insertNode(_el$24, _el$25);
526
+ _$setProp(_el$24, "marginTop", 1);
527
+ _$setProp(_el$24, "width", "100%");
528
+ _$insert(_el$25, worktreeNote);
529
+ _$effect(_$p => _$setProp(_el$25, "fg", props.palette.textMuted, _$p));
530
+ return _el$24;
516
531
  })();
517
532
  })(), null);
518
533
  _$insert(_el$0, (() => {
519
- var _c$7 = _$memo(() => !!(!notInitialized() && props.collapsed));
534
+ var _c$7 = _$memo(() => !!notInitialized());
520
535
  return () => _c$7() && (() => {
521
- var _el$27 = _$createElement("box");
522
- _$setProp(_el$27, "width", "100%");
523
- _$setProp(_el$27, "flexDirection", "column");
524
- _$insert(_el$27, (() => {
525
- var _c$9 = _$memo(() => !!props.prefs.sections.searchIndex);
526
- return () => _c$9() && _$createComponent(CollapsedRow, {
536
+ var _el$26 = _$createElement("box");
537
+ _$setProp(_el$26, "marginTop", 1);
538
+ _$setProp(_el$26, "width", "100%");
539
+ _$insert(_el$26, (() => {
540
+ var _c$0 = _$memo(() => !!s().config_error);
541
+ return () => _c$0() ? // Config error state: no bridge will ever start in this process,
542
+ // so the placeholder text would mislead; show the error instead.
543
+ (() => {
544
+ var _el$27 = _$createElement("text"),
545
+ _el$28 = _$createTextNode(`✖ `);
546
+ _$insertNode(_el$27, _el$28);
547
+ _$insert(_el$27, () => s().message, null);
548
+ _$effect(_$p => _$setProp(_el$27, "fg", props.palette.error, _$p));
549
+ return _el$27;
550
+ })() : (() => {
551
+ var _el$29 = _$createElement("text");
552
+ _$insert(_el$29, () => s().message || NOT_STARTED_STATUS_TEXT);
553
+ _$effect(_$p => _$setProp(_el$29, "fg", props.palette.textMuted, _$p));
554
+ return _el$29;
555
+ })();
556
+ })());
557
+ return _el$26;
558
+ })();
559
+ })(), null);
560
+ _$insert(_el$0, (() => {
561
+ var _c$8 = _$memo(() => !!(!notInitialized() && props.collapsed));
562
+ return () => _c$8() && (() => {
563
+ var _el$30 = _$createElement("box");
564
+ _$setProp(_el$30, "width", "100%");
565
+ _$setProp(_el$30, "flexDirection", "column");
566
+ _$insert(_el$30, (() => {
567
+ var _c$1 = _$memo(() => !!props.prefs.sections.searchIndex);
568
+ return () => _c$1() && _$createComponent(CollapsedRow, {
527
569
  get palette() {
528
570
  return props.palette;
529
571
  },
530
572
  label: "Search Index",
531
573
  get children() {
532
- var _el$28 = _$createElement("text");
533
- _$insertNode(_el$28, _$createTextNode(`●`));
534
- _$effect(_$p => _$setProp(_el$28, "fg", toneColor(props.palette, searchStatus().tone), _$p));
535
- return _el$28;
574
+ var _el$31 = _$createElement("text");
575
+ _$insertNode(_el$31, _$createTextNode(`●`));
576
+ _$effect(_$p => _$setProp(_el$31, "fg", toneColor(props.palette, searchStatus().tone), _$p));
577
+ return _el$31;
536
578
  }
537
579
  });
538
580
  })(), null);
539
- _$insert(_el$27, (() => {
540
- var _c$0 = _$memo(() => !!props.prefs.sections.semanticIndex);
541
- return () => _c$0() && _$createComponent(CollapsedRow, {
581
+ _$insert(_el$30, (() => {
582
+ var _c$10 = _$memo(() => !!props.prefs.sections.semanticIndex);
583
+ return () => _c$10() && _$createComponent(CollapsedRow, {
542
584
  get palette() {
543
585
  return props.palette;
544
586
  },
545
587
  label: "Semantic Index",
546
588
  get children() {
547
- var _el$30 = _$createElement("text");
548
- _$insertNode(_el$30, _$createTextNode(`●`));
549
- _$effect(_$p => _$setProp(_el$30, "fg", toneColor(props.palette, semanticStatus().tone), _$p));
550
- return _el$30;
589
+ var _el$33 = _$createElement("text");
590
+ _$insertNode(_el$33, _$createTextNode(`●`));
591
+ _$effect(_$p => _$setProp(_el$33, "fg", toneColor(props.palette, semanticStatus().tone), _$p));
592
+ return _el$33;
551
593
  }
552
594
  });
553
595
  })(), null);
554
- _$insert(_el$27, (() => {
555
- var _c$1 = _$memo(() => !!(props.prefs.sections.codeHealth && collapsedHealthLights(statusBar())));
556
- return () => _c$1() && _$createComponent(CollapsedRow, {
596
+ _$insert(_el$30, (() => {
597
+ var _c$11 = _$memo(() => !!(props.prefs.sections.codeHealth && collapsedHealthLights(statusBar())));
598
+ return () => _c$11() && _$createComponent(CollapsedRow, {
557
599
  get palette() {
558
600
  return props.palette;
559
601
  },
560
602
  label: "Code Health",
561
603
  get children() {
562
- var _el$32 = _$createElement("box"),
563
- _el$33 = _$createElement("text"),
564
- _el$35 = _$createElement("text"),
565
- _el$37 = _$createElement("text");
566
- _$insertNode(_el$32, _el$33);
567
- _$insertNode(_el$32, _el$35);
568
- _$insertNode(_el$32, _el$37);
569
- _$setProp(_el$32, "flexDirection", "row");
570
- _$setProp(_el$32, "gap", 1);
571
- _$insertNode(_el$33, _$createTextNode(`●`));
572
- _$insertNode(_el$35, _$createTextNode(`●`));
573
- _$insertNode(_el$37, _$createTextNode(`●`));
604
+ var _el$35 = _$createElement("box"),
605
+ _el$36 = _$createElement("text"),
606
+ _el$38 = _$createElement("text"),
607
+ _el$40 = _$createElement("text");
608
+ _$insertNode(_el$35, _el$36);
609
+ _$insertNode(_el$35, _el$38);
610
+ _$insertNode(_el$35, _el$40);
611
+ _$setProp(_el$35, "flexDirection", "row");
612
+ _$setProp(_el$35, "gap", 1);
613
+ _$insertNode(_el$36, _$createTextNode(`●`));
614
+ _$insertNode(_el$38, _$createTextNode(`●`));
615
+ _$insertNode(_el$40, _$createTextNode(`●`));
574
616
  _$effect(_p$ => {
575
617
  var _v$0 = toneColor(props.palette, collapsedHealthLights(statusBar()).diagnostics),
576
618
  _v$1 = toneColor(props.palette, collapsedHealthLights(statusBar()).code),
577
619
  _v$10 = toneColor(props.palette, collapsedHealthLights(statusBar()).todos);
578
- _v$0 !== _p$.e && (_p$.e = _$setProp(_el$33, "fg", _v$0, _p$.e));
579
- _v$1 !== _p$.t && (_p$.t = _$setProp(_el$35, "fg", _v$1, _p$.t));
580
- _v$10 !== _p$.a && (_p$.a = _$setProp(_el$37, "fg", _v$10, _p$.a));
620
+ _v$0 !== _p$.e && (_p$.e = _$setProp(_el$36, "fg", _v$0, _p$.e));
621
+ _v$1 !== _p$.t && (_p$.t = _$setProp(_el$38, "fg", _v$1, _p$.t));
622
+ _v$10 !== _p$.a && (_p$.a = _$setProp(_el$40, "fg", _v$10, _p$.a));
581
623
  return _p$;
582
624
  }, {
583
625
  e: undefined,
584
626
  t: undefined,
585
627
  a: undefined
586
628
  });
587
- return _el$32;
629
+ return _el$35;
588
630
  }
589
631
  });
590
632
  })(), null);
591
- _$insert(_el$27, (() => {
592
- var _c$10 = _$memo(() => !!(props.prefs.sections.compression && collapsedCompressionValue(s()?.compression)));
593
- return () => _c$10() && _$createComponent(CollapsedRow, {
633
+ _$insert(_el$30, (() => {
634
+ var _c$12 = _$memo(() => !!(props.prefs.sections.compression && collapsedCompressionValue(s()?.compression)));
635
+ return () => _c$12() && _$createComponent(CollapsedRow, {
594
636
  get palette() {
595
637
  return props.palette;
596
638
  },
597
639
  label: "Compression",
598
640
  get children() {
599
- var _el$39 = _$createElement("text"),
600
- _el$40 = _$createElement("b");
601
- _$insertNode(_el$39, _el$40);
602
- _$insert(_el$40, () => collapsedCompressionValue(s()?.compression));
603
- _$effect(_$p => _$setProp(_el$39, "fg", props.palette.textMuted, _$p));
604
- return _el$39;
641
+ var _el$42 = _$createElement("text"),
642
+ _el$43 = _$createElement("b");
643
+ _$insertNode(_el$42, _el$43);
644
+ _$insert(_el$43, () => collapsedCompressionValue(s()?.compression));
645
+ _$effect(_$p => _$setProp(_el$42, "fg", props.palette.textMuted, _$p));
646
+ return _el$42;
605
647
  }
606
648
  });
607
649
  })(), null);
608
- return _el$27;
650
+ return _el$30;
609
651
  })();
610
652
  })(), null);
611
653
  _$insert(_el$0, (() => {
612
- var _c$8 = _$memo(() => !!(!notInitialized() && !props.collapsed));
613
- return () => _c$8() && [_$memo(() => _$memo(() => !!props.prefs.sections.searchIndex)() && [_$createComponent(SectionHeader, {
654
+ var _c$9 = _$memo(() => !!(!notInitialized() && !props.collapsed));
655
+ return () => _c$9() && [_$memo(() => _$memo(() => !!props.prefs.sections.searchIndex)() && [_$createComponent(SectionHeader, {
614
656
  get palette() {
615
657
  return props.palette;
616
658
  },
@@ -661,13 +703,13 @@ export const AftSidebarPanel = props => {
661
703
  return semanticStatus().tone;
662
704
  }
663
705
  }), _$memo(() => _$memo(() => !!semanticRefreshing())() && (() => {
664
- var _el$41 = _$createElement("box"),
665
- _el$42 = _$createElement("text");
666
- _$insertNode(_el$41, _el$42);
667
- _$setProp(_el$41, "width", "100%");
668
- _$insert(_el$42, semanticRefreshing);
669
- _$effect(_$p => _$setProp(_el$42, "fg", props.palette.textMuted, _$p));
670
- return _el$41;
706
+ var _el$44 = _$createElement("box"),
707
+ _el$45 = _$createElement("text");
708
+ _$insertNode(_el$44, _el$45);
709
+ _$setProp(_el$44, "width", "100%");
710
+ _$insert(_el$45, semanticRefreshing);
711
+ _$effect(_$p => _$setProp(_el$45, "fg", props.palette.textMuted, _$p));
712
+ return _el$44;
671
713
  })()), _$memo(() => _$memo(() => !!(s()?.semantic_index?.status === "loading" && s()?.semantic_index?.entries_total != null && s().semantic_index.entries_total > 0))() && _$createComponent(StatRow, {
672
714
  get palette() {
673
715
  return props.palette;
@@ -766,13 +808,13 @@ export const AftSidebarPanel = props => {
766
808
  },
767
809
  title: "Compression"
768
810
  }), _$memo(() => compressionRows().map(row => row.kind === "scope" ? (() => {
769
- var _el$43 = _$createElement("box"),
770
- _el$44 = _$createElement("text");
771
- _$insertNode(_el$43, _el$44);
772
- _$setProp(_el$43, "width", "100%");
773
- _$insert(_el$44, () => row.label);
774
- _$effect(_$p => _$setProp(_el$44, "fg", props.palette.text, _$p));
775
- return _el$43;
811
+ var _el$46 = _$createElement("box"),
812
+ _el$47 = _$createElement("text");
813
+ _$insertNode(_el$46, _el$47);
814
+ _$setProp(_el$46, "width", "100%");
815
+ _$insert(_el$47, () => row.label);
816
+ _$effect(_$p => _$setProp(_el$47, "fg", props.palette.text, _$p));
817
+ return _el$46;
776
818
  })() : _$createComponent(StatRow, {
777
819
  get palette() {
778
820
  return props.palette;
@@ -785,16 +827,16 @@ export const AftSidebarPanel = props => {
785
827
  },
786
828
  tone: "muted"
787
829
  })))]), _$memo(() => _$memo(() => !!(s()?.semantic_index?.status === "failed" && s()?.semantic_index?.error))() && (() => {
788
- var _el$45 = _$createElement("box"),
789
- _el$46 = _$createElement("text"),
790
- _el$47 = _$createTextNode(`⚠ `);
791
- _$insertNode(_el$45, _el$46);
792
- _$setProp(_el$45, "marginTop", 1);
793
- _$setProp(_el$45, "width", "100%");
794
- _$insertNode(_el$46, _el$47);
795
- _$insert(_el$46, () => s().semantic_index.error, null);
796
- _$effect(_$p => _$setProp(_el$46, "fg", props.palette.error, _$p));
797
- return _el$45;
830
+ var _el$48 = _$createElement("box"),
831
+ _el$49 = _$createElement("text"),
832
+ _el$50 = _$createTextNode(`⚠ `);
833
+ _$insertNode(_el$48, _el$49);
834
+ _$setProp(_el$48, "marginTop", 1);
835
+ _$setProp(_el$48, "width", "100%");
836
+ _$insertNode(_el$49, _el$50);
837
+ _$insert(_el$49, () => s().semantic_index.error, null);
838
+ _$effect(_$p => _$setProp(_el$49, "fg", props.palette.error, _$p));
839
+ return _el$48;
798
840
  })())];
799
841
  })(), null);
800
842
  _$effect(_p$ => {