@vibesdotdev/studio 0.0.0-stage → 1.0.0-rc.2

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 (135) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +46 -2
  3. package/dist/cli/plugin.d.ts +11 -0
  4. package/dist/cli/plugin.d.ts.map +1 -0
  5. package/dist/cli/plugin.js +18 -0
  6. package/dist/cli/plugin.js.map +1 -0
  7. package/dist/cli/studio.descriptor.d.ts +9 -0
  8. package/dist/cli/studio.descriptor.d.ts.map +1 -0
  9. package/dist/cli/studio.descriptor.js +39 -0
  10. package/dist/cli/studio.descriptor.js.map +1 -0
  11. package/dist/client.d.ts +12 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +27 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/index.d.ts +8 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +6 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/logger.d.ts +10 -0
  20. package/dist/logger.d.ts.map +1 -0
  21. package/dist/logger.js +41 -0
  22. package/dist/logger.js.map +1 -0
  23. package/dist/logging/studio.logger.descriptor.d.ts +7 -0
  24. package/dist/logging/studio.logger.descriptor.d.ts.map +1 -0
  25. package/dist/logging/studio.logger.descriptor.js +14 -0
  26. package/dist/logging/studio.logger.descriptor.js.map +1 -0
  27. package/dist/logging/studio.output.descriptor.d.ts +4 -0
  28. package/dist/logging/studio.output.descriptor.d.ts.map +1 -0
  29. package/dist/logging/studio.output.descriptor.js +22 -0
  30. package/dist/logging/studio.output.descriptor.js.map +1 -0
  31. package/dist/prompts/index.d.ts +7 -0
  32. package/dist/prompts/index.d.ts.map +1 -0
  33. package/dist/prompts/index.js +7 -0
  34. package/dist/prompts/index.js.map +1 -0
  35. package/dist/prompts/studio-system.prompt.d.ts +49 -0
  36. package/dist/prompts/studio-system.prompt.d.ts.map +1 -0
  37. package/dist/prompts/studio-system.prompt.descriptor.d.ts +345 -0
  38. package/dist/prompts/studio-system.prompt.descriptor.d.ts.map +1 -0
  39. package/dist/prompts/studio-system.prompt.descriptor.js +22 -0
  40. package/dist/prompts/studio-system.prompt.descriptor.js.map +1 -0
  41. package/dist/prompts/studio-system.prompt.js +116 -0
  42. package/dist/prompts/studio-system.prompt.js.map +1 -0
  43. package/dist/schemas/auth.d.ts +43 -0
  44. package/dist/schemas/auth.d.ts.map +1 -0
  45. package/dist/schemas/auth.js +19 -0
  46. package/dist/schemas/auth.js.map +1 -0
  47. package/dist/schemas/continuity.d.ts +51 -0
  48. package/dist/schemas/continuity.d.ts.map +1 -0
  49. package/dist/schemas/continuity.js +35 -0
  50. package/dist/schemas/continuity.js.map +1 -0
  51. package/dist/schemas/history.d.ts +6 -0
  52. package/dist/schemas/history.d.ts.map +1 -0
  53. package/dist/schemas/history.js +6 -0
  54. package/dist/schemas/history.js.map +1 -0
  55. package/dist/schemas/logging.d.ts +63 -0
  56. package/dist/schemas/logging.d.ts.map +1 -0
  57. package/dist/schemas/logging.js +26 -0
  58. package/dist/schemas/logging.js.map +1 -0
  59. package/dist/schemas/theme.d.ts +9 -0
  60. package/dist/schemas/theme.d.ts.map +1 -0
  61. package/dist/schemas/theme.js +2 -0
  62. package/dist/schemas/theme.js.map +1 -0
  63. package/dist/services/schemas/studio-gateway.d.ts +34 -0
  64. package/dist/services/schemas/studio-gateway.d.ts.map +1 -0
  65. package/dist/services/schemas/studio-gateway.js +21 -0
  66. package/dist/services/schemas/studio-gateway.js.map +1 -0
  67. package/dist/studio.consumer.plugin.d.ts +8 -0
  68. package/dist/studio.consumer.plugin.d.ts.map +1 -0
  69. package/dist/studio.consumer.plugin.js +29 -0
  70. package/dist/studio.consumer.plugin.js.map +1 -0
  71. package/dist/studio.core.plugin.d.ts +4 -0
  72. package/dist/studio.core.plugin.d.ts.map +1 -0
  73. package/dist/studio.core.plugin.js +23 -0
  74. package/dist/studio.core.plugin.js.map +1 -0
  75. package/dist/studio.plugin.d.ts +3 -0
  76. package/dist/studio.plugin.d.ts.map +1 -0
  77. package/dist/studio.plugin.js +3 -0
  78. package/dist/studio.plugin.js.map +1 -0
  79. package/dist/theme.d.ts +67 -0
  80. package/dist/theme.d.ts.map +1 -0
  81. package/dist/theme.js +38 -0
  82. package/dist/theme.js.map +1 -0
  83. package/dist/tui/plugin.d.ts +13 -0
  84. package/dist/tui/plugin.d.ts.map +1 -0
  85. package/dist/tui/plugin.js +29 -0
  86. package/dist/tui/plugin.js.map +1 -0
  87. package/dist/tui/studio-apps.descriptor.d.ts +11 -0
  88. package/dist/tui/studio-apps.descriptor.d.ts.map +1 -0
  89. package/dist/tui/studio-apps.descriptor.js +27 -0
  90. package/dist/tui/studio-apps.descriptor.js.map +1 -0
  91. package/dist/tui/studio-apps.impl.consumer.d.ts +12 -0
  92. package/dist/tui/studio-apps.impl.consumer.d.ts.map +1 -0
  93. package/dist/tui/studio-apps.impl.consumer.js +23 -0
  94. package/dist/tui/studio-apps.impl.consumer.js.map +1 -0
  95. package/dist/tui/studio-auth.d.ts +8 -0
  96. package/dist/tui/studio-auth.d.ts.map +1 -0
  97. package/dist/tui/studio-auth.js +56 -0
  98. package/dist/tui/studio-auth.js.map +1 -0
  99. package/dist/tui/studio-gateway-home.d.ts +56 -0
  100. package/dist/tui/studio-gateway-home.d.ts.map +1 -0
  101. package/dist/tui/studio-gateway-home.js +352 -0
  102. package/dist/tui/studio-gateway-home.js.map +1 -0
  103. package/dist/tui/studio-gateway.actions.d.ts +8 -0
  104. package/dist/tui/studio-gateway.actions.d.ts.map +1 -0
  105. package/dist/tui/studio-gateway.actions.js +133 -0
  106. package/dist/tui/studio-gateway.actions.js.map +1 -0
  107. package/dist/tui/studio-gateway.descriptor.d.ts +14 -0
  108. package/dist/tui/studio-gateway.descriptor.d.ts.map +1 -0
  109. package/dist/tui/studio-gateway.descriptor.js +33 -0
  110. package/dist/tui/studio-gateway.descriptor.js.map +1 -0
  111. package/dist/tui/studio-gateway.impl.consumer.d.ts +32 -0
  112. package/dist/tui/studio-gateway.impl.consumer.d.ts.map +1 -0
  113. package/dist/tui/studio-gateway.impl.consumer.js +422 -0
  114. package/dist/tui/studio-gateway.impl.consumer.js.map +1 -0
  115. package/dist/tui/studio-gateway.logic.d.ts +55 -0
  116. package/dist/tui/studio-gateway.logic.d.ts.map +1 -0
  117. package/dist/tui/studio-gateway.logic.js +255 -0
  118. package/dist/tui/studio-gateway.logic.js.map +1 -0
  119. package/dist/tui/studio-home-sessions.d.ts +14 -0
  120. package/dist/tui/studio-home-sessions.d.ts.map +1 -0
  121. package/dist/tui/studio-home-sessions.js +190 -0
  122. package/dist/tui/studio-home-sessions.js.map +1 -0
  123. package/dist/tui/studio-home.config.descriptor.d.ts +29 -0
  124. package/dist/tui/studio-home.config.descriptor.d.ts.map +1 -0
  125. package/dist/tui/studio-home.config.descriptor.js +20 -0
  126. package/dist/tui/studio-home.config.descriptor.js.map +1 -0
  127. package/dist/tui/studio-sign-in.d.ts +19 -0
  128. package/dist/tui/studio-sign-in.d.ts.map +1 -0
  129. package/dist/tui/studio-sign-in.js +71 -0
  130. package/dist/tui/studio-sign-in.js.map +1 -0
  131. package/dist/tui/studio-ui-state.config.descriptor.d.ts +17 -0
  132. package/dist/tui/studio-ui-state.config.descriptor.d.ts.map +1 -0
  133. package/dist/tui/studio-ui-state.config.descriptor.js +35 -0
  134. package/dist/tui/studio-ui-state.config.descriptor.js.map +1 -0
  135. package/package.json +150 -4
