threadwell 0.0.6 → 0.0.7

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 (93) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +4 -8
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +5 -7
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/config-selector.d.ts.map +1 -1
  7. package/dist/cli/config-selector.js +4 -2
  8. package/dist/cli/config-selector.js.map +1 -1
  9. package/dist/core/settings-manager.d.ts +3 -0
  10. package/dist/core/settings-manager.d.ts.map +1 -1
  11. package/dist/core/settings-manager.js +5 -0
  12. package/dist/core/settings-manager.js.map +1 -1
  13. package/dist/core/slash-commands.d.ts.map +1 -1
  14. package/dist/core/slash-commands.js +1 -1
  15. package/dist/core/slash-commands.js.map +1 -1
  16. package/dist/core/tools/edit.d.ts.map +1 -1
  17. package/dist/core/tools/edit.js +7 -1
  18. package/dist/core/tools/edit.js.map +1 -1
  19. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  20. package/dist/modes/interactive/components/assistant-message.js +12 -4
  21. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  22. package/dist/modes/interactive/components/bash-execution.d.ts +2 -0
  23. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  24. package/dist/modes/interactive/components/bash-execution.js +43 -4
  25. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  26. package/dist/modes/interactive/components/branch-summary-message.d.ts +4 -3
  27. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  28. package/dist/modes/interactive/components/branch-summary-message.js +31 -8
  29. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  30. package/dist/modes/interactive/components/compaction-summary-message.d.ts +4 -3
  31. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  32. package/dist/modes/interactive/components/compaction-summary-message.js +32 -8
  33. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  34. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  35. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  36. package/dist/modes/interactive/components/config-selector.js +1 -9
  37. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  38. package/dist/modes/interactive/components/custom-message.d.ts +3 -0
  39. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  40. package/dist/modes/interactive/components/custom-message.js +33 -20
  41. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  42. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  43. package/dist/modes/interactive/components/diff.js +70 -0
  44. package/dist/modes/interactive/components/diff.js.map +1 -1
  45. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  46. package/dist/modes/interactive/components/footer.js +61 -49
  47. package/dist/modes/interactive/components/footer.js.map +1 -1
  48. package/dist/modes/interactive/components/framed-message.d.ts +17 -0
  49. package/dist/modes/interactive/components/framed-message.d.ts.map +1 -0
  50. package/dist/modes/interactive/components/framed-message.js +39 -0
  51. package/dist/modes/interactive/components/framed-message.js.map +1 -0
  52. package/dist/modes/interactive/components/settings-selector.d.ts +0 -4
  53. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  54. package/dist/modes/interactive/components/settings-selector.js +0 -20
  55. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  56. package/dist/modes/interactive/components/skill-invocation-message.d.ts +4 -3
  57. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  58. package/dist/modes/interactive/components/skill-invocation-message.js +31 -9
  59. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  60. package/dist/modes/interactive/components/split-info-card.d.ts.map +1 -1
  61. package/dist/modes/interactive/components/split-info-card.js +24 -17
  62. package/dist/modes/interactive/components/split-info-card.js.map +1 -1
  63. package/dist/modes/interactive/components/thinking-card.d.ts +6 -0
  64. package/dist/modes/interactive/components/thinking-card.d.ts.map +1 -0
  65. package/dist/modes/interactive/components/thinking-card.js +17 -0
  66. package/dist/modes/interactive/components/thinking-card.js.map +1 -0
  67. package/dist/modes/interactive/components/tool-execution.d.ts +5 -0
  68. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  69. package/dist/modes/interactive/components/tool-execution.js +72 -2
  70. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  71. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  72. package/dist/modes/interactive/components/user-message.js +16 -0
  73. package/dist/modes/interactive/components/user-message.js.map +1 -1
  74. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  75. package/dist/modes/interactive/interactive-mode.js +86 -73
  76. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  77. package/dist/modes/interactive/theme/visual-profile.d.ts +69 -0
  78. package/dist/modes/interactive/theme/visual-profile.d.ts.map +1 -0
  79. package/dist/modes/interactive/theme/visual-profile.js +131 -0
  80. package/dist/modes/interactive/theme/visual-profile.js.map +1 -0
  81. package/dist/package-manager-cli.d.ts.map +1 -1
  82. package/dist/package-manager-cli.js +1 -1
  83. package/dist/package-manager-cli.js.map +1 -1
  84. package/docs/docs.json +1 -5
  85. package/docs/extensions.md +7 -16
  86. package/docs/index.md +6 -5
  87. package/docs/packages.md +8 -30
  88. package/docs/quickstart.md +1 -1
  89. package/docs/sdk.md +2 -3
  90. package/docs/settings.md +24 -7
  91. package/docs/themes.md +5 -295
  92. package/docs/usage.md +14 -17
  93. package/package.json +4 -4
