lsd-pi 1.1.2 → 1.1.3

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 (183) hide show
  1. package/README.md +2 -1
  2. package/dist/bedrock-auth.d.ts +25 -0
  3. package/dist/bedrock-auth.js +59 -0
  4. package/dist/headless.js +8 -3
  5. package/dist/loader.js +1 -0
  6. package/dist/onboarding-llm.d.ts +37 -0
  7. package/dist/onboarding-llm.js +64 -0
  8. package/dist/onboarding.d.ts +2 -14
  9. package/dist/onboarding.js +146 -71
  10. package/dist/pi-migration.js +1 -0
  11. package/dist/resources/extensions/memory/auto-extract.js +21 -3
  12. package/dist/resources/extensions/memory/dream.js +703 -0
  13. package/dist/resources/extensions/memory/extension-manifest.json +2 -2
  14. package/dist/resources/extensions/memory/index.js +115 -8
  15. package/dist/resources/extensions/slash-commands/extension-manifest.json +10 -10
  16. package/dist/resources/extensions/slash-commands/index.js +0 -4
  17. package/dist/resources/extensions/slash-commands/plan.js +181 -45
  18. package/dist/resources/extensions/subagent/agents.js +14 -1
  19. package/dist/resources/extensions/subagent/configured-model.js +3 -2
  20. package/dist/resources/extensions/subagent/index.js +34 -28
  21. package/dist/resources/extensions/subagent/launch-helpers.js +24 -0
  22. package/dist/resources/extensions/subagent/model-resolution.js +41 -3
  23. package/dist/resources/extensions/usage/extension-manifest.json +11 -0
  24. package/dist/resources/extensions/usage/index.js +346 -0
  25. package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/SKILL.md +6 -6
  26. package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
  27. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
  28. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
  29. package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
  30. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
  31. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
  32. package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
  33. package/dist/resources/skills/teams-debug/SKILL.md +5 -6
  34. package/dist/resources/skills/teams-document/SKILL.md +1 -2
  35. package/dist/resources/skills/teams-plan/SKILL.md +3 -4
  36. package/dist/resources/skills/teams-run/SKILL.md +3 -4
  37. package/dist/resources/skills/teams-verify/SKILL.md +4 -5
  38. package/dist/startup-model-validation.js +1 -0
  39. package/dist/welcome-screen.js +13 -11
  40. package/dist/wizard.js +12 -0
  41. package/package.json +1 -1
  42. package/packages/pi-ai/dist/models.generated.d.ts +688 -409
  43. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  44. package/packages/pi-ai/dist/models.generated.js +761 -488
  45. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  46. package/packages/pi-ai/scripts/generate-models.ts +40 -18
  47. package/packages/pi-ai/src/models.generated.ts +759 -486
  48. package/packages/pi-coding-agent/dist/cli/config-selector.js +1 -1
  49. package/packages/pi-coding-agent/dist/cli/config-selector.js.map +1 -1
  50. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -2
  51. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  52. package/packages/pi-coding-agent/dist/core/agent-session.js +6 -30
  53. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  54. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +6 -0
  55. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  56. package/packages/pi-coding-agent/dist/core/settings-manager.js +44 -1
  57. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  58. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +9 -5
  59. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  60. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  61. package/packages/pi-coding-agent/dist/core/skills.js +3 -2
  62. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  63. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  64. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  65. package/packages/pi-coding-agent/dist/index.js +1 -1
  66. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  67. package/packages/pi-coding-agent/dist/main.js +1 -1
  68. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  69. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -2
  70. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  71. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  72. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +15 -12
  73. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  74. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +6 -0
  75. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  76. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +25 -1
  77. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  78. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  79. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  80. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  81. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +10 -0
  82. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  83. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js +1 -1
  84. package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  85. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  86. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -22
  87. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  88. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +18 -5
  89. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  90. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +139 -20
  91. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  92. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  93. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +4 -0
  94. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  95. package/packages/pi-coding-agent/package.json +1 -1
  96. package/packages/pi-coding-agent/src/cli/config-selector.ts +1 -1
  97. package/packages/pi-coding-agent/src/core/agent-session.ts +5 -28
  98. package/packages/pi-coding-agent/src/core/settings-manager.ts +52 -1
  99. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +18 -5
  100. package/packages/pi-coding-agent/src/core/skills.ts +3 -2
  101. package/packages/pi-coding-agent/src/index.ts +1 -1
  102. package/packages/pi-coding-agent/src/main.ts +1 -1
  103. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +2 -2
  104. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +12 -13
  105. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +39 -1
  106. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  107. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +10 -0
  108. package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +1 -1
  109. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +46 -20
  110. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +171 -20
  111. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +4 -0
  112. package/packages/pi-tui/dist/components/editor.d.ts +1 -0
  113. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  114. package/packages/pi-tui/dist/components/editor.js +23 -0
  115. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  116. package/packages/pi-tui/src/components/editor.ts +23 -0
  117. package/pkg/dist/modes/interactive/theme/theme.d.ts +18 -5
  118. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  119. package/pkg/dist/modes/interactive/theme/theme.js +139 -20
  120. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  121. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  122. package/pkg/dist/modes/interactive/theme/themes.js +4 -0
  123. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  124. package/pkg/package.json +1 -1
  125. package/src/resources/extensions/memory/auto-extract.ts +23 -3
  126. package/src/resources/extensions/memory/dream.ts +814 -0
  127. package/src/resources/extensions/memory/extension-manifest.json +2 -2
  128. package/src/resources/extensions/memory/index.ts +134 -13
  129. package/src/resources/extensions/memory/tests/auto-extract.test.ts +10 -2
  130. package/src/resources/extensions/memory/tests/dream.test.ts +142 -0
  131. package/src/resources/extensions/slash-commands/extension-manifest.json +10 -10
  132. package/src/resources/extensions/slash-commands/index.ts +3 -7
  133. package/src/resources/extensions/slash-commands/plan.ts +192 -46
  134. package/src/resources/extensions/subagent/agents.ts +11 -1
  135. package/src/resources/extensions/subagent/configured-model.ts +3 -2
  136. package/src/resources/extensions/subagent/index.ts +38 -30
  137. package/src/resources/extensions/subagent/launch-helpers.ts +30 -0
  138. package/src/resources/extensions/subagent/model-resolution.ts +40 -3
  139. package/src/resources/extensions/usage/extension-manifest.json +11 -0
  140. package/src/resources/extensions/usage/index.ts +441 -0
  141. package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/SKILL.md +6 -6
  142. package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
  143. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
  144. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
  145. package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
  146. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
  147. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
  148. package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
  149. package/src/resources/skills/teams-debug/SKILL.md +5 -6
  150. package/src/resources/skills/teams-document/SKILL.md +1 -2
  151. package/src/resources/skills/teams-plan/SKILL.md +3 -4
  152. package/src/resources/skills/teams-run/SKILL.md +3 -4
  153. package/src/resources/skills/teams-verify/SKILL.md +4 -5
  154. package/dist/resources/extensions/slash-commands/create-extension.js +0 -264
  155. package/dist/resources/extensions/slash-commands/create-slash-command.js +0 -208
  156. package/src/resources/extensions/slash-commands/create-extension.ts +0 -297
  157. package/src/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  158. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
  159. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
  160. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
  161. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
  162. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
  163. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
  164. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
  165. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
  166. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
  167. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
  168. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
  169. /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/add-capability.md +0 -0
  170. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
  171. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
  172. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
  173. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
  174. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
  175. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
  176. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
  177. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
  178. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
  179. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
  180. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
  181. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/extension-skeleton.ts +0 -0
  182. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/stateful-tool-skeleton.ts +0 -0
  183. /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/add-capability.md +0 -0