@@ -0,0 +1,422 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useState, useMemo, useCallback, useEffect } from 'react';
3
+ import { DSButton, DSText, PageHeader, PageLayout, focusElement, navStore, dsBase, dsColors, dsMeasure } from '@vibesdotdev/tui';
4
+ import { useViewport } from '@vibesdotdev/tui';
5
+ import { useKeyboardLayer, registerAction, useOptionalKeybindDispatcherContext } from '@vibesdotdev/tui/input';
6
+ import { LogProvider, LogPanel, GlobalAppHeader, GlobalStatusBar, ScreenStatusProvider, useContributeScreenStatus, useScreenStatusValue, useLogAppender } from '@vibesdotdev/tui/shell';
7
+ import { ErrorBoundary } from '@vibesdotdev/tui/components/feedback';
8
+ import { discoverTuiApps } from '@vibesdotdev/tui/gateway';
9
+ import { buildHomeAppCards, findPageOwningRoute, formatStudioSurfaceIcon, normalizeRoute } from "./studio-gateway.logic.js";
10
+ import { handleGatewayPrefixResult, submitGatewayInput } from "./studio-gateway.actions.js";
11
+ import { GatewayHome, CommandComposer, COMPOSER_ID } from "./studio-gateway-home.js";
12
+ import { loadStudioIdentity } from "./studio-auth.js";
13
+ import { RouteStateTextSchema, StudioLaunchPropsSchema } from "../services/schemas/studio-gateway.js";
14
+ import { SignInOverlay } from "./studio-sign-in.js";
15
+ function StudioGatewayApp(props) {
16
+ const { runtime, navigate, onExit } = props;
17
+ const [input, setInput] = useState('');
18
+ const [message, setMessage] = useState(null);
19
+ const rt = runtime;
20
+ const launch = StudioLaunchPropsSchema.parse(props);
21
+ const initialPageArg = launch.args?.page ?? '';
22
+ const fastMode = launch.args?.fast !== undefined || launch.options?.fast !== undefined;
23
+ const [homeNotice] = useState(fastMode ? { text: 'Fast mode: setup checks and heavy panels skipped.', tone: 'muted' } : null);
24
+ const [startupMs, setStartupMs] = useState(null);
25
+ const [logPanelOpen, setLogPanelOpen] = useState(false);
26
+ // Platform identity for the status line's auth slot and the home sign-in
27
+ // affordance. `authVersion` bumps after an in-TUI sign-in so dependents
28
+ // (home's Continue band) refetch against the fresh credentials.
29
+ const [identity, setIdentity] = useState(null);
30
+ const [identityLoaded, setIdentityLoaded] = useState(false);
31
+ const [authVersion, setAuthVersion] = useState(0);
32
+ const [signInOpen, setSignInOpen] = useState(false);
33
+ useEffect(() => {
34
+ setStartupMs(Date.now() - startTime);
35
+ }, []);
36
+ useEffect(() => {
37
+ let cancelled = false;
38
+ void loadStudioIdentity(rt).then((resolved) => {
39
+ if (cancelled)
40
+ return;
41
+ setIdentity(resolved.status === 'signed-in' ? resolved.identity : null);
42
+ if (resolved.status === 'failed' || resolved.status === 'unavailable') {
43
+ setMessage(resolved.message);
44
+ }
45
+ setIdentityLoaded(true);
46
+ });
47
+ return () => {
48
+ cancelled = true;
49
+ };
50
+ }, [rt, authVersion]);
51
+ const pages = useMemo(() => discoverTuiApps(rt), [rt]);
52
+ const appPages = useMemo(() => pages.filter((p) => p.id !== 'studio.gateway'), [pages]);
53
+ const homeApps = useMemo(() => buildHomeAppCards(appPages), [appPages]);
54
+ const commands = useMemo(() => {
55
+ // SAFETY: registration admits every `tui/command` descriptor through the kind's canonical schema.
56
+ const d = rt.assets('tui/command').descriptors();
57
+ return d.sort((a, b) => (a.order ?? 999) - (b.order ?? 999));
58
+ }, [rt]);
59
+ const [activePath, setActivePath] = useState('/');
60
+ const [routeState, setRouteState] = useState(null);
61
+ const isStandalone = navigate === undefined;
62
+ const navigateTo = useCallback((path, state) => {
63
+ const normalized = normalizeRoute(path);
64
+ if (navigate) {
65
+ navigate(normalized, state);
66
+ return;
67
+ }
68
+ setActivePath(normalized);
69
+ setRouteState(state ?? null);
70
+ }, [navigate]);
71
+ // Publish this app's real router so overlays mounted OUTSIDE its React
72
+ // subtree — the command palette and the keybind bridge — can navigate.
73
+ // Only when standalone: embedded, the parent owns routing (navigateTo already
74
+ // delegates to it) and there is a real top-level router elsewhere. Clear on
75
+ // unmount so a torn-down gateway leaves no stale navigate in the singleton.
76
+ useEffect(() => {
77
+ if (!isStandalone)
78
+ return;
79
+ navStore.publish(navigateTo);
80
+ return () => navStore.publish(null);
81
+ }, [isStandalone, navigateTo]);
82
+ useEffect(() => {
83
+ if (!initialPageArg)
84
+ return;
85
+ navigateTo(normalizeRoute(initialPageArg));
86
+ }, [initialPageArg, navigateTo]);
87
+ const handleSubmit = useCallback(async () => submitGatewayInput(input, commands, pages, rt, navigateTo, setInput, setMessage), [input, commands, pages, rt, navigateTo]);
88
+ const handlePrefixResult = useCallback((result) => handleGatewayPrefixResult(result, navigateTo, setInput, setMessage), [navigateTo]);
89
+ const activePage = useMemo(() => {
90
+ if (!isStandalone || activePath === '/')
91
+ return null;
92
+ return findPageOwningRoute(pages, activePath) ?? null;
93
+ }, [isStandalone, activePath, pages]);
94
+ const currentPageTitle = activePath === '/' ? 'home' : (activePage?.title ?? activePath.replace(/^\//, ''));
95
+ useKeyboardLayer('global', (key) => {
96
+ if (key.ctrl && key.name === '`') {
97
+ setLogPanelOpen((value) => !value);
98
+ return true;
99
+ }
100
+ if (isStandalone && activePath !== '/' && key.name === 'escape') {
101
+ navigateTo('/');
102
+ return true;
103
+ }
104
+ // In a PTY Ctrl+H commonly arrives as the ASCII backspace byte, not
105
+ // a structured ctrl+h event. Keep normal DEL backspace out of this path.
106
+ const terminalCtrlH = key.sequence === '\u0008' || key.name === '\u0008';
107
+ if ((key.ctrl && key.name === 'h') || terminalCtrlH) {
108
+ navigateTo('/');
109
+ return true;
110
+ }
111
+ return false;
112
+ }, { description: 'Studio global shortcuts' });
113
+ // Register programmatic action handlers so callers can trigger these via
114
+ // executeAction('toggleLogs') / executeAction('navigateHome'). These mirror the keyboard-layer bindings
115
+ // above and are the sanctioned programmatic entry point for tests and other
116
+ // surfaces that don't want to synthesize raw key events.
117
+ useEffect(() => {
118
+ const unregisterToggleLogs = registerAction('toggleLogs', () => {
119
+ setLogPanelOpen((value) => !value);
120
+ });
121
+ const unregisterNavigateHome = registerAction('navigateHome', () => {
122
+ navigateTo('/');
123
+ });
124
+ // Any route can raise the sign-in overlay via executeAction('signIn')
125
+ // instead of pointing the user at a shell command — auth is gateway
126
+ // chrome, like the palette.
127
+ const unregisterSignIn = registerAction('signIn', () => {
128
+ setSignInOpen(true);
129
+ });
130
+ return () => {
131
+ unregisterToggleLogs();
132
+ unregisterNavigateHome();
133
+ unregisterSignIn();
134
+ };
135
+ }, [navigateTo]);
136
+ const renderContent = () => {
137
+ if (isStandalone && activePath !== '/') {
138
+ if (!activePage) {
139
+ return (_jsx(MissingRoute, { activePath: activePath, pages: pages, navigateTo: navigateTo, onOpenLogs: () => setLogPanelOpen(true), command: {
140
+ runtime: rt,
141
+ input,
142
+ onInputChange: setInput,
143
+ onPrefixResult: handlePrefixResult,
144
+ onSubmit: handleSubmit
145
+ } }));
146
+ }
147
+ const PageContent = activePage.content;
148
+ return (_jsx(StudioRouteFrame, { page: activePage, activePath: activePath, routeState: routeState, navigateTo: navigateTo, onOpenLogs: () => setLogPanelOpen(true), command: {
149
+ runtime: rt,
150
+ input,
151
+ onInputChange: setInput,
152
+ onPrefixResult: handlePrefixResult,
153
+ onSubmit: handleSubmit
154
+ }, children: _jsx(PageContent, { navigate: navigateTo, embedded: true, route: activePath, routeState: routeState ?? undefined, ...(routeState ?? {}) }) }));
155
+ }
156
+ return (_jsx(GatewayHome, { runtime: rt, input: input, onInputChange: setInput, notice: message ? { text: message, tone: 'muted' } : homeNotice, apps: homeApps, identity: identity, identityLoaded: identityLoaded, authVersion: authVersion, defaultModelLabel: null, navigateTo: navigateTo, onPrefixResult: handlePrefixResult, onSubmit: handleSubmit, onSignIn: () => setSignInOpen(true) }));
157
+ };
158
+ // Build identity from the runtime this app was handed (RC04: a declared build fact, not an env knob).
159
+ const version = rt.getEnv('VIBES_VERSION') ?? 'dev';
160
+ const gitHash = rt.getEnv('VIBES_GIT_HASH') ?? '';
161
+ // Open the REAL command palette (the shell listens for `app.palette`).
162
+ // Only when no dispatcher is mounted does the button fall back to focusing
163
+ // the composer — and then it says so, instead of claiming a palette opened.
164
+ const keybindDispatcher = useOptionalKeybindDispatcherContext();
165
+ return (_jsx(LogProvider, { children: _jsx(ScreenStatusProvider, { children: _jsxs("box", { style: { flexDirection: 'column', flexGrow: 1 }, children: [_jsx(GlobalAppHeader, { appName: "Vibes", version: version, gitHash: gitHash || undefined, currentPage: currentPageTitle, paletteLabel: "commands", onOpenCommandPalette: () => {
166
+ if (keybindDispatcher) {
167
+ keybindDispatcher.execute('app.palette');
168
+ return;
169
+ }
170
+ focusElement(COMPOSER_ID, 'keyboard');
171
+ setMessage('Composer focused — Ctrl+P opens the command palette.');
172
+ } }), _jsx("box", { style: {
173
+ flexDirection: 'column',
174
+ flexGrow: 1,
175
+ flexShrink: 1,
176
+ minHeight: 0,
177
+ overflow: 'hidden'
178
+ }, children: _jsx(RouteBoundary, { route: activePath, onExit: onExit, children: renderContent() }) }), _jsx(LogPanel, { visible: logPanelOpen, onClose: () => setLogPanelOpen(false), height: 12 }), _jsx(SignInOverlay, { runtime: rt, open: signInOpen, onClose: () => setSignInOpen(false), onSignedIn: (signedIn) => {
179
+ setIdentity(signedIn);
180
+ setIdentityLoaded(true);
181
+ setAuthVersion((value) => value + 1);
182
+ setMessage(signedIn.email ? `Signed in as ${signedIn.email}.` : 'Signed in.');
183
+ } }), _jsx(GatewayFacts, { authLabel: identity?.email ?? 'local' }), _jsx(GatewayStatusBar, { connection: "connected" }), _jsx(StartupDiagnostics, { pageCount: pages.length, startupMs: startupMs, fastMode: fastMode })] }) }) }));
184
+ }
185
+ /**
186
+ * The single gateway-owned status line. Reads the resolved screen-status
187
+ * contribution (facts + hints, already de-duplicated one-owner-per-slot) and
188
+ * renders it once. The connection indicator is gateway-owned (passed as a prop);
189
+ * everything else is contributed by the active route. When a route contributes
190
+ * no hints, one universal `? help` affordance keeps help discoverable on-page.
191
+ * The permanent mode badge is off (`showMode={false}`): input IS modal, but
192
+ * mode's only practical consequence (Enter = send) rides the contributed hint
193
+ * line rather than narrating `INS · global` as permanent chrome.
194
+ */
195
+ /**
196
+ * Gateway-owned facts for the one status line. Auth is a single, calm story:
197
+ * when the platform identity is known (via `vibes auth login` or the in-TUI
198
+ * sign-in) the slot reads the signed-in email; otherwise it reads `local` — a
199
+ * locally-running studio is authenticated on the machine it runs on (never
200
+ * "not signed in", the lie Drew's /chat review caught). Auth lives HERE, not
201
+ * in the header, so it is stated exactly once. Priority is low so a route
202
+ * could refine it, though none needs to.
203
+ */
204
+ function GatewayFacts({ authLabel }) {
205
+ useContributeScreenStatus('studio.gateway', {
206
+ facts: [{ slot: 'auth', value: authLabel, priority: -10, tone: 'muted' }]
207
+ });
208
+ return null;
209
+ }
210
+ function GatewayStatusBar({ connection }) {
211
+ const { facts, hints } = useScreenStatusValue();
212
+ const hintItems = hints.length > 0
213
+ ? hints.map((hint) => ({ keys: hint.keys, label: hint.label }))
214
+ : [{ keys: '?', label: 'help' }];
215
+ return _jsx(GlobalStatusBar, { connection: connection, facts: facts, hints: hintItems, showMode: false });
216
+ }
217
+ /**
218
+ * Debug vitals live behind the logs surface, never on user pages. The page
219
+ * count and cold-start timing that used to clutter the status bar are appended
220
+ * once to the in-process log buffer (open with Ctrl+`), where an operator who
221
+ * actually wants them can look.
222
+ */
223
+ function StartupDiagnostics({ pageCount, startupMs, fastMode }) {
224
+ const appendLog = useLogAppender();
225
+ useEffect(() => {
226
+ if (startupMs === null)
227
+ return;
228
+ appendLog('debug', `studio ready — ${pageCount} routes, ${startupMs}ms cold start${fastMode ? ' (fast mode)' : ''}`, 'studio.gateway');
229
+ }, [appendLog, pageCount, startupMs, fastMode]);
230
+ return null;
231
+ }
232
+ /**
233
+ * The gateway's route error boundary. A caught route error lands in the log
234
+ * panel; Exit hands control to the host's exit; keying on the route lets Esc,
235
+ * Ctrl+H and navigateHome leave a crashed route.
236
+ */
237
+ function RouteBoundary({ route, onExit, children }) {
238
+ const appendLog = useLogAppender();
239
+ const logger = useMemo(() => ({
240
+ debug: (message, meta) => appendLog('debug', message, 'studio.gateway', meta),
241
+ warn: (message, meta) => appendLog('warn', message, 'studio.gateway', meta),
242
+ error: (message, meta) => appendLog('error', message, 'studio.gateway', meta)
243
+ }), [appendLog]);
244
+ return (_jsx(ErrorBoundary, { logger: logger, onCleanup: onExit, children: children }, route));
245
+ }
246
+ const startTime = Date.now();
247
+ function routeStateText(routeState, key) {
248
+ return RouteStateTextSchema.parse(routeState?.[key]);
249
+ }
250
+ function hasWorkContext(routeState) {
251
+ return (routeState?.newRoom === true ||
252
+ Boolean(routeStateText(routeState, 'codeSessionId')) ||
253
+ Boolean(routeStateText(routeState, 'sessionId')));
254
+ }
255
+ export function StudioRouteFrame({ page, children, activePath, routeState, navigateTo, onOpenLogs }) {
256
+ const { width, height } = useViewport();
257
+ const compact = width <= 90 || height <= 28;
258
+ return (_jsxs(PageLayout, { noScroll: true, padding: compact ? 0 : 1, header: hasWorkContext(routeState) ? undefined : (_jsx(RoutePageHeader, { page: page, activePath: activePath, compact: compact, navigateTo: navigateTo, onOpenLogs: onOpenLogs })), children: [_jsx(RouteNoticeBar, { routeState: routeState, compact: compact }), _jsx(WorkContextBar, { routeState: routeState }), _jsx("box", { style: { flexDirection: 'column', flexGrow: 1, minHeight: 0, overflow: 'hidden' }, children: children })] }));
259
+ }
260
+ export function MissingRoute({ activePath, pages, navigateTo, command }) {
261
+ const { width, height } = useViewport();
262
+ const compact = width <= 90 || height <= 28;
263
+ // The FULL catalog — a sliced list here reads as "this is everything" and
264
+ // makes unlisted-but-registered routes look nonexistent.
265
+ const availablePages = pages.filter((page) => page.id !== 'studio.gateway');
266
+ // Recovery hints flow through the one status line, not a second footer bar.
267
+ useContributeScreenStatus('studio.missing-route', {
268
+ hints: [
269
+ { keys: '/', label: 'command' },
270
+ { keys: 'Ctrl+H', label: 'home' },
271
+ { keys: '?', label: 'help' }
272
+ ]
273
+ });
274
+ return (_jsx(PageLayout, { noScroll: true, padding: compact ? 0 : 1, header: _jsx(PageHeader, { title: "Page not found", description: `${activePath} isn't available here. Choose a page below, or go Home.`, onBack: () => navigateTo('/'), backLabel: "Home", zone: "studio-route" }), children: _jsxs("box", { style: {
275
+ border: true,
276
+ borderColor: dsColors.warning.solid,
277
+ padding: compact ? 0 : 1,
278
+ flexDirection: 'column',
279
+ gap: compact ? 0 : 1,
280
+ flexGrow: 1,
281
+ flexShrink: 1,
282
+ minHeight: 0,
283
+ overflow: 'hidden'
284
+ }, children: [_jsx(RouteCommandComposer, { command: command, compact: compact }), _jsx("box", { style: { flexDirection: 'row', flexWrap: 'wrap', gap: 1, flexShrink: 0 }, children: availablePages.map((page) => (_jsx(DSButton, { id: `missing-route-${page.id}`, label: page.title, icon: formatStudioSurfaceIcon(page.descriptor), size: "xs", variant: "ghost", color: "secondary", zone: "studio-route", onClick: () => navigateTo(page.path) }, page.id))) }), _jsx(MissingRouteRuntimeBand, { activePath: activePath, compact: compact, pages: availablePages, navigateTo: navigateTo }), availablePages.length === 0 && (_jsx("text", { style: { fg: dsBase.mutedForeground }, children: "Nothing is available here yet." }))] }) }));
285
+ }
286
+ function RouteCommandComposer({ command, compact }) {
287
+ return (_jsx(CommandComposer, { runtime: command.runtime, input: command.input, onInputChange: command.onInputChange, onPrefixResult: command.onPrefixResult, onSubmit: command.onSubmit, compact: compact, label: "Command", zone: "studio-route", placeholder: compact ? 'Command, /apps, /home...' : 'Run /command, /goto route, or ask from this screen...' }));
288
+ }
289
+ // Cheap Levenshtein — route paths are short, so the O(m·n) table is trivial and
290
+ // lets a typo'd path ("/ai/routers") point at the real one ("/ai/router").
291
+ function routeEditDistance(a, b) {
292
+ const m = a.length;
293
+ const n = b.length;
294
+ let prev = Array.from({ length: n + 1 }, (_, j) => j);
295
+ let curr = Array.from({ length: n + 1 }, () => 0);
296
+ for (let i = 1; i <= m; i++) {
297
+ curr[0] = i;
298
+ for (let j = 1; j <= n; j++) {
299
+ curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
300
+ }
301
+ [prev, curr] = [curr, prev];
302
+ }
303
+ return prev[n];
304
+ }
305
+ // Closest registered route to what was requested — but only when it's a genuine
306
+ // near-miss, so we never suggest a wildly different surface as "did you mean".
307
+ function nearestRegisteredRoute(activePath, pages) {
308
+ const target = activePath.toLowerCase();
309
+ let best = null;
310
+ let bestScore = Number.POSITIVE_INFINITY;
311
+ for (const page of pages) {
312
+ const score = routeEditDistance(target, page.path.toLowerCase());
313
+ if (score < bestScore) {
314
+ bestScore = score;
315
+ best = page;
316
+ }
317
+ }
318
+ const tolerance = Math.max(2, Math.floor(target.length * 0.4));
319
+ return best && bestScore > 0 && bestScore <= tolerance ? best : null;
320
+ }
321
+ // Registered routes sharing the requested path's top segment are surfaced so
322
+ // a dropped sub-route reads as dropped, not nonexistent.
323
+ function siblingRegisteredRoutes(activePath, pages) {
324
+ const segment = activePath.split('/').filter(Boolean)[0];
325
+ if (!segment)
326
+ return [];
327
+ return pages.filter((page) => page.path.split('/').filter(Boolean)[0] === segment && page.path !== activePath);
328
+ }
329
+ function MissingRouteRuntimeBand({ activePath, compact, pages, navigateTo }) {
330
+ const suggestion = nearestRegisteredRoute(activePath, pages);
331
+ const siblings = siblingRegisteredRoutes(activePath, pages);
332
+ const looksLikeRoute = activePath.startsWith('/') && activePath.length > 1;
333
+ const topSegment = activePath.split('/').filter(Boolean)[0];
334
+ return (_jsxs("box", { style: {
335
+ flexDirection: 'column',
336
+ justifyContent: 'flex-start',
337
+ gap: 1,
338
+ flexShrink: 0,
339
+ paddingLeft: compact ? 0 : 1,
340
+ paddingRight: compact ? 0 : 1
341
+ }, children: [suggestion ? (_jsxs("box", { style: { flexDirection: 'row', alignItems: 'center', gap: 1, flexShrink: 0 }, children: [_jsx("text", { style: { fg: dsColors.primary.solid }, children: "Did you mean" }), _jsx(DSButton, { id: "missing-route-suggestion", label: suggestion.path, size: "xs", variant: "outlined", color: "primary", zone: "studio-route", onClick: () => navigateTo(suggestion.path) }), _jsx("text", { style: { fg: dsBase.mutedForeground }, children: "?" })] })) : looksLikeRoute ? (_jsx("text", { style: { fg: dsBase.mutedForeground }, children: `That page isn't part of this workspace.` })) : null, !compact && siblings.length > 0 ? (_jsx("text", { style: { fg: dsBase.mutedForeground }, children: `Other /${topSegment} pages: ${siblings
342
+ .slice(0, 4)
343
+ .map((page) => page.path)
344
+ .join(' ')}` })) : null] }));
345
+ }
346
+ function RoutePageHeader({ page, activePath, compact, navigateTo, }) {
347
+ const descriptor = page.descriptor;
348
+ const route = normalizeRoute(activePath ?? page.path);
349
+ return (_jsx(PageHeader, { title: `${formatStudioSurfaceIcon(descriptor)} ${page.title}`, description: compact ? compactRouteSubtitle(page, route) : formatRouteSubtitle(page, route), actions: _jsx("box", { style: { flexDirection: 'row', gap: 1, flexShrink: 0 }, children: _jsx(DSButton, { id: "route-home", label: "Home", size: "sm", variant: "ghost", color: "secondary", onClick: () => navigateTo('/') }) }), zone: "studio-route" }));
350
+ }
351
+ function WorkContextBar({ routeState }) {
352
+ const codeSessionId = routeStateText(routeState, 'codeSessionId');
353
+ const sessionId = routeStateText(routeState, 'sessionId');
354
+ if (!hasWorkContext(routeState))
355
+ return null;
356
+ const initialTitle = routeStateText(routeState, 'initialTitle');
357
+ const initialMessage = routeStateText(routeState, 'initialMessage');
358
+ const title = compactRouteNotice(initialTitle || initialMessage || 'New work');
359
+ const workspaceRoot = routeStateText(routeState, 'workspaceRoot');
360
+ const place = workspaceRoot
361
+ ? (workspaceRoot.split('/').filter(Boolean).at(-1) ?? workspaceRoot)
362
+ : 'local workspace';
363
+ const identity = codeSessionId || sessionId;
364
+ return (_jsxs("box", { style: {
365
+ border: ['bottom'],
366
+ borderColor: dsColors.primary.solid,
367
+ // Page shell already owns the outer gutter; use the design token
368
+ // (not a raw numeric paddingLeft/Right) so check:tui-spacing stays green.
369
+ paddingLeft: dsMeasure.gutter,
370
+ paddingRight: dsMeasure.gutter,
371
+ flexDirection: 'row',
372
+ alignItems: 'center',
373
+ gap: 1,
374
+ flexShrink: 0,
375
+ overflow: 'hidden'
376
+ }, children: [_jsx(DSText, { color: dsColors.primary.solid, bold: true, style: { flexShrink: 0 }, children: "Work" }), _jsx("text", { style: { fg: dsBase.foreground, flexShrink: 1 }, children: title }), _jsx("text", { style: { fg: dsBase.mutedForeground, flexShrink: 0 }, children: identity ? `${place} · ${identity.slice(0, 12)}` : place })] }));
377
+ }
378
+ function RouteNoticeBar({ routeState, compact }) {
379
+ const title = routeStateText(routeState, 'routeNoticeTitle');
380
+ const body = routeStateText(routeState, 'routeNoticeBody');
381
+ if (!title && !body)
382
+ return null;
383
+ const headline = title || 'Context';
384
+ const detail = body || 'This route was opened by Studio.';
385
+ return (_jsxs("box", { style: {
386
+ border: ['bottom'],
387
+ borderColor: dsColors.warning.solid,
388
+ paddingLeft: 1,
389
+ paddingRight: 1,
390
+ flexDirection: 'row',
391
+ alignItems: 'center',
392
+ gap: 1,
393
+ flexShrink: 0,
394
+ overflow: 'hidden'
395
+ }, children: [_jsx(DSText, { color: dsColors.warning.solid, bold: true, style: { flexShrink: 0 }, children: `${headline}:` }), _jsx("text", { style: { fg: dsBase.mutedForeground, flexShrink: 1 }, children: compact ? compactRouteNotice(detail) : detail })] }));
396
+ }
397
+ function compactRouteNotice(value) {
398
+ if (value.length <= 56)
399
+ return value;
400
+ return `${value.slice(0, 53).trimEnd()}...`;
401
+ }
402
+ function formatRouteDescription(page) {
403
+ const raw = page.descriptor.description ?? '';
404
+ const description = raw.trim().replace(/\.$/, '');
405
+ return description || `${page.title} workspace`;
406
+ }
407
+ function formatRouteSubtitle(page, route) {
408
+ return `${formatRouteDescription(page)} · ${route}`;
409
+ }
410
+ function compactRouteSubtitle(page, route) {
411
+ const description = formatRouteDescription(page);
412
+ if (description.length <= 48)
413
+ return `${description} · ${route}`;
414
+ // Clip on a word boundary — a mid-word cut ("cloud o...") reads as a defect.
415
+ const slice = description.slice(0, 45);
416
+ const cut = slice.lastIndexOf(' ');
417
+ const kept = (cut > 24 ? slice.slice(0, cut) : slice).trimEnd().replace(/[,—–·]+$/, '');
418
+ return `${kept}... · ${route}`;
419
+ }
420
+ const impl = { component: StudioGatewayApp };
421
+ export default impl;
422
+ //# sourceMappingURL=studio-gateway.impl.consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-gateway.impl.consumer.js","sourceRoot":"","sources":["../../src/tui/studio-gateway.impl.consumer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { TuiCommandDescriptor } from '@vibesdotdev/tui/schemas/tui-command';
2
+ import type { PrefixResult } from '@vibesdotdev/tui/kinds/tui-prefix';
3
+ import { type GatewayPage } from '@vibesdotdev/tui/gateway';
4
+ import { normalizeRoute } from '@vibesdotdev/tui/shell';
5
+ import type { AppCard, RouteState } from '../services/schemas/studio-gateway.ts';
6
+ export { normalizeRoute };
7
+ export type { AppCard, RouteState };
8
+ export declare function buildAppCards(appPages: GatewayPage[]): AppCard[];
9
+ export declare function buildAppCatalog(appPages: GatewayPage[]): {
10
+ primary: AppCard[];
11
+ ops: AppCard[];
12
+ dev: AppCard[];
13
+ };
14
+ /**
15
+ * The home directory: every navigable app in one list (home groups them by
16
+ * user task, not by this audience taxonomy). De-duplicated because a
17
+ * descriptor without an explicit audience can match more than one fallback
18
+ * category set.
19
+ */
20
+ export declare function buildHomeAppCards(appPages: GatewayPage[]): AppCard[];
21
+ /**
22
+ * THE DESCRIPTOR OWNS ITS ICON. Studio's only jobs here are grid safety
23
+ * (an emoji is double-width and breaks column alignment, so it degrades to a
24
+ * bullet) and a fallback when a surface declares nothing.
25
+ *
26
+ * This used to consult a hard-coded `STUDIO_SURFACE_ICONS` map that listed ~19
27
+ * OTHER packages' surface ids — so studio, an infrastructure package, decided how
28
+ * chat/pm/secrets/knowledge/... presented themselves, and a descriptor's own
29
+ * `icon` was silently ignored. Two costs, both real: adding a surface meant
30
+ * editing studio, and the map had drifted into letters (`B` for AI Benchmarks,
31
+ * `S` for AI Scorecard) sitting beside geometric glyphs, plus heavy collisions
32
+ * (one glyph for three unrelated surfaces). Constitution: infrastructure packages
33
+ * are not feature owners.
34
+ */
35
+ export declare function formatStudioSurfaceIcon(surface: {
36
+ id?: string;
37
+ icon?: string;
38
+ audience?: string;
39
+ }): string;
40
+ export declare function findCommandMatch(commands: TuiCommandDescriptor[], trigger: string): TuiCommandDescriptor | undefined;
41
+ export declare function findPageMatch(pages: GatewayPage[], trigger: string): GatewayPage | undefined;
42
+ export declare function findPageOwningRoute(pages: GatewayPage[], route: string): GatewayPage | undefined;
43
+ export declare function findPageByQuery(pages: GatewayPage[], query: string): GatewayPage | undefined;
44
+ export declare function getCommandTriggers(commands: TuiCommandDescriptor[], pages: GatewayPage[]): string[];
45
+ export declare function suggestCommandTriggers(commands: TuiCommandDescriptor[], pages: GatewayPage[], trigger: string, limit?: number): string[];
46
+ export declare function searchGatewayItems(commands: TuiCommandDescriptor[], pages: GatewayPage[], query: string, limit?: number): string[];
47
+ export declare function buildHelpMessage(commands: TuiCommandDescriptor[], pages: GatewayPage[]): string;
48
+ export declare function buildAppsMessage(pages: GatewayPage[]): string;
49
+ export declare function applyPrefixResult(result: PrefixResult, handlers: {
50
+ navigateTo: (route: string, state?: RouteState) => void;
51
+ setInput: (value: string) => void;
52
+ sendMessage: (text: string) => void;
53
+ setMessage: (value: string | null) => void;
54
+ }): void;
55
+ //# sourceMappingURL=studio-gateway.logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-gateway.logic.d.ts","sourceRoot":"","sources":["../../src/tui/studio-gateway.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,KAAK,WAAW,EAAkC,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAEjF,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AAqCpC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAEhE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE;;;;EAMtD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAUpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAMT;AAoBD,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,oBAAoB,EAAE,EAChC,OAAO,EAAE,MAAM,GACb,oBAAoB,GAAG,SAAS,CAQlC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAS5F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAUhG;AAWD,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAa5F;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAYnG;AAED,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,oBAAoB,EAAE,EAChC,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,SAAI,GACP,MAAM,EAAE,CAmBV;AAED,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,oBAAoB,EAAE,EAChC,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,GACP,MAAM,EAAE,CAoBV;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAI/F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAM7D;AAED,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,YAAY,EACnB,QAAQ,EAAE;IACT,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5C,GACC,IAAI,CAqBN"}