@vibesdotdev/terminal-client 0.0.0-stage → 1.0.0-rc.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/LICENSE +18 -0
- package/README.md +102 -2
- package/dist/ansi/index.d.ts +11 -0
- package/dist/ansi/index.d.ts.map +1 -0
- package/dist/ansi/index.js +11 -0
- package/dist/ansi/index.js.map +1 -0
- package/dist/ansi/keymap.d.ts +77 -0
- package/dist/ansi/keymap.d.ts.map +1 -0
- package/dist/ansi/keymap.js +257 -0
- package/dist/ansi/keymap.js.map +1 -0
- package/dist/api-client-plugin.d.ts +4 -0
- package/dist/api-client-plugin.d.ts.map +1 -0
- package/dist/api-client-plugin.js +16 -0
- package/dist/api-client-plugin.js.map +1 -0
- package/dist/client/http-session.d.ts +44 -0
- package/dist/client/http-session.d.ts.map +1 -0
- package/dist/client/http-session.js +457 -0
- package/dist/client/http-session.js.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client.d.ts +56 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +169 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/pty-bridge/index.d.ts +15 -0
- package/dist/pty-bridge/index.d.ts.map +1 -0
- package/dist/pty-bridge/index.js +15 -0
- package/dist/pty-bridge/index.js.map +1 -0
- package/dist/pty-bridge/protocol.d.ts +6 -0
- package/dist/pty-bridge/protocol.d.ts.map +1 -0
- package/dist/pty-bridge/protocol.js +6 -0
- package/dist/pty-bridge/protocol.js.map +1 -0
- package/dist/pty-bridge/server.d.ts +7 -0
- package/dist/pty-bridge/server.d.ts.map +1 -0
- package/dist/pty-bridge/server.js +9 -0
- package/dist/pty-bridge/server.js.map +1 -0
- package/dist/remote-session.d.ts +51 -0
- package/dist/remote-session.d.ts.map +1 -0
- package/dist/remote-session.js +326 -0
- package/dist/remote-session.js.map +1 -0
- package/dist/schemas/http.d.ts +61 -0
- package/dist/schemas/http.d.ts.map +1 -0
- package/dist/schemas/http.js +45 -0
- package/dist/schemas/http.js.map +1 -0
- package/dist/schemas/remote.d.ts +25 -0
- package/dist/schemas/remote.d.ts.map +1 -0
- package/dist/schemas/remote.js +23 -0
- package/dist/schemas/remote.js.map +1 -0
- package/dist/schemas/session.d.ts +26 -0
- package/dist/schemas/session.d.ts.map +1 -0
- package/dist/schemas/session.js +17 -0
- package/dist/schemas/session.js.map +1 -0
- package/dist/schemas/store.d.ts +29 -0
- package/dist/schemas/store.d.ts.map +1 -0
- package/dist/schemas/store.js +22 -0
- package/dist/schemas/store.js.map +1 -0
- package/dist/schemas/terminal.d.ts +296 -0
- package/dist/schemas/terminal.d.ts.map +1 -0
- package/dist/schemas/terminal.js +243 -0
- package/dist/schemas/terminal.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +9 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/session-store.d.ts +176 -0
- package/dist/server/session-store.d.ts.map +1 -0
- package/dist/server/session-store.js +462 -0
- package/dist/server/session-store.js.map +1 -0
- package/dist/server/sse-stream.d.ts +32 -0
- package/dist/server/sse-stream.d.ts.map +1 -0
- package/dist/server/sse-stream.js +87 -0
- package/dist/server/sse-stream.js.map +1 -0
- package/dist/svelte/HostPicker.svelte +263 -0
- package/dist/svelte/HostPicker.svelte.d.ts +36 -0
- package/dist/svelte/HostPicker.svelte.d.ts.map +1 -0
- package/dist/svelte/README.md +75 -0
- package/dist/svelte/ReconnectBanner.svelte +88 -0
- package/dist/svelte/ReconnectBanner.svelte.d.ts +16 -0
- package/dist/svelte/ReconnectBanner.svelte.d.ts.map +1 -0
- package/dist/svelte/SessionTabs.svelte +192 -0
- package/dist/svelte/SessionTabs.svelte.d.ts +17 -0
- package/dist/svelte/SessionTabs.svelte.d.ts.map +1 -0
- package/dist/svelte/Terminal.svelte +567 -0
- package/dist/svelte/Terminal.svelte.d.ts +25 -0
- package/dist/svelte/Terminal.svelte.d.ts.map +1 -0
- package/dist/svelte/TerminalHostWorkspace.svelte +264 -0
- package/dist/svelte/TerminalHostWorkspace.svelte.d.ts +59 -0
- package/dist/svelte/TerminalHostWorkspace.svelte.d.ts.map +1 -0
- package/dist/svelte/TerminalMobileToolbar.svelte +56 -0
- package/dist/svelte/TerminalMobileToolbar.svelte.d.ts +14 -0
- package/dist/svelte/TerminalMobileToolbar.svelte.d.ts.map +1 -0
- package/dist/svelte/TerminalWorkspace.svelte +562 -0
- package/dist/svelte/TerminalWorkspace.svelte.d.ts +25 -0
- package/dist/svelte/TerminalWorkspace.svelte.d.ts.map +1 -0
- package/dist/svelte/ambient.d.ts +9 -0
- package/dist/svelte/docs/terminal-svelte.docs.descriptor.d.ts +4 -0
- package/dist/svelte/docs/terminal-svelte.docs.descriptor.d.ts.map +1 -0
- package/dist/svelte/docs/terminal-svelte.docs.descriptor.js +74 -0
- package/dist/svelte/index.d.ts +29 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +28 -0
- package/dist/svelte/styles.css +8 -0
- package/dist/svelte/terminal-host-workspace.d.ts +152 -0
- package/dist/svelte/terminal-host-workspace.d.ts.map +1 -0
- package/dist/svelte/terminal-host-workspace.js +335 -0
- package/dist/svelte/terminal-session-authority.d.ts +17 -0
- package/dist/svelte/terminal-session-authority.d.ts.map +1 -0
- package/dist/svelte/terminal-session-authority.js +25 -0
- package/dist/svelte/terminal-svelte.plugin.d.ts +21 -0
- package/dist/svelte/terminal-svelte.plugin.d.ts.map +1 -0
- package/dist/svelte/terminal-svelte.plugin.js +53 -0
- package/dist/svelte/terminal-theme.d.ts +11 -0
- package/dist/svelte/terminal-theme.d.ts.map +1 -0
- package/dist/svelte/terminal-theme.js +116 -0
- package/dist/svelte/tool-widgets/TerminalToolCard.svelte +65 -0
- package/dist/svelte/tool-widgets/TerminalToolCard.svelte.d.ts +5 -0
- package/dist/svelte/tool-widgets/TerminalToolCard.svelte.d.ts.map +1 -0
- package/dist/svelte/tool-widgets/terminal-tool-card.d.ts +25 -0
- package/dist/svelte/tool-widgets/terminal-tool-card.d.ts.map +1 -0
- package/dist/svelte/tool-widgets/terminal-tool-card.js +116 -0
- package/dist/svelte/types.d.ts +160 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +51 -0
- package/dist/svelte/workspace.d.ts +3 -0
- package/dist/svelte/workspace.d.ts.map +1 -0
- package/dist/svelte/workspace.js +2 -0
- package/dist/terminal-client.plugin.d.ts +3 -0
- package/dist/terminal-client.plugin.d.ts.map +1 -0
- package/dist/terminal-client.plugin.js +3 -0
- package/dist/terminal-client.plugin.js.map +1 -0
- package/dist/terminal-runtime.d.ts +30 -0
- package/dist/terminal-runtime.d.ts.map +1 -0
- package/dist/terminal-runtime.js +673 -0
- package/dist/terminal-runtime.js.map +1 -0
- package/dist/terminal.consumer.plugin.d.ts +14 -0
- package/dist/terminal.consumer.plugin.d.ts.map +1 -0
- package/dist/terminal.consumer.plugin.js +31 -0
- package/dist/terminal.consumer.plugin.js.map +1 -0
- package/dist/tools/terminal.impl.consumer.d.ts +11 -0
- package/dist/tools/terminal.impl.consumer.d.ts.map +1 -0
- package/dist/tools/terminal.impl.consumer.js +20 -0
- package/dist/tools/terminal.impl.consumer.js.map +1 -0
- package/dist/tools/terminal.schemas.d.ts +3 -0
- package/dist/tools/terminal.schemas.d.ts.map +1 -0
- package/dist/tools/terminal.schemas.js +3 -0
- package/dist/tools/terminal.schemas.js.map +1 -0
- package/dist/tools/terminal.unified.descriptor.d.ts +218 -0
- package/dist/tools/terminal.unified.descriptor.d.ts.map +1 -0
- package/dist/tools/terminal.unified.descriptor.js +36 -0
- package/dist/tools/terminal.unified.descriptor.js.map +1 -0
- package/dist/tui/index.d.ts +9 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +8 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/terminal-open.descriptor.d.ts +9 -0
- package/dist/tui/terminal-open.descriptor.d.ts.map +1 -0
- package/dist/tui/terminal-open.descriptor.js +18 -0
- package/dist/tui/terminal-open.descriptor.js.map +1 -0
- package/dist/tui/terminal-open.impl.consumer.d.ts +9 -0
- package/dist/tui/terminal-open.impl.consumer.d.ts.map +1 -0
- package/dist/tui/terminal-open.impl.consumer.js +13 -0
- package/dist/tui/terminal-open.impl.consumer.js.map +1 -0
- package/dist/tui/terminal-registry.descriptor.d.ts +11 -0
- package/dist/tui/terminal-registry.descriptor.d.ts.map +1 -0
- package/dist/tui/terminal-registry.descriptor.js +17 -0
- package/dist/tui/terminal-registry.descriptor.js.map +1 -0
- package/dist/tui/terminal-registry.impl.consumer.d.ts +71 -0
- package/dist/tui/terminal-registry.impl.consumer.d.ts.map +1 -0
- package/dist/tui/terminal-registry.impl.consumer.js +190 -0
- package/dist/tui/terminal-registry.impl.consumer.js.map +1 -0
- package/dist/tui/terminal-tui.plugin.d.ts +10 -0
- package/dist/tui/terminal-tui.plugin.d.ts.map +1 -0
- package/dist/tui/terminal-tui.plugin.js +32 -0
- package/dist/tui/terminal-tui.plugin.js.map +1 -0
- package/dist/tui/terminal.descriptor.d.ts +10 -0
- package/dist/tui/terminal.descriptor.d.ts.map +1 -0
- package/dist/tui/terminal.descriptor.js +25 -0
- package/dist/tui/terminal.descriptor.js.map +1 -0
- package/dist/tui/terminal.impl.consumer.d.ts +14 -0
- package/dist/tui/terminal.impl.consumer.d.ts.map +1 -0
- package/dist/tui/terminal.impl.consumer.js +189 -0
- package/dist/tui/terminal.impl.consumer.js.map +1 -0
- package/dist/tui/terminal.state-key.d.ts +30 -0
- package/dist/tui/terminal.state-key.d.ts.map +1 -0
- package/dist/tui/terminal.state-key.js +9 -0
- package/dist/tui/terminal.state-key.js.map +1 -0
- package/dist/tui/terminal.state.d.ts +152 -0
- package/dist/tui/terminal.state.d.ts.map +1 -0
- package/dist/tui/terminal.state.js +149 -0
- package/dist/tui/terminal.state.js.map +1 -0
- package/dist/workspace.d.ts +155 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +292 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +228 -4
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createRuntimeImplementation, createRuntimePlugin, loader, settle } from '@vibesdotdev/kernel';
|
|
2
|
+
import terminalSvelteDocsDescriptor from "./docs/terminal-svelte.docs.descriptor.js";
|
|
3
|
+
const loadTerminalToolCard = () => import('./tool-widgets/TerminalToolCard.svelte');
|
|
4
|
+
// Kit's widget registry loads lazily: a top-level await here would suspend every importer and,
|
|
5
|
+
// inside a module cycle, let WebKit run a dependent before this module's bindings exist.
|
|
6
|
+
const kitToolWidgets = settle(() => import('@vibesdotdev/kit/components/tool-widgets'));
|
|
7
|
+
function registerKitToolWidget(...args) {
|
|
8
|
+
void kitToolWidgets.then((kit) => {
|
|
9
|
+
if (kit.ok)
|
|
10
|
+
kit.value.registerToolWidget(...args);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/** Settles after every widget registration this module queued so far (none when Kit is absent). */
|
|
14
|
+
export function toolWidgetsRegistered() {
|
|
15
|
+
return kitToolWidgets.then(() => undefined);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Designed Kit card for `tools/tool:terminal`. Queued as `tools/ui` when the
|
|
19
|
+
* kind is not yet registered so docs-only hosts can still load this plugin.
|
|
20
|
+
*/
|
|
21
|
+
export const terminalSvelteWidgetDescriptor = {
|
|
22
|
+
id: 'terminal.svelte-widget',
|
|
23
|
+
kind: 'tools/ui',
|
|
24
|
+
name: 'Terminal Svelte Widget',
|
|
25
|
+
description: 'Renders terminal tool results: cwd, command/session, and an output excerpt.',
|
|
26
|
+
surfaces: ['web'],
|
|
27
|
+
role: 'widget',
|
|
28
|
+
targetToolId: 'terminal',
|
|
29
|
+
targetId: 'terminal',
|
|
30
|
+
enabled: true
|
|
31
|
+
};
|
|
32
|
+
export function registerTerminalSvelteToolWidget() {
|
|
33
|
+
registerKitToolWidget?.(terminalSvelteWidgetDescriptor.targetToolId, loadTerminalToolCard);
|
|
34
|
+
}
|
|
35
|
+
registerTerminalSvelteToolWidget();
|
|
36
|
+
export const terminalSveltePlugin = createRuntimePlugin({
|
|
37
|
+
id: '@vibesdotdev/terminal-client/svelte',
|
|
38
|
+
name: 'Terminal Svelte',
|
|
39
|
+
description: 'Svelte terminal surfaces over runtime-resolved interactive execution sessions, including the designed terminal tool card.',
|
|
40
|
+
descriptors: [terminalSvelteDocsDescriptor, terminalSvelteWidgetDescriptor],
|
|
41
|
+
loaders: [
|
|
42
|
+
loader(terminalSvelteWidgetDescriptor.id, { kind: 'tools/ui', scope: 'browser' }, async () => {
|
|
43
|
+
registerTerminalSvelteToolWidget();
|
|
44
|
+
const module = await loadTerminalToolCard();
|
|
45
|
+
return createRuntimeImplementation({
|
|
46
|
+
kind: 'tools/ui',
|
|
47
|
+
id: terminalSvelteWidgetDescriptor.id,
|
|
48
|
+
implementation: { web: { component: module.default } }
|
|
49
|
+
});
|
|
50
|
+
})
|
|
51
|
+
]
|
|
52
|
+
});
|
|
53
|
+
export default terminalSveltePlugin;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type TerminalTheme } from './types.ts';
|
|
2
|
+
interface TerminalAppearance {
|
|
3
|
+
theme: TerminalTheme;
|
|
4
|
+
fontFamily: string;
|
|
5
|
+
}
|
|
6
|
+
/** Resolve CSS through the browser: xterm cannot consume var() or oklch() itself. */
|
|
7
|
+
export declare function readTerminalAppearance(host: HTMLElement): TerminalAppearance;
|
|
8
|
+
/** Follow ancestor appearance, asynchronously loaded theme CSS, and font metrics. */
|
|
9
|
+
export declare function observeTerminalAppearance(host: HTMLElement, refresh: () => void): () => void;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=terminal-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-theme.d.ts","sourceRoot":"","sources":["../../src/svelte/terminal-theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAoDtF,UAAU,kBAAkB;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,kBAAkB,CAuB5E;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAkC5F"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { normalizeVibesMonacoColor } from '@vibesdotdev/kit/components/code/monaco-theme.js';
|
|
2
|
+
import { DEFAULT_FONT, DEFAULT_TERMINAL_THEME } from "./types.js";
|
|
3
|
+
const tokens = {
|
|
4
|
+
background: '--background',
|
|
5
|
+
foreground: '--foreground',
|
|
6
|
+
cursor: '--ring',
|
|
7
|
+
cursorAccent: '--background',
|
|
8
|
+
selectionBackground: '--accent',
|
|
9
|
+
selectionForeground: '--accent-foreground',
|
|
10
|
+
black: '--background',
|
|
11
|
+
red: '--destructive',
|
|
12
|
+
green: '--success',
|
|
13
|
+
yellow: '--warning',
|
|
14
|
+
blue: '--info',
|
|
15
|
+
magenta: '--primary',
|
|
16
|
+
cyan: '--info',
|
|
17
|
+
white: '--foreground',
|
|
18
|
+
brightBlack: '--muted-foreground',
|
|
19
|
+
brightRed: '--destructive',
|
|
20
|
+
brightGreen: '--success',
|
|
21
|
+
brightYellow: '--warning',
|
|
22
|
+
brightBlue: '--info',
|
|
23
|
+
brightMagenta: '--primary',
|
|
24
|
+
brightCyan: '--info',
|
|
25
|
+
brightWhite: '--foreground'
|
|
26
|
+
};
|
|
27
|
+
const terminalThemeKeys = [
|
|
28
|
+
'background',
|
|
29
|
+
'foreground',
|
|
30
|
+
'cursor',
|
|
31
|
+
'cursorAccent',
|
|
32
|
+
'selectionBackground',
|
|
33
|
+
'selectionForeground',
|
|
34
|
+
'black',
|
|
35
|
+
'red',
|
|
36
|
+
'green',
|
|
37
|
+
'yellow',
|
|
38
|
+
'blue',
|
|
39
|
+
'magenta',
|
|
40
|
+
'cyan',
|
|
41
|
+
'white',
|
|
42
|
+
'brightBlack',
|
|
43
|
+
'brightRed',
|
|
44
|
+
'brightGreen',
|
|
45
|
+
'brightYellow',
|
|
46
|
+
'brightBlue',
|
|
47
|
+
'brightMagenta',
|
|
48
|
+
'brightCyan',
|
|
49
|
+
'brightWhite'
|
|
50
|
+
];
|
|
51
|
+
/** Resolve CSS through the browser: xterm cannot consume var() or oklch() itself. */
|
|
52
|
+
export function readTerminalAppearance(host) {
|
|
53
|
+
const document = host.ownerDocument;
|
|
54
|
+
const view = document.defaultView;
|
|
55
|
+
if (!view)
|
|
56
|
+
return { theme: { ...DEFAULT_TERMINAL_THEME }, fontFamily: DEFAULT_FONT.family };
|
|
57
|
+
const probe = document.createElement('span');
|
|
58
|
+
probe.style.cssText =
|
|
59
|
+
'position:absolute;visibility:hidden;pointer-events:none;width:0;height:0;overflow:hidden';
|
|
60
|
+
probe.setAttribute('aria-hidden', 'true');
|
|
61
|
+
host.appendChild(probe);
|
|
62
|
+
try {
|
|
63
|
+
const theme = {};
|
|
64
|
+
for (const key of terminalThemeKeys) {
|
|
65
|
+
const terminalToken = key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
|
|
66
|
+
probe.style.color = `var(--terminal-${terminalToken}, var(${tokens[key]}, ${DEFAULT_TERMINAL_THEME[key]}))`;
|
|
67
|
+
theme[key] =
|
|
68
|
+
normalizeVibesMonacoColor(view.getComputedStyle(probe).color, document) ??
|
|
69
|
+
DEFAULT_TERMINAL_THEME[key];
|
|
70
|
+
}
|
|
71
|
+
probe.style.fontFamily = `var(--vibes-font-mono, var(--font-mono, ${DEFAULT_FONT.family}))`;
|
|
72
|
+
return { theme, fontFamily: view.getComputedStyle(probe).fontFamily };
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
probe.remove();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Follow ancestor appearance, asynchronously loaded theme CSS, and font metrics. */
|
|
79
|
+
export function observeTerminalAppearance(host, refresh) {
|
|
80
|
+
const document = host.ownerDocument;
|
|
81
|
+
const view = document.defaultView;
|
|
82
|
+
if (!view)
|
|
83
|
+
return () => { };
|
|
84
|
+
let frame = null;
|
|
85
|
+
const schedule = () => {
|
|
86
|
+
if (frame !== null)
|
|
87
|
+
return;
|
|
88
|
+
frame = view.requestAnimationFrame(() => {
|
|
89
|
+
frame = null;
|
|
90
|
+
refresh();
|
|
91
|
+
});
|
|
92
|
+
};
|
|
93
|
+
const observer = new view.MutationObserver(schedule);
|
|
94
|
+
for (let element = host; element; element = element.parentElement) {
|
|
95
|
+
observer.observe(element, { attributes: true });
|
|
96
|
+
}
|
|
97
|
+
if (document.head)
|
|
98
|
+
observer.observe(document.head, {
|
|
99
|
+
childList: true,
|
|
100
|
+
subtree: true,
|
|
101
|
+
attributes: true,
|
|
102
|
+
characterData: true
|
|
103
|
+
});
|
|
104
|
+
const media = view.matchMedia('(prefers-color-scheme: dark)');
|
|
105
|
+
media.addEventListener('change', schedule);
|
|
106
|
+
document.addEventListener('load', schedule, true);
|
|
107
|
+
document.fonts?.addEventListener('loadingdone', schedule);
|
|
108
|
+
return () => {
|
|
109
|
+
observer.disconnect();
|
|
110
|
+
media.removeEventListener('change', schedule);
|
|
111
|
+
document.removeEventListener('load', schedule, true);
|
|
112
|
+
document.fonts?.removeEventListener('loadingdone', schedule);
|
|
113
|
+
if (frame !== null)
|
|
114
|
+
view.cancelAnimationFrame(frame);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* Designed Kit card for the `terminal` tool: cwd, command/session, and a
|
|
4
|
+
* bounded output excerpt through CodeViewer.
|
|
5
|
+
*/
|
|
6
|
+
import { CodeViewer } from '@vibesdotdev/kit/components/code';
|
|
7
|
+
import { Badge } from '@vibesdotdev/kit/components/ui/badge';
|
|
8
|
+
import {
|
|
9
|
+
ToolCard,
|
|
10
|
+
ToolCardBody,
|
|
11
|
+
type ToolWidgetProps
|
|
12
|
+
} from '@vibesdotdev/kit/components/tool-widgets';
|
|
13
|
+
import { presentTerminalToolCard } from './terminal-tool-card.js';
|
|
14
|
+
|
|
15
|
+
let { tool, compact = false }: ToolWidgetProps = $props();
|
|
16
|
+
|
|
17
|
+
const view = $derived(presentTerminalToolCard(tool.input, tool.output));
|
|
18
|
+
const exitOk = $derived(view.exitCode === 0 || view.exitCode === null);
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<ToolCard {tool} {compact} title={view.title} icon="lucide:terminal">
|
|
22
|
+
<ToolCardBody {compact}>
|
|
23
|
+
<div class="flex flex-wrap items-center gap-1.5">
|
|
24
|
+
{#if view.action}
|
|
25
|
+
<Badge variant="outline" class="text-caption">{view.action}</Badge>
|
|
26
|
+
{/if}
|
|
27
|
+
{#if view.sessionId}
|
|
28
|
+
<Badge variant="secondary" class="font-mono text-caption">{view.sessionId}</Badge>
|
|
29
|
+
{/if}
|
|
30
|
+
{#if view.exitCode !== null}
|
|
31
|
+
<Badge variant={exitOk ? 'secondary' : 'destructive'} class="text-caption">
|
|
32
|
+
exit {view.exitCode}
|
|
33
|
+
</Badge>
|
|
34
|
+
{/if}
|
|
35
|
+
{#if view.timedOut}
|
|
36
|
+
<Badge variant="warning" class="text-caption">timed out</Badge>
|
|
37
|
+
{/if}
|
|
38
|
+
</div>
|
|
39
|
+
{#if view.cwd}
|
|
40
|
+
<p class="truncate font-mono text-muted-foreground" data-terminal-cwd={view.cwd}>
|
|
41
|
+
cwd {view.cwd}
|
|
42
|
+
</p>
|
|
43
|
+
{/if}
|
|
44
|
+
{#if view.command}
|
|
45
|
+
<p class="truncate font-mono text-foreground" data-terminal-command={view.command}>
|
|
46
|
+
{view.command}
|
|
47
|
+
</p>
|
|
48
|
+
{/if}
|
|
49
|
+
{#if view.excerpt}
|
|
50
|
+
{#if view.truncated}
|
|
51
|
+
<p class="text-caption text-muted-foreground">Showing the tail of the output.</p>
|
|
52
|
+
{/if}
|
|
53
|
+
<CodeViewer
|
|
54
|
+
code={view.excerpt}
|
|
55
|
+
language="plaintext"
|
|
56
|
+
appearance="system"
|
|
57
|
+
maxHeight="16rem"
|
|
58
|
+
minHeight="0"
|
|
59
|
+
showLineNumbers={false}
|
|
60
|
+
/>
|
|
61
|
+
{:else if !tool.error}
|
|
62
|
+
<p class="text-muted-foreground italic">Running…</p>
|
|
63
|
+
{/if}
|
|
64
|
+
</ToolCardBody>
|
|
65
|
+
</ToolCard>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ToolWidgetProps } from '@vibesdotdev/kit/components/tool-widgets';
|
|
2
|
+
declare const TerminalToolCard: import("svelte").Component<ToolWidgetProps, {}, "">;
|
|
3
|
+
type TerminalToolCard = ReturnType<typeof TerminalToolCard>;
|
|
4
|
+
export default TerminalToolCard;
|
|
5
|
+
//# sourceMappingURL=TerminalToolCard.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalToolCard.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/tool-widgets/TerminalToolCard.svelte.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,eAAe,EACpB,MAAM,0CAA0C,CAAC;AAyDnD,QAAA,MAAM,gBAAgB,qDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presentation for the `terminal` Kit ToolCard. Chat and other hosts map a
|
|
3
|
+
* tool call onto `{ input, output }`; this layer extracts cwd, command/session,
|
|
4
|
+
* and a bounded output excerpt for CodeViewer.
|
|
5
|
+
*/
|
|
6
|
+
export declare const TERMINAL_OUTPUT_EXCERPT_MAX_CHARS = 4000;
|
|
7
|
+
export interface TerminalToolCardView {
|
|
8
|
+
title: string;
|
|
9
|
+
action: string;
|
|
10
|
+
cwd: string;
|
|
11
|
+
command: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
excerpt: string;
|
|
14
|
+
truncated: boolean;
|
|
15
|
+
exitCode: number | null;
|
|
16
|
+
timedOut: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface TerminalOutputExcerpt {
|
|
19
|
+
excerpt: string;
|
|
20
|
+
truncated: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function excerptTerminalOutput(output: string, maxChars?: number): TerminalOutputExcerpt;
|
|
23
|
+
export declare function presentTerminalToolCard<Input, Output>(input: Input, output: Output): TerminalToolCardView;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=terminal-tool-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-tool-card.d.ts","sourceRoot":"","sources":["../../../src/svelte/tool-widgets/terminal-tool-card.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,iCAAiC,OAAQ,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACnB;AAqED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,MAAM,EACd,QAAQ,SAAoC,GAC1C,qBAAqB,CAMvB;AAUD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EACpD,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACZ,oBAAoB,CAuBtB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presentation for the `terminal` Kit ToolCard. Chat and other hosts map a
|
|
3
|
+
* tool call onto `{ input, output }`; this layer extracts cwd, command/session,
|
|
4
|
+
* and a bounded output excerpt for CodeViewer.
|
|
5
|
+
*/
|
|
6
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
7
|
+
import * as z from 'zod/v4';
|
|
8
|
+
export const TERMINAL_OUTPUT_EXCERPT_MAX_CHARS = 4_000;
|
|
9
|
+
const NonEmptyStringSchema = z.string().min(1);
|
|
10
|
+
const StringListSchema = z.array(NonEmptyStringSchema);
|
|
11
|
+
const TerminalCardSessionSchema = z.object({
|
|
12
|
+
id: z.string().optional(),
|
|
13
|
+
command: z.string().optional(),
|
|
14
|
+
status: z.string().optional()
|
|
15
|
+
}).passthrough();
|
|
16
|
+
const TerminalCardRecordSchema = z.object({
|
|
17
|
+
action: z.string().optional(),
|
|
18
|
+
cwd: z.string().optional(),
|
|
19
|
+
command: z.union([z.string(), z.array(z.string())]).optional(),
|
|
20
|
+
args: z.array(z.string()).optional(),
|
|
21
|
+
sessionId: z.string().optional(),
|
|
22
|
+
text: z.string().optional(),
|
|
23
|
+
keys: z.array(z.string()).optional(),
|
|
24
|
+
output: z.string().optional(),
|
|
25
|
+
stdout: z.string().optional(),
|
|
26
|
+
sessions: z.array(TerminalCardSessionSchema).optional(),
|
|
27
|
+
exitCode: z.number().finite().nullable().optional(),
|
|
28
|
+
timedOut: z.boolean().optional()
|
|
29
|
+
}).passthrough();
|
|
30
|
+
function parseRecord(value) {
|
|
31
|
+
try {
|
|
32
|
+
const parsed = TerminalCardRecordSchema.safeParse(value);
|
|
33
|
+
return parsed.success ? parsed.data : null;
|
|
34
|
+
}
|
|
35
|
+
catch (cause) {
|
|
36
|
+
throw new CapabilityError('The terminal tool card data is unreadable.', 'INVALID_INPUT', {
|
|
37
|
+
reason: 'terminal-tool-card-data-invalid',
|
|
38
|
+
retryable: false,
|
|
39
|
+
cause
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function nonEmptyStrings(values) {
|
|
44
|
+
if (values === undefined)
|
|
45
|
+
return [];
|
|
46
|
+
const parsed = StringListSchema.safeParse(values);
|
|
47
|
+
return parsed.success ? parsed.data : [];
|
|
48
|
+
}
|
|
49
|
+
function joinCommand(command, args) {
|
|
50
|
+
if (Array.isArray(command))
|
|
51
|
+
return nonEmptyStrings(command).join(' ');
|
|
52
|
+
const base = command ?? '';
|
|
53
|
+
const extra = nonEmptyStrings(args);
|
|
54
|
+
if (base && extra.length > 0)
|
|
55
|
+
return [base, ...extra].join(' ');
|
|
56
|
+
if (base)
|
|
57
|
+
return base;
|
|
58
|
+
return extra.join(' ');
|
|
59
|
+
}
|
|
60
|
+
function commandFrom(input, output) {
|
|
61
|
+
const fromFields = joinCommand(input?.command ?? output?.command, input?.args);
|
|
62
|
+
if (fromFields)
|
|
63
|
+
return fromFields;
|
|
64
|
+
if (input?.text)
|
|
65
|
+
return input.text;
|
|
66
|
+
return nonEmptyStrings(input?.keys).join(' ');
|
|
67
|
+
}
|
|
68
|
+
function formatSessions(sessions) {
|
|
69
|
+
if (sessions === undefined)
|
|
70
|
+
return '';
|
|
71
|
+
return sessions
|
|
72
|
+
.map((row) => [row.status, row.id, row.command].filter(Boolean).join(' '))
|
|
73
|
+
.filter(Boolean)
|
|
74
|
+
.join('\n');
|
|
75
|
+
}
|
|
76
|
+
export function excerptTerminalOutput(output, maxChars = TERMINAL_OUTPUT_EXCERPT_MAX_CHARS) {
|
|
77
|
+
if (output.length <= maxChars)
|
|
78
|
+
return { excerpt: output, truncated: false };
|
|
79
|
+
let slice = output.slice(output.length - maxChars);
|
|
80
|
+
const newline = slice.indexOf('\n');
|
|
81
|
+
if (newline >= 0 && newline < slice.length - 1)
|
|
82
|
+
slice = slice.slice(newline + 1);
|
|
83
|
+
return { excerpt: slice, truncated: true };
|
|
84
|
+
}
|
|
85
|
+
function excerptFrom(output) {
|
|
86
|
+
const stream = output?.output || output?.stdout || '';
|
|
87
|
+
if (stream)
|
|
88
|
+
return excerptTerminalOutput(stream);
|
|
89
|
+
const sessions = formatSessions(output?.sessions);
|
|
90
|
+
if (sessions)
|
|
91
|
+
return excerptTerminalOutput(sessions);
|
|
92
|
+
return { excerpt: '', truncated: false };
|
|
93
|
+
}
|
|
94
|
+
export function presentTerminalToolCard(input, output) {
|
|
95
|
+
const inRecord = parseRecord(input);
|
|
96
|
+
const outRecord = parseRecord(output);
|
|
97
|
+
const action = outRecord?.action || inRecord?.action || '';
|
|
98
|
+
const cwd = inRecord?.cwd || outRecord?.cwd || '';
|
|
99
|
+
const command = commandFrom(inRecord, outRecord);
|
|
100
|
+
const sessionId = outRecord?.sessionId || inRecord?.sessionId || '';
|
|
101
|
+
const { excerpt, truncated } = excerptFrom(outRecord);
|
|
102
|
+
const exitCode = outRecord?.exitCode ?? null;
|
|
103
|
+
const timedOut = outRecord?.timedOut === true;
|
|
104
|
+
const title = command || (sessionId ? `Session ${sessionId}` : '') || (action ? `Terminal ${action}` : 'Terminal');
|
|
105
|
+
return {
|
|
106
|
+
title,
|
|
107
|
+
action,
|
|
108
|
+
cwd,
|
|
109
|
+
command,
|
|
110
|
+
sessionId,
|
|
111
|
+
excerpt,
|
|
112
|
+
truncated,
|
|
113
|
+
exitCode,
|
|
114
|
+
timedOut
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for `@vibesdotdev/terminal-client/svelte`.
|
|
3
|
+
*
|
|
4
|
+
* The `ExecutionSession` shape is OWNED BY L3 (`@vibesdotdev/kernel/execution`)
|
|
5
|
+
* and consumed here type-only — this lane MUST NOT vary it. We re-export the type
|
|
6
|
+
* so consumers can annotate the `session` prop without a direct dep on
|
|
7
|
+
* runtime-execution if they only need the type.
|
|
8
|
+
*/
|
|
9
|
+
import type { ExecutionSession } from '@vibesdotdev/kernel/execution';
|
|
10
|
+
export type { ExecutionSession };
|
|
11
|
+
/**
|
|
12
|
+
* Terminal color theme tokens. Mirrors the subset of xterm.js's `ITheme` the
|
|
13
|
+
* component forwards. All optional; the component fills a vibes default palette.
|
|
14
|
+
*/
|
|
15
|
+
export interface TerminalTheme {
|
|
16
|
+
background?: string;
|
|
17
|
+
foreground?: string;
|
|
18
|
+
cursor?: string;
|
|
19
|
+
cursorAccent?: string;
|
|
20
|
+
selectionBackground?: string;
|
|
21
|
+
/** Selection foreground color (xterm.js ITheme.selectionForeground). */
|
|
22
|
+
selectionForeground?: string;
|
|
23
|
+
black?: string;
|
|
24
|
+
red?: string;
|
|
25
|
+
green?: string;
|
|
26
|
+
yellow?: string;
|
|
27
|
+
blue?: string;
|
|
28
|
+
magenta?: string;
|
|
29
|
+
cyan?: string;
|
|
30
|
+
white?: string;
|
|
31
|
+
brightBlack?: string;
|
|
32
|
+
brightRed?: string;
|
|
33
|
+
brightGreen?: string;
|
|
34
|
+
brightYellow?: string;
|
|
35
|
+
brightBlue?: string;
|
|
36
|
+
brightMagenta?: string;
|
|
37
|
+
brightCyan?: string;
|
|
38
|
+
brightWhite?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Props for `<Terminal>`.
|
|
42
|
+
*
|
|
43
|
+
* The component is transport-agnostic: it only ever sees an `ExecutionSession`.
|
|
44
|
+
* The consumer resolves that session — locally via
|
|
45
|
+
* `runtime.query('runtime/execution').resolve().session(...)` (or
|
|
46
|
+
* `terminal-client.openLocalSession`), or remotely via
|
|
47
|
+
* `terminal-client.openRemoteSession` (L9b, phase 4). The same component renders
|
|
48
|
+
* both; only `onDisconnect` differs (local sessions never fire it).
|
|
49
|
+
*/
|
|
50
|
+
export interface TerminalProps {
|
|
51
|
+
/**
|
|
52
|
+
* A live execution session whose byte stream this component renders.
|
|
53
|
+
* May be null/absent while the parent is still opening the session — the
|
|
54
|
+
* component boots xterm, fits, reports its grid via `onReady`, and shows the
|
|
55
|
+
* connecting skeleton until a session is attached. Opening the session at
|
|
56
|
+
* the `onReady` dimensions avoids a boot-time PTY resize entirely (Bun TUI
|
|
57
|
+
* children cache `process.stdout.columns`, so a post-boot resize is never
|
|
58
|
+
* observed by them — the session must START at the right size).
|
|
59
|
+
*/
|
|
60
|
+
session?: ExecutionSession | null;
|
|
61
|
+
/**
|
|
62
|
+
* Fired once after the initial fit settles, with the fitted grid size.
|
|
63
|
+
* Parents should open their session with these cols/rows.
|
|
64
|
+
*/
|
|
65
|
+
onReady?: (dims: {
|
|
66
|
+
cols: number;
|
|
67
|
+
rows: number;
|
|
68
|
+
}) => void;
|
|
69
|
+
/**
|
|
70
|
+
* Lock the xterm/PTY grid to these columns. When set with `rows`, FitAddon
|
|
71
|
+
* does not grow the session to the CSS container. Host-fitted columns then
|
|
72
|
+
* match the requested grid (e.g. `?cols=80&rows=24`).
|
|
73
|
+
*/
|
|
74
|
+
cols?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Lock the xterm/PTY grid to these rows. See `cols`.
|
|
77
|
+
*/
|
|
78
|
+
rows?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Fired after xterm has attached a live session and keystrokes/actions can
|
|
81
|
+
* reach the execution session. This is later than `onReady`, which only means
|
|
82
|
+
* the terminal has measured its grid.
|
|
83
|
+
*/
|
|
84
|
+
onInputReady?: () => void;
|
|
85
|
+
/** Theme tokens; defaults to the vibes terminal palette. */
|
|
86
|
+
theme?: TerminalTheme;
|
|
87
|
+
/** Font family / size for the xterm renderer. */
|
|
88
|
+
font?: {
|
|
89
|
+
family?: string;
|
|
90
|
+
size?: number;
|
|
91
|
+
};
|
|
92
|
+
/** Extra class on the host element. */
|
|
93
|
+
class?: string;
|
|
94
|
+
/** Called when the session reports it has exited. */
|
|
95
|
+
onExit?: (result: {
|
|
96
|
+
exitCode: number | null;
|
|
97
|
+
}) => void;
|
|
98
|
+
/**
|
|
99
|
+
* Called when a *proxy* session's transport disconnects (remote only).
|
|
100
|
+
* Local sessions never fire this — remoteness is visible in behavior, not
|
|
101
|
+
* silent (Correction #1).
|
|
102
|
+
*/
|
|
103
|
+
onDisconnect?: (reason: string) => void;
|
|
104
|
+
/**
|
|
105
|
+
* Read-only / observe mode. When true, keyboard input is NOT wired to the
|
|
106
|
+
* session: both PTY write paths (the xterm `onData` handler and the
|
|
107
|
+
* non-printing key-chord handler) are gated off, so the terminal renders the
|
|
108
|
+
* live byte stream but never sends keystrokes. The PTY output, fit/resize, and
|
|
109
|
+
* lifecycle paths are unaffected. Defaults to false (interactive).
|
|
110
|
+
*
|
|
111
|
+
* Non-breaking: existing callers that omit this get the prior interactive
|
|
112
|
+
* behavior.
|
|
113
|
+
*/
|
|
114
|
+
readonly?: boolean;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* A selectable host entry in the picker.
|
|
118
|
+
* `local: true` entries are rendered as "This machine — <name>".
|
|
119
|
+
*/
|
|
120
|
+
export interface HostOption {
|
|
121
|
+
/** Unique host identifier (hostId for fleet hosts; 'local' for this machine). */
|
|
122
|
+
id: string;
|
|
123
|
+
/** Human-readable display name. */
|
|
124
|
+
name: string;
|
|
125
|
+
/** true when this host is the local machine (consumer-hq only). */
|
|
126
|
+
local?: boolean;
|
|
127
|
+
/** Runtime liveness status. */
|
|
128
|
+
status: 'online' | 'degraded' | 'offline' | 'unknown';
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* A tab entry representing a live (or recently exited) terminal session.
|
|
132
|
+
* Wire-compatible with `SessionMetadata` from `terminal-client/server/session-store`.
|
|
133
|
+
*/
|
|
134
|
+
export interface TabSession {
|
|
135
|
+
id: string;
|
|
136
|
+
command: string;
|
|
137
|
+
/** Short display label for the host (e.g. host name, 'local'). */
|
|
138
|
+
hostLabel?: string;
|
|
139
|
+
startedAt: number;
|
|
140
|
+
/** True when no SSE subscriber is attached (PTY keeps running). */
|
|
141
|
+
detached: boolean;
|
|
142
|
+
/** True when the process has exited. */
|
|
143
|
+
exited: boolean;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The vibes terminal theme — zinc-dark palette.
|
|
147
|
+
* Colors sourced from tui/src/theme.semantic.ts `darkColors` (upstream).
|
|
148
|
+
* Hand-copied here to avoid a runtime dep on @vibesdotdev/tui.
|
|
149
|
+
*/
|
|
150
|
+
export declare const VIBES_TERMINAL_THEME: Readonly<TerminalTheme>;
|
|
151
|
+
/**
|
|
152
|
+
* @deprecated Use `VIBES_TERMINAL_THEME` instead. Kept for back-compat.
|
|
153
|
+
* Will be removed in a future major version.
|
|
154
|
+
*/
|
|
155
|
+
export declare const DEFAULT_TERMINAL_THEME: Readonly<TerminalTheme>;
|
|
156
|
+
export declare const DEFAULT_FONT: Readonly<{
|
|
157
|
+
family: string;
|
|
158
|
+
size: number;
|
|
159
|
+
}>;
|
|
160
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/svelte/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for `@vibesdotdev/terminal-client/svelte`.
|
|
3
|
+
*
|
|
4
|
+
* The `ExecutionSession` shape is OWNED BY L3 (`@vibesdotdev/kernel/execution`)
|
|
5
|
+
* and consumed here type-only — this lane MUST NOT vary it. We re-export the type
|
|
6
|
+
* so consumers can annotate the `session` prop without a direct dep on
|
|
7
|
+
* runtime-execution if they only need the type.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The vibes terminal theme — zinc-dark palette.
|
|
11
|
+
* Colors sourced from tui/src/theme.semantic.ts `darkColors` (upstream).
|
|
12
|
+
* Hand-copied here to avoid a runtime dep on @vibesdotdev/tui.
|
|
13
|
+
*/
|
|
14
|
+
export const VIBES_TERMINAL_THEME = Object.freeze({
|
|
15
|
+
// Surface
|
|
16
|
+
background: '#09090b',
|
|
17
|
+
foreground: '#fafafa',
|
|
18
|
+
// Cursor — block, zinc-200 on zinc-950
|
|
19
|
+
cursor: '#e4e4e7',
|
|
20
|
+
cursorAccent: '#09090b',
|
|
21
|
+
// Selection — zinc-900 bg, full-white fg for legibility
|
|
22
|
+
selectionBackground: '#1f1f23',
|
|
23
|
+
selectionForeground: '#fafafa',
|
|
24
|
+
// ANSI standard colors
|
|
25
|
+
black: '#27272a',
|
|
26
|
+
red: '#ff6467',
|
|
27
|
+
green: '#61d46a',
|
|
28
|
+
yellow: '#fab72a',
|
|
29
|
+
blue: '#28bbfe',
|
|
30
|
+
magenta: '#b794f6',
|
|
31
|
+
cyan: '#56cfd8',
|
|
32
|
+
white: '#9f9fa9',
|
|
33
|
+
// ANSI bright colors
|
|
34
|
+
brightBlack: '#71717b',
|
|
35
|
+
brightRed: '#ff8a8c',
|
|
36
|
+
brightGreen: '#7ce085',
|
|
37
|
+
brightYellow: '#ffc95a',
|
|
38
|
+
brightBlue: '#5fccff',
|
|
39
|
+
brightMagenta: '#cbb0fb',
|
|
40
|
+
brightCyan: '#7fdfe6',
|
|
41
|
+
brightWhite: '#fafafa'
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* @deprecated Use `VIBES_TERMINAL_THEME` instead. Kept for back-compat.
|
|
45
|
+
* Will be removed in a future major version.
|
|
46
|
+
*/
|
|
47
|
+
export const DEFAULT_TERMINAL_THEME = VIBES_TERMINAL_THEME;
|
|
48
|
+
export const DEFAULT_FONT = Object.freeze({
|
|
49
|
+
family: '"SF Mono", Menlo, Consolas, "Liberation Mono", monospace',
|
|
50
|
+
size: 13
|
|
51
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/svelte/workspace.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-client.plugin.d.ts","sourceRoot":"","sources":["../src/terminal-client.plugin.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-client.plugin.js","sourceRoot":"","sources":["../src/terminal-client.plugin.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC"}
|