@@ -41,6 +41,7 @@ const ThemeJsonSchema = Type.Object({
41
41
  success: ColorValueSchema,
42
42
  error: ColorValueSchema,
43
43
  warning: ColorValueSchema,
44
+ violet: ColorValueSchema,
44
45
  muted: ColorValueSchema,
45
46
  dim: ColorValueSchema,
46
47
  text: ColorValueSchema,
@@ -113,6 +114,7 @@ export type ThemeColor =
113
114
  | "success"
114
115
  | "error"
115
116
  | "warning"
117
+ | "violet"
116
118
  | "muted"
117
119
  | "dim"
118
120
  | "text"
@@ -162,6 +164,81 @@ export type ThemeBg =
162
164
 
163
165
  type ColorMode = "truecolor" | "256color";
164
166
 
167
+ export const THEME_ACCENT_PRESETS = ["default", "golden-yellow", "blue", "green", "violet", "red"] as const;
168
+
169
+ export type ThemeAccentPreset = (typeof THEME_ACCENT_PRESETS)[number];
170
+
171
+ export interface ThemeAccentInfo {
172
+ label: string;
173
+ description: string;
174
+ accent: string | undefined;
175
+ thinking: readonly string[] | undefined;
176
+ }
177
+
178
+ type ResolvedThemeAccentPreset = Exclude<ThemeAccentPreset, "default">;
179
+
180
+ const THEME_ACCENT_INFO: Record<ThemeAccentPreset, ThemeAccentInfo> = {
181
+ default: {
182
+ label: "Default",
183
+ description: "Use the active theme’s native accent colors.",
184
+ accent: undefined,
185
+ thinking: undefined,
186
+ },
187
+ "golden-yellow": {
188
+ label: "Golden yellow",
189
+ description: "Warm amber accent (#F59E0B).",
190
+ accent: "#F59E0B",
191
+ thinking: ["#92400E", "#B45309", "#D97706", "#F59E0B", "#FBBF24", "#FCD34D"],
192
+ },
193
+ blue: {
194
+ label: "Blue",
195
+ description: "Bright blue accent (#60A5FA).",
196
+ accent: "#60A5FA",
197
+ thinking: ["#1D4ED8", "#2563EB", "#3B82F6", "#60A5FA", "#93C5FD", "#BFDBFE"],
198
+ },
199
+ green: {
200
+ label: "Green",
201
+ description: "Emerald accent (#34D399).",
202
+ accent: "#34D399",
203
+ thinking: ["#047857", "#059669", "#10B981", "#34D399", "#6EE7B7", "#A7F3D0"],
204
+ },
205
+ violet: {
206
+ label: "Violet",
207
+ description: "Soft violet accent (#A78BFA).",
208
+ accent: "#A78BFA",
209
+ thinking: ["#6D28D9", "#7C3AED", "#8B5CF6", "#A78BFA", "#C4B5FD", "#DDD6FE"],
210
+ },
211
+ red: {
212
+ label: "Red",
213
+ description: "Coral red accent (#F87171).",
214
+ accent: "#F87171",
215
+ thinking: ["#B91C1C", "#DC2626", "#EF4444", "#F87171", "#FCA5A5", "#FECACA"],
216
+ },
217
+ };
218
+
219
+ export function getThemeAccentInfo(accent: ThemeAccentPreset): ThemeAccentInfo {
220
+ return THEME_ACCENT_INFO[accent];
221
+ }
222
+
223
+ export function getThemeAccentLabel(accent: ThemeAccentPreset): string {
224
+ return THEME_ACCENT_INFO[accent].label;
225
+ }
226
+
227
+ export function getAvailableThemeAccents(): ThemeAccentPreset[] {
228
+ return [...THEME_ACCENT_PRESETS];
229
+ }
230
+
231
+ function isThemeAccentPreset(value: string | undefined): value is ThemeAccentPreset {
232
+ return value !== undefined && THEME_ACCENT_PRESETS.includes(value as ThemeAccentPreset);
233
+ }
234
+
235
+ function normalizeThemeAccent(accent: string | undefined): ResolvedThemeAccentPreset | undefined {
236
+ if (accent === undefined || accent === "default" || !isThemeAccentPreset(accent)) {
237
+ return undefined;
238
+ }
239
+ return accent as ResolvedThemeAccentPreset;
240
+ }
241
+
165
242
  // ============================================================================
166
243
  // Color Utilities
167
244
  // ============================================================================
@@ -572,9 +649,73 @@ function loadThemeJson(name: string): ThemeJson {
572
649
  return parseThemeJsonContent(name, content);
573
650
  }
574
651
 
575
- function createTheme(themeJson: ThemeJson, mode?: ColorMode, sourcePath?: string): Theme {
652
+ function applyThemeAccent(themeJson: ThemeJson, accent: ResolvedThemeAccentPreset | undefined): ThemeJson {
653
+ if (!accent) {
654
+ return themeJson;
655
+ }
656
+
657
+ const accentColor = THEME_ACCENT_INFO[accent].accent!;
658
+ const thinkingPalette = THEME_ACCENT_INFO[accent].thinking!;
659
+ const vars = { ...(themeJson.vars ?? {}) };
660
+ const colors = { ...themeJson.colors };
661
+ const originalAccent = resolveVarRefs(themeJson.colors.accent, themeJson.vars ?? {});
662
+ const accentDrivenKeys: Array<keyof ThemeJson["colors"]> = [
663
+ "accent",
664
+ "borderAccent",
665
+ "mdCode",
666
+ "mdListBullet",
667
+ "thinkingOff",
668
+ "thinkingMinimal",
669
+ "thinkingLow",
670
+ "thinkingMedium",
671
+ "thinkingHigh",
672
+ "thinkingXhigh",
673
+ ];
674
+
675
+ if ("accent" in vars) {
676
+ vars.accent = accentColor;
677
+ }
678
+
679
+ colors.thinkingOff = thinkingPalette[0];
680
+ colors.thinkingMinimal = thinkingPalette[1];
681
+ colors.thinkingLow = thinkingPalette[2];
682
+ colors.thinkingMedium = thinkingPalette[3];
683
+ colors.thinkingHigh = thinkingPalette[4];
684
+ colors.thinkingXhigh = thinkingPalette[5];
685
+
686
+ for (const key of accentDrivenKeys) {
687
+ if (
688
+ key === "thinkingOff" ||
689
+ key === "thinkingMinimal" ||
690
+ key === "thinkingLow" ||
691
+ key === "thinkingMedium" ||
692
+ key === "thinkingHigh" ||
693
+ key === "thinkingXhigh"
694
+ ) {
695
+ continue;
696
+ }
697
+ const currentResolved = resolveVarRefs(themeJson.colors[key], themeJson.vars ?? {});
698
+ if (key === "accent" || key === "borderAccent" || currentResolved === originalAccent) {
699
+ colors[key] = accentColor;
700
+ }
701
+ }
702
+
703
+ return {
704
+ ...themeJson,
705
+ vars,
706
+ colors,
707
+ };
708
+ }
709
+
710
+ function createTheme(
711
+ themeJson: ThemeJson,
712
+ mode?: ColorMode,
713
+ sourcePath?: string,
714
+ accent?: ResolvedThemeAccentPreset,
715
+ ): Theme {
576
716
  const colorMode = mode ?? detectColorMode();
577
- const resolvedColors = resolveThemeColors(themeJson.colors, themeJson.vars);
717
+ const resolvedThemeJson = applyThemeAccent(themeJson, accent);
718
+ const resolvedColors = resolveThemeColors(resolvedThemeJson.colors, resolvedThemeJson.vars);
578
719
  const fgColors: Record<ThemeColor, string | number> = {} as Record<ThemeColor, string | number>;
579
720
  const bgColors: Record<ThemeBg, string | number> = {} as Record<ThemeBg, string | number>;
580
721
  const bgColorKeys: Set<string> = new Set([
@@ -593,29 +734,34 @@ function createTheme(themeJson: ThemeJson, mode?: ColorMode, sourcePath?: string
593
734
  }
594
735
  }
595
736
  return new Theme(fgColors, bgColors, colorMode, {
596
- name: themeJson.name,
737
+ name: resolvedThemeJson.name,
597
738
  sourcePath,
598
739
  });
599
740
  }
600
741
 
601
- export function loadThemeFromPath(themePath: string, mode?: ColorMode): Theme {
742
+ export function loadThemeFromPath(themePath: string, mode?: ColorMode, accent?: ResolvedThemeAccentPreset): Theme {
602
743
  const content = fs.readFileSync(themePath, "utf-8");
603
744
  const themeJson = parseThemeJsonContent(themePath, content);
604
- return createTheme(themeJson, mode, themePath);
745
+ return createTheme(themeJson, mode, themePath, accent);
605
746
  }
606
747
 
607
- function loadTheme(name: string, mode?: ColorMode): Theme {
748
+ function loadTheme(name: string, mode?: ColorMode, accent?: ResolvedThemeAccentPreset): Theme {
608
749
  const registeredTheme = registeredThemes.get(name);
609
750
  if (registeredTheme) {
610
- return registeredTheme;
751
+ if (!accent) {
752
+ return registeredTheme;
753
+ }
754
+ if (registeredTheme.sourcePath) {
755
+ return loadThemeFromPath(registeredTheme.sourcePath, mode, accent);
756
+ }
611
757
  }
612
758
  const themeJson = loadThemeJson(name);
613
- return createTheme(themeJson, mode);
759
+ return createTheme(themeJson, mode, undefined, accent);
614
760
  }
615
761
 
616
- export function getThemeByName(name: string): Theme | undefined {
762
+ export function getThemeByName(name: string, accent?: string): Theme | undefined {
617
763
  try {
618
- return loadTheme(name);
764
+ return loadTheme(name, undefined, normalizeThemeAccent(accent));
619
765
  } catch {
620
766
  return undefined;
621
767
  }
@@ -662,6 +808,7 @@ function setGlobalTheme(t: Theme): void {
662
808
  }
663
809
 
664
810
  let currentThemeName: string | undefined;
811
+ let currentThemeAccent: ResolvedThemeAccentPreset | undefined;
665
812
  let themeWatcher: fs.FSWatcher | undefined;
666
813
  const onThemeChangeCallbacks = new Set<() => void>();
667
814
  const registeredThemes = new Map<string, Theme>();
@@ -675,26 +822,30 @@ export function setRegisteredThemes(themes: Theme[]): void {
675
822
  }
676
823
  }
677
824
 
678
- export function initTheme(themeName?: string, enableWatcher: boolean = false): void {
825
+ export function initTheme(themeName?: string, enableWatcher: boolean = false, accent?: string): void {
679
826
  const name = themeName ?? getDefaultTheme();
827
+ const normalizedAccent = normalizeThemeAccent(accent);
680
828
  currentThemeName = name;
829
+ currentThemeAccent = normalizedAccent;
681
830
  try {
682
- setGlobalTheme(loadTheme(name));
831
+ setGlobalTheme(loadTheme(name, undefined, normalizedAccent));
683
832
  if (enableWatcher) {
684
833
  startThemeWatcher();
685
834
  }
686
835
  } catch (_error) {
687
836
  // Theme is invalid - fall back to dark theme silently
688
837
  currentThemeName = "dark";
689
- setGlobalTheme(loadTheme("dark"));
838
+ setGlobalTheme(loadTheme("dark", undefined, normalizedAccent));
690
839
  // Don't start watcher for fallback theme
691
840
  }
692
841
  }
693
842
 
694
- export function setTheme(name: string, enableWatcher: boolean = false): { success: boolean; error?: string } {
843
+ export function setTheme(name: string, enableWatcher: boolean = false, accent?: string): { success: boolean; error?: string } {
844
+ const normalizedAccent = normalizeThemeAccent(accent);
695
845
  currentThemeName = name;
846
+ currentThemeAccent = normalizedAccent;
696
847
  try {
697
- setGlobalTheme(loadTheme(name));
848
+ setGlobalTheme(loadTheme(name, undefined, normalizedAccent));
698
849
  if (enableWatcher) {
699
850
  startThemeWatcher();
700
851
  }
@@ -703,7 +854,7 @@ export function setTheme(name: string, enableWatcher: boolean = false): { succes
703
854
  } catch (error) {
704
855
  // Theme is invalid - fall back to dark theme
705
856
  currentThemeName = "dark";
706
- setGlobalTheme(loadTheme("dark"));
857
+ setGlobalTheme(loadTheme("dark", undefined, normalizedAccent));
707
858
  // Don't start watcher for fallback theme
708
859
  return {
709
860
  success: false,
@@ -751,7 +902,7 @@ function startThemeWatcher(): void {
751
902
  setTimeout(() => {
752
903
  try {
753
904
  // Reload the theme
754
- setGlobalTheme(loadTheme(currentThemeName!));
905
+ setGlobalTheme(loadTheme(currentThemeName!, undefined, currentThemeAccent));
755
906
  // Notify callbacks (to invalidate UI)
756
907
  onThemeChangeCallbacks.forEach(cb => cb());
757
908
  } catch (_error) {
@@ -763,7 +914,7 @@ function startThemeWatcher(): void {
763
914
  setTimeout(() => {
764
915
  if (!fs.existsSync(themeFile)) {
765
916
  currentThemeName = "dark";
766
- setGlobalTheme(loadTheme("dark"));
917
+ setGlobalTheme(loadTheme("dark", undefined, currentThemeAccent));
767
918
  if (themeWatcher) {
768
919
  themeWatcher.close();
769
920
  themeWatcher = undefined;
@@ -842,7 +993,7 @@ function ansi256ToHex(index: number): string {
842
993
  export function getResolvedThemeColors(themeName?: string): Record<string, string> {
843
994
  const name = themeName ?? currentThemeName ?? getDefaultTheme();
844
995
  const isLight = name === "light";
845
- const themeJson = loadThemeJson(name);
996
+ const themeJson = applyThemeAccent(loadThemeJson(name), currentThemeAccent);
846
997
  const resolved = resolveThemeColors(themeJson.colors, themeJson.vars);
847
998
 
848
999
  // Default text color for empty values (terminal uses default fg color)
@@ -873,7 +1024,7 @@ export function getThemeExportColors(themeName?: string): {
873
1024
  } {
874
1025
  const name = themeName ?? currentThemeName ?? getDefaultTheme();
875
1026
  try {
876
- const themeJson = loadThemeJson(name);
1027
+ const themeJson = applyThemeAccent(loadThemeJson(name), currentThemeAccent);
877
1028
  const exportSection = themeJson.export;
878
1029
  if (!exportSection) return {};
879
1030
 
@@ -24,6 +24,7 @@ const dark: ThemeJson = {
24
24
  green: "#b5bd68",
25
25
  red: "#cc6666",
26
26
  yellow: "#facc15",
27
+ violet: "#a78bfa",
27
28
  gray: "#bec8d6",
28
29
  dimGray: "#8793a3",
29
30
  darkGray: "#505050",
@@ -48,6 +49,7 @@ const dark: ThemeJson = {
48
49
  success: "green",
49
50
  error: "red",
50
51
  warning: "yellow",
52
+ violet: "violet",
51
53
  muted: "gray",
52
54
  dim: "dimGray",
53
55
  text: "",
@@ -119,6 +121,7 @@ const light: ThemeJson = {
119
121
  red: "#aa5555",
120
122
  yellow: "#eab308",
121
123
  warning: "#7a5a00",
124
+ violet: "#8b5cf6",
122
125
  mediumGray: "#6c6c6c",
123
126
  dimGray: "#767676",
124
127
  lightGray: "#b0b0b0",
@@ -142,6 +145,7 @@ const light: ThemeJson = {
142
145
  success: "green",
143
146
  error: "red",
144
147
  warning: "warning",
148
+ violet: "violet",
145
149
  muted: "mediumGray",
146
150
  dim: "dimGray",
147
151
  text: "",
@@ -28,6 +28,7 @@ export declare class Editor implements Component, Focusable {
28
28
  private lastWidth;
29
29
  private scrollOffset;
30
30
  borderColor: (str: string) => string;
31
+ bottomHint: string;
31
32
  private autocompleteProvider?;
32
33
  private autocompleteList?;
33
34
  private autocompleteState;
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAgC,MAAM,oBAAoB,CAAC;AAI7F,OAAO,EAAE,KAAK,SAAS,EAAiB,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAGpF,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIpE;;;GAGG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AA6FD,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,UAAU,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,MAAO,YAAW,SAAS,EAAE,SAAS;IAClD,OAAO,CAAC,KAAK,CAIX;IAEF,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAS;IAEzB,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IACnB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAa;IAG7B,OAAO,CAAC,SAAS,CAAc;IAG/B,OAAO,CAAC,YAAY,CAAa;IAG1B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAG5C,OAAO,CAAC,oBAAoB,CAAC,CAAuB;IACpD,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,OAAO,CAAC,iBAAiB,CAAoC;IAC7D,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,sBAAsB,CAAa;IAI3C,OAAO,CAAC,yBAAyB,CAA8C;IAC/E,OAAO,CAAC,4BAA4B,CAAuB;IAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAO;IAGvD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,YAAY,CAAa;IAGjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAkB;IAGnC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAc;IAGlC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,UAAU,CAA8C;IAGhE,OAAO,CAAC,QAAQ,CAAuC;IAGvD,OAAO,CAAC,kBAAkB,CAAuB;IAGjD,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAmH;IACtI,OAAO,CAAC,kBAAkB,CAA4E;IAE/F,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,aAAa,EAAE,OAAO,CAAS;gBAE1B,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB;IAUrE,WAAW,IAAI,MAAM;IAIrB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQlC,yBAAyB,IAAI,MAAM;IAInC,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQnD,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAI7D,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,cAAc;IAatB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAYhC,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,eAAe;IAsBvB,kFAAkF;IAClF,OAAO,CAAC,eAAe;IAUvB,UAAU,IAAI,IAAI;IAIlB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAyH/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiT/B,OAAO,CAAC,UAAU;IAwFlB,OAAO,IAAI,MAAM;IAOjB;;;OAGG;IACH,eAAe,IAAI,MAAM;IASzB,QAAQ,IAAI,MAAM,EAAE;IAIpB,SAAS,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAI1C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAU3B;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQtC;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IA0ClC,OAAO,CAAC,eAAe;IAkEvB;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAapC,OAAO,CAAC,WAAW;IA0DnB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,4BAA4B;IAWpC,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,eAAe;IAuDvB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAKpB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,yBAAyB;IAiCjC,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,mBAAmB;IA2C3B,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,mBAAmB;IAgD3B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAqC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,UAAU;IAmDlB;;;OAGG;IACH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,iBAAiB;IA6CzB;;OAEG;IACH,OAAO,CAAC,IAAI;IAWZ;;;OAGG;IACH,OAAO,CAAC,OAAO;IAmBf;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,IAAI;IAUZ;;;OAGG;IACH,OAAO,CAAC,UAAU;IA8BlB,OAAO,CAAC,gBAAgB;IA8CxB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,kDAAkD;IAU1D,OAAO,CAAC,mCAAmC;IAW3C;;;;;;;;;;OAUG;IACH,OAAO,CAAC,6BAA6B;IAkBrC,OAAO,CAAC,sBAAsB;IAoC9B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,4BAA4B;IASpC,OAAO,CAAC,qBAAqB;IAqD7B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,yBAAyB;IAQ1B,OAAO,IAAI,IAAI;IAIf,qBAAqB,IAAI,OAAO;IAIvC,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,sCAAsC;IAgB9C,OAAO,CAAC,4BAA4B;CA+BpC"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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"}
@@ -83,6 +83,8 @@ export class Editor {
83
83
  this.lastWidth = 80;
84
84
  // Vertical scrolling support
85
85
  this.scrollOffset = 0;
86
+ // Optional hint rendered in the bottom border line (right-aligned, already styled)
87
+ this.bottomHint = "";
86
88
  this.autocompleteState = null;
87
89
  this.autocompletePrefix = "";
88
90
  this.autocompleteMaxVisible = 5;
@@ -320,6 +322,27 @@ export class Editor {
320
322
  const remaining = width - visibleWidth(indicator);
321
323
  result.push(this.borderColor(indicator + "─".repeat(Math.max(0, remaining))));
322
324
  }
325
+ else if (this.bottomHint) {
326
+ // Embed hint right-aligned in the bottom border: ─────── hint ─
327
+ // Apply borderColor only to the dashes so the hint's own styling is preserved.
328
+ const hintVisible = visibleWidth(this.bottomHint);
329
+ const minDashes = 1;
330
+ const separatorWidth = 1; // single space on each side of hint
331
+ const totalFixed = hintVisible + separatorWidth * 2 + minDashes * 2;
332
+ if (width >= totalFixed) {
333
+ const leftDashes = Math.floor((width - hintVisible - separatorWidth * 2) * 0.75);
334
+ const rightDashes = Math.max(minDashes, width - hintVisible - separatorWidth * 2 - leftDashes);
335
+ const line = this.borderColor("─".repeat(leftDashes)) +
336
+ " " +
337
+ this.bottomHint +
338
+ " " +
339
+ this.borderColor("─".repeat(rightDashes));
340
+ result.push(line);
341
+ }
342
+ else {
343
+ result.push(horizontal.repeat(width));
344
+ }
345
+ }
323
346
  else {
324
347
  result.push(horizontal.repeat(width));
325
348
  }