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.
- package/README.md +2 -1
- package/dist/bedrock-auth.d.ts +25 -0
- package/dist/bedrock-auth.js +59 -0
- package/dist/headless.js +8 -3
- package/dist/loader.js +1 -0
- package/dist/onboarding-llm.d.ts +37 -0
- package/dist/onboarding-llm.js +64 -0
- package/dist/onboarding.d.ts +2 -14
- package/dist/onboarding.js +146 -71
- package/dist/pi-migration.js +1 -0
- package/dist/resources/extensions/memory/auto-extract.js +21 -3
- package/dist/resources/extensions/memory/dream.js +703 -0
- package/dist/resources/extensions/memory/extension-manifest.json +2 -2
- package/dist/resources/extensions/memory/index.js +115 -8
- package/dist/resources/extensions/slash-commands/extension-manifest.json +10 -10
- package/dist/resources/extensions/slash-commands/index.js +0 -4
- package/dist/resources/extensions/slash-commands/plan.js +181 -45
- package/dist/resources/extensions/subagent/agents.js +14 -1
- package/dist/resources/extensions/subagent/configured-model.js +3 -2
- package/dist/resources/extensions/subagent/index.js +34 -28
- package/dist/resources/extensions/subagent/launch-helpers.js +24 -0
- package/dist/resources/extensions/subagent/model-resolution.js +41 -3
- package/dist/resources/extensions/usage/extension-manifest.json +11 -0
- package/dist/resources/extensions/usage/index.js +346 -0
- package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/SKILL.md +6 -6
- package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
- package/{src/resources/skills/create-gsd-extension → dist/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
- package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
- package/dist/resources/skills/teams-debug/SKILL.md +5 -6
- package/dist/resources/skills/teams-document/SKILL.md +1 -2
- package/dist/resources/skills/teams-plan/SKILL.md +3 -4
- package/dist/resources/skills/teams-run/SKILL.md +3 -4
- package/dist/resources/skills/teams-verify/SKILL.md +4 -5
- package/dist/startup-model-validation.js +1 -0
- package/dist/welcome-screen.js +13 -11
- package/dist/wizard.js +12 -0
- package/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +688 -409
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +761 -488
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +40 -18
- package/packages/pi-ai/src/models.generated.ts +759 -486
- package/packages/pi-coding-agent/dist/cli/config-selector.js +1 -1
- package/packages/pi-coding-agent/dist/cli/config-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +1 -2
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +6 -30
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +44 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +9 -5
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +3 -2
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +1 -1
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +15 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +10 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -22
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +18 -5
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +139 -20
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/cli/config-selector.ts +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +5 -28
- package/packages/pi-coding-agent/src/core/settings-manager.ts +52 -1
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +18 -5
- package/packages/pi-coding-agent/src/core/skills.ts +3 -2
- package/packages/pi-coding-agent/src/index.ts +1 -1
- package/packages/pi-coding-agent/src/main.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +2 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +12 -13
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +39 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +46 -20
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +171 -20
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +4 -0
- package/packages/pi-tui/dist/components/editor.d.ts +1 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +23 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/src/components/editor.ts +23 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +18 -5
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +139 -20
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +4 -0
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/memory/auto-extract.ts +23 -3
- package/src/resources/extensions/memory/dream.ts +814 -0
- package/src/resources/extensions/memory/extension-manifest.json +2 -2
- package/src/resources/extensions/memory/index.ts +134 -13
- package/src/resources/extensions/memory/tests/auto-extract.test.ts +10 -2
- package/src/resources/extensions/memory/tests/dream.test.ts +142 -0
- package/src/resources/extensions/slash-commands/extension-manifest.json +10 -10
- package/src/resources/extensions/slash-commands/index.ts +3 -7
- package/src/resources/extensions/slash-commands/plan.ts +192 -46
- package/src/resources/extensions/subagent/agents.ts +11 -1
- package/src/resources/extensions/subagent/configured-model.ts +3 -2
- package/src/resources/extensions/subagent/index.ts +38 -30
- package/src/resources/extensions/subagent/launch-helpers.ts +30 -0
- package/src/resources/extensions/subagent/model-resolution.ts +40 -3
- package/src/resources/extensions/usage/extension-manifest.json +11 -0
- package/src/resources/extensions/usage/index.ts +441 -0
- package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/SKILL.md +6 -6
- package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/custom-tools.md +1 -1
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extension-lifecycle.md +2 -2
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensioncontext-reference.md +1 -1
- package/{dist/resources/skills/create-gsd-extension → src/resources/skills/create-lsd-extension}/references/key-rules-gotchas.md +4 -4
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/packaging-distribution.md +6 -6
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/create-extension.md +3 -3
- package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/debug-extension.md +5 -5
- package/src/resources/skills/teams-debug/SKILL.md +5 -6
- package/src/resources/skills/teams-document/SKILL.md +1 -2
- package/src/resources/skills/teams-plan/SKILL.md +3 -4
- package/src/resources/skills/teams-run/SKILL.md +3 -4
- package/src/resources/skills/teams-verify/SKILL.md +4 -5
- package/dist/resources/extensions/slash-commands/create-extension.js +0 -264
- package/dist/resources/extensions/slash-commands/create-slash-command.js +0 -208
- package/src/resources/extensions/slash-commands/create-extension.ts +0 -297
- package/src/resources/extensions/slash-commands/create-slash-command.ts +0 -234
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
- /package/dist/resources/skills/{create-gsd-extension → create-lsd-extension}/workflows/add-capability.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/compaction-session-control.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-commands.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-rendering.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/custom-ui.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/events-reference.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/extensionapi-reference.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/mode-behavior.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/model-provider-management.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/remote-execution-overrides.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/state-management.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/references/system-prompt-modification.md +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/extension-skeleton.ts +0 -0
- /package/src/resources/skills/{create-gsd-extension → create-lsd-extension}/templates/stateful-tool-skeleton.ts +0 -0
- /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
|
|
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
|
|
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:
|
|
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
|
-
|
|
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;
|
|
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
|
}
|