@@ -62,7 +62,8 @@ import { ToolExecutionComponent } from "./components/tool-execution.js";
62
62
  import { TreeSelectorComponent } from "./components/tree-selector.js";
63
63
  import { UserMessageComponent } from "./components/user-message.js";
64
64
  import { UserMessageSelectorComponent } from "./components/user-message-selector.js";
65
- import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, initTheme, onThemeChange, setRegisteredThemes, setTheme, setThemeInstance, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
65
+ import { getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, initTheme, onThemeChange, setRegisteredThemes, setTheme, setThemeInstance, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
66
+ import { configureVisualProfile, getVisualTokens } from "./theme/visual-profile.js";
66
67
  function isExpandable(obj) {
67
68
  return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
68
69
  }
@@ -241,9 +242,10 @@ export class InteractiveMode {
241
242
  this.footer.setAutoCompactEnabled(this.session.autoCompactionEnabled);
242
243
  // Load hide thinking block setting
243
244
  this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
244
- // Register themes from resource loader and initialize
245
- setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
246
- initTheme(this.settingsManager.getTheme(), true);
245
+ configureVisualProfile(this.settingsManager.getVisualProfileSetting());
246
+ // Theme customization is frozen; keep the built-in dark theme active for stable rendering.
247
+ setRegisteredThemes([]);
248
+ initTheme("dark", false);
247
249
  }
248
250
  getAutocompleteSourceTag(sourceInfo) {
249
251
  if (!sourceInfo) {
@@ -364,7 +366,13 @@ export class InteractiveMode {
364
366
  return await checkForNewThreadwellVersion(this.version, { timeoutMs: 1500 });
365
367
  }
366
368
  getStartupWhatsNewLines() {
367
- const whatsNewLines = ["• context usage bar", "• startup interface toggles", "• cleaner visual cards"];
369
+ const visual = getVisualTokens();
370
+ const bullet = visual.glyphs.bullet;
371
+ const whatsNewLines = [
372
+ `${bullet} context usage bar`,
373
+ `${bullet} startup interface toggles`,
374
+ `${bullet} cleaner visual cards`,
375
+ ];
368
376
  if (!this.changelogMarkdown)
369
377
  return [theme.fg("muted", `v${this.version}`), ...whatsNewLines];
370
378
  const versionMatch = this.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
@@ -373,7 +381,7 @@ export class InteractiveMode {
373
381
  .split("\n")
374
382
  .map((line) => line.trim())
375
383
  .filter((line) => /^[-*•]\s+/.test(line))
376
- .map((line) => line.replace(/^[-*•]\s+/, "• "))
384
+ .map((line) => line.replace(/^[-*•]\s+/, `${bullet} `))
377
385
  .slice(0, 2);
378
386
  return [
379
387
  ...whatsNewLines,
@@ -386,10 +394,12 @@ export class InteractiveMode {
386
394
  getStartupUpdateLines() {
387
395
  if (!this.startupUpdateVersion)
388
396
  return [""];
397
+ const visual = getVisualTokens();
398
+ const warning = visual.glyphs.warning;
389
399
  return [
390
- `${theme.fg("warning", "update")} ${theme.fg("warning", `v${this.startupUpdateVersion} available`)}`,
391
- `${theme.fg("dim", "run")} ${theme.fg("accent", `${APP_NAME} update`)}`,
392
- `${theme.fg("dim", "inside")} ${theme.fg("accent", "/update")} for details`,
400
+ `${theme.fg("warning", warning)} ${theme.fg("warning", `v${this.startupUpdateVersion} available`)}`,
401
+ `${theme.fg("dim", "run")} ${theme.fg("accent", `${APP_NAME} update`)}`,
402
+ `${theme.fg("dim", "or")} ${theme.fg("accent", "/update")} for details`,
393
403
  "",
394
404
  ];
395
405
  }
@@ -439,11 +449,41 @@ export class InteractiveMode {
439
449
  this.ui.addChild(this.headerContainer);
440
450
  // Add header with keybindings from config (unless silenced)
441
451
  if (this.options.verbose || !this.settingsManager.getQuietStartup()) {
442
- const title = theme.bold(theme.fg("accent", DISTRO_IDENTITY.name)) + theme.fg("dim", ` v${this.version}`);
452
+ const visual = getVisualTokens();
453
+ const glyphs = visual.glyphs;
454
+ const title = theme.bold(theme.fg("accent", `${visual.enhanced ? `${glyphs.threadwell} ` : ""}${DISTRO_IDENTITY.name}`)) +
455
+ theme.fg("dim", ` v${this.version}`);
443
456
  const cwd = this.sessionManager.getCwd();
457
+ const cwdLabel = path.basename(cwd) || cwd;
444
458
  const model = this.session.state.model;
445
459
  const modelText = model ? `${model.provider}/${model.id}` : "no model selected";
446
- const continuityText = this.settingsManager.getContinuityEnabled() ? "active" : "disabled";
460
+ const continuityEnabled = this.settingsManager.getContinuityEnabled();
461
+ const continuityText = continuityEnabled ? "active" : "disabled";
462
+ const memorySettings = this.settingsManager.getMemorySettings();
463
+ const memoryText = memorySettings.enabled ? (memorySettings.inject ? "injecting" : "enabled") : "off";
464
+ const statusPill = (label, value, active = true) => {
465
+ const valueColor = active ? "accent" : "dim";
466
+ return `${theme.fg("dim", label)} ${theme.fg(valueColor, value)}`;
467
+ };
468
+ const gitStatus = this.footerDataProvider.getGitStatus();
469
+ const formatEnhancedGitStatus = () => {
470
+ if (!gitStatus)
471
+ return undefined;
472
+ const parts = [`${theme.fg("dim", "git")} ${theme.fg("accent", gitStatus.branch)}`];
473
+ if (gitStatus.staged > 0)
474
+ parts.push(theme.fg("success", `+${gitStatus.staged}`));
475
+ if (gitStatus.unstaged > 0)
476
+ parts.push(theme.fg("error", `-${gitStatus.unstaged}`));
477
+ if (gitStatus.untracked > 0)
478
+ parts.push(theme.fg("warning", `?${gitStatus.untracked}`));
479
+ if (gitStatus.conflicts > 0)
480
+ parts.push(theme.fg("error", `!${gitStatus.conflicts}`));
481
+ if (gitStatus.ahead > 0)
482
+ parts.push(theme.fg("accent", `↑${gitStatus.ahead}`));
483
+ if (gitStatus.behind > 0)
484
+ parts.push(theme.fg("warning", `↓${gitStatus.behind}`));
485
+ return parts.join(theme.fg("muted", " "));
486
+ };
447
487
  const startupSummary = [
448
488
  `${title} ${theme.fg("dim", `(${APP_NAME})`)}`,
449
489
  theme.fg("muted", DISTRO_IDENTITY.tagline),
@@ -451,6 +491,7 @@ export class InteractiveMode {
451
491
  `${theme.fg("dim", "cwd")} ${cwd}`,
452
492
  `${theme.fg("dim", "model")} ${modelText}`,
453
493
  `${theme.fg("dim", "continuity")} ${continuityText}`,
494
+ `${theme.fg("dim", "memory")} ${memoryText}`,
454
495
  ].join("\n");
455
496
  // Build startup instructions using keybinding hint helpers
456
497
  const hint = (keybinding, description) => keyHint(keybinding, description);
@@ -481,20 +522,40 @@ export class InteractiveMode {
481
522
  rawKeyHint("/", "commands"),
482
523
  rawKeyHint("!", "bash"),
483
524
  hint("app.tools.expand", "more"),
484
- ].join(theme.fg("muted", " · "));
525
+ ].join(theme.fg("muted", ` ${glyphs.separator} `));
485
526
  const compactOnboarding = theme.fg("dim", `Press ${keyText("app.tools.expand")} to show full startup help and loaded resources.`);
486
527
  const onboarding = theme.fg("dim", `${DISTRO_IDENTITY.name} keeps project continuity in context. Ask it what remains or where you left off.`);
528
+ const enhancedPrimaryStatusLine = [
529
+ statusPill(glyphs.folder, cwdLabel),
530
+ statusPill(glyphs.model, modelText),
531
+ ].join(theme.fg("muted", ` ${glyphs.separator} `));
532
+ const enhancedRuntimeStatusLine = [
533
+ statusPill("continuity", continuityText, continuityEnabled),
534
+ statusPill("memory", memoryText, memorySettings.enabled),
535
+ ].join(theme.fg("muted", ` ${glyphs.separator} `));
536
+ const enhancedGitStatusLine = formatEnhancedGitStatus();
537
+ const leftLines = visual.enhanced
538
+ ? [
539
+ theme.fg("muted", DISTRO_IDENTITY.tagline),
540
+ enhancedPrimaryStatusLine,
541
+ enhancedRuntimeStatusLine,
542
+ ...(enhancedGitStatusLine ? [enhancedGitStatusLine] : []),
543
+ ...this.getStartupUpdateLines(),
544
+ ]
545
+ : [
546
+ theme.fg("muted", DISTRO_IDENTITY.tagline),
547
+ `${theme.fg("dim", "cwd")} ${cwd}`,
548
+ `${theme.fg("dim", "model")} ${modelText}`,
549
+ `${theme.fg("dim", "continuity")} ${continuityText}`,
550
+ ...this.getStartupUpdateLines(),
551
+ ];
487
552
  this.builtInHeader = interfaceSettings.showStartupCard
488
553
  ? new SplitInfoCard({
489
- leftTitle: `${DISTRO_IDENTITY.name} ${this.version}`,
490
- rightTitle: "What's new",
491
- leftLines: [
492
- theme.fg("muted", DISTRO_IDENTITY.tagline),
493
- `${theme.fg("dim", "cwd")} ${cwd}`,
494
- `${theme.fg("dim", "model")} ${modelText}`,
495
- `${theme.fg("dim", "continuity")} ${continuityText}`,
496
- ...this.getStartupUpdateLines(),
497
- ],
554
+ leftTitle: visual.enhanced
555
+ ? `${glyphs.threadwell} ${DISTRO_IDENTITY.name} ${this.version}`
556
+ : `${DISTRO_IDENTITY.name} ${this.version}`,
557
+ rightTitle: visual.enhanced ? `${glyphs.info} What's new` : "What's new",
558
+ leftLines,
498
559
  rightLines: this.getStartupWhatsNewLines(),
499
560
  footerLines: [
500
561
  compactInstructions,
@@ -1035,7 +1096,6 @@ export class InteractiveMode {
1035
1096
  };
1036
1097
  const skillsResult = this.session.resourceLoader.getSkills();
1037
1098
  const promptsResult = this.session.resourceLoader.getPrompts();
1038
- const themesResult = this.session.resourceLoader.getThemes();
1039
1099
  const extensions = options?.extensions ??
1040
1100
  this.session.resourceLoader.getExtensions().extensions.map((extension) => ({
1041
1101
  path: extension.path,
@@ -1057,11 +1117,6 @@ export class InteractiveMode {
1057
1117
  sourceInfos.set(prompt.filePath, prompt.sourceInfo);
1058
1118
  }
1059
1119
  }
1060
- for (const loadedTheme of themesResult.themes) {
1061
- if (loadedTheme.sourcePath && loadedTheme.sourceInfo) {
1062
- sourceInfos.set(loadedTheme.sourcePath, loadedTheme.sourceInfo);
1063
- }
1064
- }
1065
1120
  if (showListing) {
1066
1121
  const interfaceSettings = this.settingsManager.getInterfaceSettings();
1067
1122
  const contextFiles = this.session.resourceLoader.getAgentsFiles().agentsFiles;
@@ -1109,21 +1164,6 @@ export class InteractiveMode {
1109
1164
  const extensionCompactList = formatCompactList(this.getCompactExtensionLabels(extensions));
1110
1165
  addLoadedSection("Extensions", extensionCompactList, extList, "mdHeading");
1111
1166
  }
1112
- // Show loaded themes (excluding built-in)
1113
- const loadedThemes = themesResult.themes;
1114
- const customThemes = loadedThemes.filter((t) => t.sourcePath);
1115
- if (customThemes.length > 0) {
1116
- const groups = this.buildScopeGroups(customThemes.map((loadedTheme) => ({
1117
- path: loadedTheme.sourcePath,
1118
- sourceInfo: loadedTheme.sourceInfo,
1119
- })));
1120
- const themeList = this.formatScopeGroups(groups, {
1121
- formatPath: (item) => this.formatDisplayPath(item.path),
1122
- formatPackagePath: (item) => this.getShortPath(item.path, item.sourceInfo),
1123
- });
1124
- const themeCompactList = formatCompactList(customThemes.map((loadedTheme) => loadedTheme.name ?? this.getCompactPathLabel(loadedTheme.sourcePath, loadedTheme.sourceInfo)));
1125
- addLoadedSection("Themes", themeCompactList, themeList);
1126
- }
1127
1167
  }
1128
1168
  if (showDiagnostics) {
1129
1169
  const skillDiagnostics = skillsResult.diagnostics;
@@ -1155,12 +1195,6 @@ export class InteractiveMode {
1155
1195
  this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Extension issues]")}\n${warningLines}`, 0, 0));
1156
1196
  this.chatContainer.addChild(new Spacer(1));
1157
1197
  }
1158
- const themeDiagnostics = themesResult.diagnostics;
1159
- if (themeDiagnostics.length > 0) {
1160
- const warningLines = this.formatDiagnostics(themeDiagnostics, sourceInfos);
1161
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Theme conflicts]")}\n${warningLines}`, 0, 0));
1162
- this.chatContainer.addChild(new Spacer(1));
1163
- }
1164
1198
  }
1165
1199
  }
1166
1200
  /**
@@ -3423,8 +3457,6 @@ export class InteractiveMode {
3423
3457
  transport: this.settingsManager.getTransport(),
3424
3458
  thinkingLevel: this.session.thinkingLevel,
3425
3459
  availableThinkingLevels: this.session.getAvailableThinkingLevels(),
3426
- currentTheme: this.settingsManager.getTheme() || "dark",
3427
- availableThemes: getAvailableThemes(),
3428
3460
  hideThinkingBlock: this.hideThinkingBlock,
3429
3461
  collapseChangelog: this.settingsManager.getCollapseChangelog(),
3430
3462
  enableInstallTelemetry: this.settingsManager.getEnableInstallTelemetry(),
@@ -3492,21 +3524,6 @@ export class InteractiveMode {
3492
3524
  this.footer.invalidate();
3493
3525
  this.updateEditorBorderColor();
3494
3526
  },
3495
- onThemeChange: (themeName) => {
3496
- const result = setTheme(themeName, true);
3497
- this.settingsManager.setTheme(themeName);
3498
- this.ui.invalidate();
3499
- if (!result.success) {
3500
- this.showError(`Failed to load theme "${themeName}": ${result.error}\nFell back to dark theme.`);
3501
- }
3502
- },
3503
- onThemePreview: (themeName) => {
3504
- const result = setTheme(themeName, true);
3505
- if (result.success) {
3506
- this.ui.invalidate();
3507
- this.ui.requestRender();
3508
- }
3509
- },
3510
3527
  onHideThinkingBlockChange: (hidden) => {
3511
3528
  this.hideThinkingBlock = hidden;
3512
3529
  this.settingsManager.setHideThinkingBlock(hidden);
@@ -4290,7 +4307,7 @@ export class InteractiveMode {
4290
4307
  const borderColor = (s) => theme.fg("border", s);
4291
4308
  reloadBox.addChild(new DynamicBorder(borderColor));
4292
4309
  reloadBox.addChild(new Spacer(1));
4293
- reloadBox.addChild(new Text(theme.fg("muted", "Reloading keybindings, extensions, skills, prompts, themes..."), 1, 0));
4310
+ reloadBox.addChild(new Text(theme.fg("muted", "Reloading keybindings, extensions, skills, prompts..."), 1, 0));
4294
4311
  reloadBox.addChild(new Spacer(1));
4295
4312
  reloadBox.addChild(new DynamicBorder(borderColor));
4296
4313
  const previousEditor = this.editor;
@@ -4312,13 +4329,9 @@ export class InteractiveMode {
4312
4329
  if (isExpandable(activeHeader)) {
4313
4330
  activeHeader.setExpanded(this.toolOutputExpanded);
4314
4331
  }
4315
- setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
4332
+ setRegisteredThemes([]);
4316
4333
  this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
4317
- const themeName = this.settingsManager.getTheme();
4318
- const themeResult = themeName ? setTheme(themeName, true) : { success: true };
4319
- if (!themeResult.success) {
4320
- this.showError(`Failed to load theme "${themeName}": ${themeResult.error}\nFell back to dark theme.`);
4321
- }
4334
+ setTheme("dark", false);
4322
4335
  const editorPaddingX = this.settingsManager.getEditorPaddingX();
4323
4336
  const autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();
4324
4337
  this.defaultEditor.setPaddingX(editorPaddingX);
@@ -4342,7 +4355,7 @@ export class InteractiveMode {
4342
4355
  if (modelsJsonError) {
4343
4356
  this.showError(`models.json error: ${modelsJsonError}`);
4344
4357
  }
4345
- this.showStatus("Reloaded keybindings, extensions, skills, prompts, themes");
4358
+ this.showStatus("Reloaded keybindings, extensions, skills, prompts");
4346
4359
  }
4347
4360
  catch (error) {
4348
4361
  dismissReloadBox(previousEditor);