@franzzemen/brokenstock-shell 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"franzzemen-brokenstock-shell.mjs","sources":["../../src/lib/tokens/shell-tokens.ts","../../src/lib/provide-shell-config.ts","../../src/lib/services/thinking.service.ts","../../src/lib/services/authentication.service.ts","../../src/lib/guards/auth.guard.ts","../../src/lib/interceptors/auth.interceptor.ts","../../src/lib/directives/regex-validator.directive.ts","../../src/lib/services/theme.service.ts","../../src/lib/services/terminal-focus.service.ts","../../src/lib/services/keyboard-shortcut.service.ts","../../src/lib/services/command-registry.service.ts","../../src/lib/commands/command.utils.ts","../../src/lib/services/command.service.ts","../../src/lib/components/status-bar/status-bar.ts","../../src/lib/components/status-bar/status-bar.html","../../src/lib/components/side-menu/side-menu.ts","../../src/lib/components/side-menu/side-menu.html","../../src/lib/components/main-content/main-content.ts","../../src/lib/components/main-content/main-content.html","../../src/lib/components/command-terminal/command-terminal.ts","../../src/lib/components/command-terminal/command-terminal.html","../../src/lib/components/shell/shell.ts","../../src/lib/components/shell/shell.html","../../src/lib/components/login/login.ts","../../src/lib/components/login/login.html","../../src/lib/components/confirm-dialog/confirm-dialog.ts","../../src/public-api.ts","../../src/franzzemen-brokenstock-shell.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { CommandDefinition } from '../types/command.types';\nimport { MenuItem } from '../types/menu.types';\n\nexport interface ShellAuthUrls {\n login: string;\n logout: string;\n refresh: string;\n}\n\nexport const SHELL_APP_NAME = new InjectionToken<string>('SHELL_APP_NAME');\nexport const SHELL_MENU_ITEMS = new InjectionToken<MenuItem[]>('SHELL_MENU_ITEMS');\nexport const SHELL_AUTH_URLS = new InjectionToken<ShellAuthUrls>('SHELL_AUTH_URLS');\n\n/**\n * App-specific commands to register alongside the built-in command set.\n * Provide via provideShellConfig().\n */\nexport const SHELL_COMMANDS = new InjectionToken<CommandDefinition[]>('SHELL_COMMANDS');\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { CommandDefinition } from './types/command.types';\nimport { MenuItem } from './types/menu.types';\nimport { SHELL_APP_NAME, SHELL_AUTH_URLS, SHELL_COMMANDS, SHELL_MENU_ITEMS, ShellAuthUrls } from './tokens/shell-tokens';\n\nexport interface ShellConfig {\n appName: string;\n menuItems: MenuItem[];\n authUrls: ShellAuthUrls;\n commands?: CommandDefinition[];\n}\n\nexport function provideShellConfig(config: ShellConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: SHELL_APP_NAME, useValue: config.appName },\n { provide: SHELL_MENU_ITEMS, useValue: config.menuItems },\n { provide: SHELL_AUTH_URLS, useValue: config.authUrls },\n { provide: SHELL_COMMANDS, useValue: config.commands ?? [] },\n ]);\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class ThinkingService {\n readonly #activeCount = signal(0);\n\n readonly isThinking = computed(() => this.#activeCount() > 0);\n\n startThinking(): void {\n this.#activeCount.update(c => c + 1);\n }\n\n stopThinking(): void {\n this.#activeCount.update(c => Math.max(0, c - 1));\n }\n\n reset(): void {\n this.#activeCount.set(0);\n }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { BEARER_TOKEN_REGEX, BearerToken, HttpHeader } from '@franzzemen/utility';\nimport { AuthenticationResponse, Credentials, EffectivePermissions, RoleNames, SessionSummary, UserSession, validateCredentials } from '@franzzemen/identity';\nimport { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { ThinkingService } from './thinking.service';\nimport { SHELL_AUTH_URLS } from '../tokens/shell-tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthenticationService {\n readonly authenticated = signal(false);\n readonly authenticating = signal(false);\n readonly userSession = signal<UserSession | undefined>(undefined);\n readonly effectivePermissions = signal<EffectivePermissions>({});\n readonly conflictSessions = signal<SessionSummary[] | undefined>(undefined);\n\n #refreshing: Promise<boolean> | null = null;\n #auth: BearerToken = 'Bearer ..' as BearerToken;\n\n readonly #httpClient = inject(HttpClient);\n readonly #thinkingService = inject(ThinkingService);\n readonly #router = inject(Router);\n readonly #authUrls = inject(SHELL_AUTH_URLS);\n\n get auth(): BearerToken {\n return this.#auth;\n }\n\n /** Check if the current user has a specific role. */\n hasRole(roleName: RoleNames): boolean {\n return this.authenticated() && this.userSession()?.roles.includes(roleName) === true;\n }\n\n /** Check if the current user has any of the specified roles. */\n hasAnyRole(roleNames: RoleNames[]): boolean {\n return this.authenticated() && roleNames.some(r => this.userSession()?.roles.includes(r) === true);\n }\n\n refresh(): Promise<boolean> {\n if (this.#refreshing) {\n return this.#refreshing;\n }\n this.#refreshing = this.#doRefresh().finally(() => { this.#refreshing = null; });\n return this.#refreshing;\n }\n\n logout(): void {\n const subscription = this.#httpClient\n .get<void>(this.#authUrls.logout, {\n headers: {\n [HttpHeader.Authorization]: this.#auth,\n [HttpHeader.AppContext]: 'brokenstock',\n },\n })\n .subscribe({\n next: () => {\n this.#clearSession();\n subscription.unsubscribe();\n },\n error: () => {\n this.#thinkingService.reset();\n this.#clearSession();\n },\n });\n }\n\n login(credentials: Credentials, force = false): Promise<void> {\n const validation = validateCredentials(credentials);\n if (validation !== true) {\n return Promise.reject('Invalid credentials');\n }\n this.conflictSessions.set(undefined);\n this.#thinkingService.startThinking();\n return new Promise((resolve, reject) => {\n this.authenticating.set(true);\n const body = force ? {...credentials, force: true} : credentials;\n const subscription = this.#httpClient\n .post<HttpResponse<AuthenticationResponse>>(\n this.#authUrls.login,\n body,\n {\n headers: {\n [HttpHeader.ContentType]: 'application/json',\n [HttpHeader.AppContext]: 'brokenstock',\n },\n observe: 'response',\n responseType: 'json',\n withCredentials: true,\n },\n )\n .subscribe({\n next: (response: HttpResponse<any>) => {\n try {\n const authResponse: AuthenticationResponse = response.body;\n // @ts-ignore\n delete authResponse.session.token;\n this.userSession.set(authResponse.session);\n this.effectivePermissions.set(authResponse.effectivePermissions ?? {});\n const auth = response.headers.get(HttpHeader.Authorization);\n if (!auth || !BEARER_TOKEN_REGEX.test(auth)) {\n reject('Unable to login');\n return;\n }\n this.#auth = auth as BearerToken;\n this.authenticated.set(true);\n resolve();\n } catch {\n reject('Unable to login');\n } finally {\n this.authenticating.set(false);\n subscription.unsubscribe();\n this.#thinkingService.stopThinking();\n }\n },\n error: (err: HttpErrorResponse) => {\n try {\n if (err.status === 409) {\n this.conflictSessions.set(err.error?.activeSessions ?? []);\n reject('conflict');\n } else {\n reject(err.message ?? 'Unable to login');\n }\n } finally {\n this.authenticating.set(false);\n subscription.unsubscribe();\n this.#thinkingService.stopThinking();\n }\n },\n });\n });\n }\n\n async #doRefresh(): Promise<boolean> {\n try {\n const response = await fetch(this.#authUrls.refresh, {\n method: 'POST',\n headers: {\n [HttpHeader.Authorization]: this.#auth,\n [HttpHeader.AppContext]: 'brokenstock',\n },\n credentials: 'include',\n });\n if (!response.ok) return false;\n const auth = response.headers.get(HttpHeader.Authorization);\n if (!auth || !BEARER_TOKEN_REGEX.test(auth)) return false;\n const body: AuthenticationResponse = await response.json();\n this.#auth = auth as BearerToken;\n this.userSession.set(body.session);\n this.effectivePermissions.set(body.effectivePermissions ?? {});\n return true;\n } catch {\n return false;\n }\n }\n\n #clearSession(): void {\n this.authenticated.set(false);\n this.userSession.set(undefined);\n this.effectivePermissions.set({});\n this.conflictSessions.set(undefined);\n this.#auth = 'Bearer ..' as BearerToken;\n this.#router.navigate(['/login']).catch(console.error);\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthenticationService } from '../services/authentication.service';\n\nexport const authGuard: CanActivateFn = () => {\n const authService = inject(AuthenticationService);\n const router = inject(Router);\n\n if (authService.authenticated()) {\n return true;\n }\n return router.createUrlTree(['/login']);\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { from, switchMap, catchError, tap, throwError } from 'rxjs';\nimport { AuthenticationService } from '../services/authentication.service';\nimport { ThinkingService } from '../services/thinking.service';\nimport { SHELL_AUTH_URLS } from '../tokens/shell-tokens';\nimport { HttpHeader } from '@franzzemen/utility';\n\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const authService = inject(AuthenticationService);\n const thinkingService = inject(ThinkingService);\n const authUrls = inject(SHELL_AUTH_URLS);\n const router = inject(Router);\n\n return next(req).pipe(\n tap({\n next: (event) => {\n if ('headers' in event && event.headers?.get('x-permissions-stale') === 'true') {\n authService.refresh();\n }\n },\n }),\n catchError((error) => {\n const isRefreshOrLogin = req.url === authUrls.refresh || req.url === authUrls.login;\n if (error.status === 401 && !isRefreshOrLogin) {\n return from(authService.refresh()).pipe(\n switchMap((refreshed) => {\n if (refreshed) {\n const retryReq = req.clone({\n setHeaders: { [HttpHeader.Authorization]: authService.auth },\n });\n return next(retryReq);\n }\n thinkingService.reset();\n authService.authenticated.set(false);\n authService.userSession.set(undefined);\n router.navigate(['/login']);\n return throwError(() => error);\n }),\n catchError(() => {\n thinkingService.reset();\n authService.authenticated.set(false);\n authService.userSession.set(undefined);\n router.navigate(['/login']);\n return throwError(() => error);\n }),\n );\n }\n return throwError(() => error);\n }),\n );\n};\n","import { Directive, input } from '@angular/core';\nimport { AbstractControl, NG_VALIDATORS, ValidationErrors, Validator } from '@angular/forms';\n\n@Directive({\n selector: '[regexValidator]',\n providers: [{ provide: NG_VALIDATORS, useExisting: RegexValidatorDirective, multi: true }],\n})\nexport class RegexValidatorDirective implements Validator {\n regex = input(/^[A-Z0-9._%+-@!?]{4,64}$/i);\n\n validate(control: AbstractControl): ValidationErrors | null {\n if (!control.value || !this.regex().test(control.value)) {\n return { regexValidator: { value: control.value } };\n }\n return null;\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\nexport type ThemeMode = 'dark';\n\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n readonly mode = signal<ThemeMode>('dark');\n readonly isDark = computed(() => this.mode() === 'dark');\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class TerminalFocusService {\n readonly focusRequested = signal(0);\n\n requestFocus(): void {\n this.focusRequested.update(v => v + 1);\n }\n}\n","import { computed, inject, Injectable, NgZone, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { TerminalFocusService } from './terminal-focus.service';\n\nexport interface ShortcutRegistration {\n key: string;\n modifier?: 'Alt';\n action: () => void;\n description: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class KeyboardShortcutService {\n readonly #groups = new Map<string, ShortcutRegistration[]>();\n readonly #activeGroupId = signal<string | null>(null);\n\n readonly #document = inject(DOCUMENT);\n readonly #zone = inject(NgZone);\n readonly #focusService = inject(TerminalFocusService);\n\n readonly helpVisible = signal(false);\n\n readonly activeShortcuts = computed(() => {\n const groupId = this.#activeGroupId();\n if (!groupId) return null;\n const shortcuts = this.#groups.get(groupId);\n if (!shortcuts) return null;\n return { groupId, shortcuts };\n });\n\n constructor() {\n this.#zone.runOutsideAngular(() => {\n this.#document.addEventListener('keydown', (event: KeyboardEvent) => {\n this.#handleKeydown(event);\n });\n });\n }\n\n registerGroup(groupId: string, shortcuts: ShortcutRegistration[]): void {\n this.#groups.set(groupId, shortcuts);\n this.#activeGroupId.set(groupId);\n }\n\n unregisterGroup(groupId: string): void {\n this.#groups.delete(groupId);\n if (this.#activeGroupId() === groupId) {\n const keys = [...this.#groups.keys()];\n this.#activeGroupId.set(keys.length > 0 ? keys[keys.length - 1] : null);\n }\n }\n\n toggleHelp(): void {\n this.helpVisible.update(v => !v);\n }\n\n #handleKeydown(event: KeyboardEvent): boolean {\n const activeId = this.#activeGroupId();\n if (activeId) {\n const shortcuts = this.#groups.get(activeId);\n if (shortcuts) {\n const match = shortcuts.find(s => {\n if (s.modifier === 'Alt') return event.altKey && s.key === event.key;\n return !event.altKey && !event.ctrlKey && !event.metaKey && s.key === event.key;\n });\n if (match) {\n event.preventDefault();\n this.#zone.run(() => match.action());\n return true;\n }\n }\n }\n\n if (event.key === 'Escape') {\n event.preventDefault();\n this.#zone.run(() => {\n this.helpVisible.set(false);\n this.#focusService.requestFocus();\n });\n return true;\n }\n\n if (!event.altKey) return false;\n\n if (event.key === '?' || event.key === '/') {\n event.preventDefault();\n this.#zone.run(() => this.toggleHelp());\n return true;\n }\n\n return false;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CommandDefinition } from '../types/command.types';\nimport { SHELL_COMMANDS } from '../tokens/shell-tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class CommandRegistryService {\n private readonly commands = new Map<string, CommandDefinition>();\n\n constructor() {\n const appCommands = inject(SHELL_COMMANDS, { optional: true }) ?? [];\n for (const cmd of appCommands) {\n this.register(cmd);\n }\n }\n\n register(command: CommandDefinition): void {\n this.commands.set(command.name, command);\n }\n\n get(name: string): CommandDefinition | undefined {\n return this.commands.get(name);\n }\n\n getAll(): CommandDefinition[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Returns command name suggestions for tab-completion.\n * Built-ins (clear, help) are included when authenticated.\n */\n getSuggestions(prefix: string, isAuthenticated: boolean): string[] {\n if (!prefix) return [];\n if (!isAuthenticated) {\n return 'login'.startsWith(prefix) && 'login' !== prefix ? ['login'] : [];\n }\n const builtIns = ['clear', 'help'];\n const registered = [...this.commands.values()].map(c => c.name);\n return [...builtIns, ...registered]\n .filter(name => name.startsWith(prefix) && name !== prefix)\n .sort();\n }\n}\n","/**\n * Quote-aware command tokenizer. Treats \"...\" as single tokens and strips enclosing quotes.\n */\nexport function tokenize(input: string): string[] {\n return (input.match(/(?:\"[^\"]*\"|\\S)+/g) ?? []).map(t => t.replace(/\"([^\"]*)\"/g, '$1'));\n}\n\nexport const CLEAR_USAGE =\n 'clear\\n\\n' +\n ' Clears the terminal history.\\n' +\n ' No arguments required.';\n\nexport const HELP_USAGE =\n 'help [command]\\n\\n' +\n ' With no arguments, lists all available commands.\\n' +\n ' With a command name, shows detailed usage for that command.\\n\\n' +\n ' Arguments:\\n' +\n ' [command] Optional command name to show detailed help for';\n","import { inject, Injectable, signal, computed, effect } from '@angular/core';\nimport { z } from 'zod/v4';\nimport { CommandResult, CommandHistoryEntry, Severity } from '../types/command.types';\nimport { tokenize, CLEAR_USAGE, HELP_USAGE } from '../commands/command.utils';\nimport { CommandRegistryService } from './command-registry.service';\nimport { AuthenticationService } from './authentication.service';\n\nexport type { CommandResult, CommandHistoryEntry, Severity };\n\nconst CommandInputSchema = z.string().trim().min(1, 'Command cannot be empty');\n\n@Injectable({ providedIn: 'root' })\nexport class CommandService {\n readonly history = signal<CommandHistoryEntry[]>([]);\n readonly currentInput = signal('');\n readonly isProcessing = signal(false);\n\n private readonly authService = inject(AuthenticationService);\n private readonly registry = inject(CommandRegistryService);\n\n constructor() {\n effect(() => {\n if (!this.authService.authenticated()) {\n this.history.set([]);\n }\n });\n }\n\n readonly lastResult = computed(() => {\n const h = this.history();\n return h.length > 0 ? h[h.length - 1].result : null;\n });\n\n echoCommand(input: string): void {\n if (this.#coalesce(input)) return;\n this.history.update(h => [...h, {\n input,\n result: { success: true, message: '', timestamp: new Date() },\n repeatCount: 1,\n }]);\n }\n\n pushNotification(notification: { message: string; severity: Severity }): void {\n this.history.update(h => [...h, {\n input: '',\n result: {\n success: notification.severity !== 'error',\n message: notification.message,\n timestamp: new Date(),\n severity: notification.severity,\n },\n }]);\n }\n\n execute(rawInput: string): void {\n const validation = CommandInputSchema.safeParse(rawInput);\n if (!validation.success) {\n this.history.update(h => [...h, {\n input: rawInput,\n result: { success: false, message: validation.error.issues[0].message, timestamp: new Date() },\n }]);\n this.currentInput.set('');\n return;\n }\n\n const input = validation.data;\n const parts = tokenize(input);\n const command = parts[0].toLowerCase();\n\n const def = this.registry.get(command);\n const displayInput = def?.sanitizeInput ? def.sanitizeInput(input) : input;\n\n const resultOrPromise = this.#dispatch(command, parts.slice(1));\n this.currentInput.set('');\n\n if (resultOrPromise instanceof Promise) {\n this.isProcessing.set(true);\n resultOrPromise\n .then(result => {\n if (!this.#coalesce(displayInput)) {\n this.history.update(h => [...h, { input: displayInput, result, repeatCount: 1 }]);\n }\n })\n .finally(() => this.isProcessing.set(false));\n } else {\n if (!this.#coalesce(displayInput)) {\n this.history.update(h => [...h, { input: displayInput, result: resultOrPromise, repeatCount: 1 }]);\n }\n }\n }\n\n #coalesce(input: string): boolean {\n if (!input) return false;\n const h = this.history();\n for (let i = h.length - 1; i >= 0; i--) {\n if (h[i].input) {\n if (h[i].input === input) {\n this.history.update(history => {\n const updated = [...history];\n updated[i] = { ...updated[i], repeatCount: (updated[i].repeatCount ?? 1) + 1 };\n return updated;\n });\n return true;\n }\n return false;\n }\n }\n return false;\n }\n\n #dispatch(command: string, args: string[]): CommandResult | Promise<CommandResult> {\n const hasHelp = args.some(a => a.toLowerCase() === 'help');\n const isAuthenticated = this.authService.authenticated();\n\n if (!isAuthenticated && command !== 'login') {\n return { success: false, message: 'Not logged in. Use \"login\" to authenticate.', timestamp: new Date() };\n }\n\n if (command === 'clear') {\n if (hasHelp) return { success: true, message: CLEAR_USAGE, timestamp: new Date() };\n this.history.set([]);\n return { success: true, message: '', timestamp: new Date() };\n }\n\n if (command === 'help') {\n const target = args[0]?.toLowerCase();\n if (target) return this.#commandHelp(target);\n const registered = this.registry.getAll();\n const lines = [\n ' clear — Clear terminal history',\n ' help — List available commands',\n ...registered.map(c => ` ${c.name} — ${c.description}`),\n ];\n return {\n success: true,\n message: 'Available commands:\\n' + lines.join('\\n') + '\\n\\nType \"help <command>\" or \"<command> help\" for detailed usage.',\n timestamp: new Date(),\n };\n }\n\n const def = this.registry.get(command);\n if (!def) {\n return { success: false, message: `Unknown command: ${command}`, timestamp: new Date() };\n }\n\n if (hasHelp) {\n return { success: true, message: def.usage, timestamp: new Date() };\n }\n\n const validation = def.argsSchema.safeParse(args);\n if (!validation.success) {\n return { success: false, message: `Invalid arguments for '${command}': ${validation.error.issues[0].message}`, timestamp: new Date() };\n }\n\n return def.execute(args);\n }\n\n #commandHelp(name: string): CommandResult {\n if (name === 'clear') return { success: true, message: CLEAR_USAGE, timestamp: new Date() };\n if (name === 'help') return { success: true, message: HELP_USAGE, timestamp: new Date() };\n const def = this.registry.get(name);\n if (!def) return { success: false, message: `Unknown command: ${name}`, timestamp: new Date() };\n return { success: true, message: def.usage, timestamp: new Date() };\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { CommandService } from '../../services/command.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\n\n@Component({\n selector: 'shell-status-bar',\n templateUrl: './status-bar.html',\n styleUrl: './status-bar.css',\n})\nexport class StatusBar {\n readonly #authService = inject(AuthenticationService);\n readonly #focusService = inject(TerminalFocusService);\n readonly #commandService = inject(CommandService);\n\n readonly isAuthenticated = this.#authService.authenticated;\n readonly loginStatus = computed(() =>\n this.#authService.authenticating()\n ? 'Authenticating...'\n : this.#authService.authenticated()\n ? 'Logged in'\n : 'Not logged in',\n );\n\n logout(): void {\n this.#authService.logout();\n this.#commandService.echoCommand('logout');\n this.#focusService.requestFocus();\n }\n}\n","<div class=\"status-bar\">\n <div class=\"status-item\">\n <span class=\"status-label text-secondary-info\">Status:</span>\n @if (isAuthenticated()) {\n <a class=\"status-value text-interactive logout-link\" (click)=\"logout()\">Log Out</a>\n } @else {\n <span class=\"status-value text-loss\">{{ loginStatus() }}</span>\n }\n </div>\n @if (isAuthenticated()) {\n <ng-content />\n }\n</div>\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { CommandService } from '../../services/command.service';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\nimport { SHELL_MENU_ITEMS } from '../../tokens/shell-tokens';\nimport { MenuItem } from '../../types/menu.types';\n\nexport { MenuItem };\n\n@Component({\n selector: 'shell-side-menu',\n imports: [RouterLink, RouterLinkActive, MatIconModule, MatTooltipModule],\n templateUrl: './side-menu.html',\n styleUrl: './side-menu.css',\n})\nexport class SideMenu {\n readonly #focusService = inject(TerminalFocusService);\n readonly #commandService = inject(CommandService);\n readonly #shortcutService = inject(KeyboardShortcutService);\n readonly hasShortcuts = this.#shortcutService.activeShortcuts;\n\n readonly #allMenuItems: MenuItem[] = inject(SHELL_MENU_ITEMS, { optional: true }) ?? [];\n\n readonly menuItems = computed(() =>\n this.#allMenuItems.filter(item => !item.visible || item.visible()),\n );\n\n onMenuClick(item: MenuItem): void {\n if (item.command) {\n this.#commandService.echoCommand(item.command);\n }\n this.#focusService.requestFocus();\n }\n\n toggleHelp(): void {\n this.#shortcutService.toggleHelp();\n }\n}\n","<nav class=\"side-menu\">\n @for (item of menuItems(); track item.route) {\n <a\n class=\"menu-item\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"active\"\n [matTooltip]=\"item.label\"\n matTooltipPosition=\"right\"\n (click)=\"onMenuClick(item)\"\n >\n <mat-icon>{{ item.icon }}</mat-icon>\n </a>\n }\n <div class=\"menu-spacer\"></div>\n @if (hasShortcuts()) {\n <button\n class=\"help-button\"\n matTooltip=\"Keyboard shortcuts\"\n matTooltipPosition=\"right\"\n (click)=\"toggleHelp()\"\n >\n <span class=\"help-modifier\">Alt+</span><span class=\"help-key\">?</span>\n </button>\n }\n</nav>\n","import { Component, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { ThinkingService } from '../../services/thinking.service';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\n\n@Component({\n selector: 'shell-main-content',\n imports: [RouterOutlet, MatProgressSpinnerModule],\n templateUrl: './main-content.html',\n styleUrl: './main-content.css',\n})\nexport class MainContent {\n readonly #thinkingService = inject(ThinkingService);\n readonly #shortcutService = inject(KeyboardShortcutService);\n readonly isThinking = this.#thinkingService.isThinking;\n readonly shortcutHelpVisible = this.#shortcutService.helpVisible;\n readonly activeShortcuts = this.#shortcutService.activeShortcuts;\n\n formatKey(key: string): string {\n const keyMap: Record<string, string> = {\n ArrowUp: '↑', ArrowDown: '↓', ArrowLeft: '←', ArrowRight: '→',\n PageUp: 'PgUp', PageDown: 'PgDn',\n };\n return keyMap[key] ?? key;\n }\n\n closeShortcutHelp(): void {\n this.#shortcutService.helpVisible.set(false);\n }\n}\n","<div class=\"main-content\">\n <div class=\"content-area\">\n <router-outlet />\n </div>\n @if (shortcutHelpVisible() && activeShortcuts()) {\n <div class=\"shortcut-overlay\" (click)=\"closeShortcutHelp()\">\n <div class=\"shortcut-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"shortcut-title text-secondary-info\">{{ activeShortcuts()!.groupId }} shortcuts</div>\n @for (s of activeShortcuts()!.shortcuts; track s.key) {\n <div class=\"shortcut-row\">\n <kbd class=\"shortcut-key\">Alt+{{ formatKey(s.key) }}</kbd>\n <span class=\"shortcut-desc text-text-primary\">{{ s.description }}</span>\n </div>\n }\n <div class=\"shortcut-row shortcut-dismiss\">\n <kbd class=\"shortcut-key\">Alt+?</kbd>\n <span class=\"shortcut-desc text-secondary-info\">or</span>\n <kbd class=\"shortcut-key\">Esc</kbd>\n <span class=\"shortcut-desc text-secondary-info\">dismiss</span>\n </div>\n </div>\n </div>\n }\n @if (isThinking()) {\n <div class=\"thinking-overlay\">\n <mat-spinner diameter=\"48\" />\n </div>\n }\n</div>\n","import { Component, inject, ElementRef, viewChild, effect, afterNextRender, computed } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommandService } from '../../services/command.service';\nimport { CommandRegistryService } from '../../services/command-registry.service';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { CommandResult } from '../../types/command.types';\n\n@Component({\n selector: 'shell-command-terminal',\n imports: [FormsModule],\n templateUrl: './command-terminal.html',\n styleUrl: './command-terminal.css',\n})\nexport class CommandTerminal {\n private readonly commandService = inject(CommandService);\n private readonly registry = inject(CommandRegistryService);\n private readonly authService = inject(AuthenticationService);\n private readonly terminalFocusService = inject(TerminalFocusService);\n\n readonly history = computed(() => [...this.commandService.history()].reverse());\n readonly currentInput = this.commandService.currentInput;\n readonly isProcessing = this.commandService.isProcessing;\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('terminalInput');\n\n private tabCycleIndex = -1;\n private lastTabPrefix = '';\n\n readonly ghostText = computed(() => {\n const input = this.currentInput().trim();\n if (!input || input.includes(' ')) return '';\n const prefix = input.toLowerCase();\n const suggestions = this.registry.getSuggestions(prefix, this.authService.authenticated());\n return suggestions.length > 0 ? suggestions[0] : '';\n });\n\n constructor() {\n afterNextRender(() => this.focusInput());\n\n effect(() => {\n if (!this.isProcessing()) {\n setTimeout(() => this.focusInput());\n }\n });\n\n effect(() => {\n this.terminalFocusService.focusRequested();\n setTimeout(() => this.focusInput());\n });\n }\n\n onSubmit(): void {\n const input = this.currentInput();\n if (!input.trim()) return;\n this.commandService.execute(input);\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n this.focusInput();\n }\n\n onInputChange(value: string): void {\n this.currentInput.set(value);\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n }\n\n onTab(event: KeyboardEvent): void {\n event.preventDefault();\n const input = this.currentInput().trim();\n if (!input || input.includes(' ')) return;\n\n const prefix = input.toLowerCase();\n const suggestions = this.registry.getSuggestions(prefix, this.authService.authenticated());\n if (suggestions.length === 0) return;\n\n if (suggestions.length === 1) {\n this.currentInput.set(suggestions[0] + ' ');\n this.tabCycleIndex = -1;\n this.lastTabPrefix = '';\n return;\n }\n\n if (this.lastTabPrefix !== prefix) {\n this.lastTabPrefix = prefix;\n this.tabCycleIndex = -1;\n }\n\n if (event.shiftKey) {\n this.tabCycleIndex = this.tabCycleIndex <= 0 ? suggestions.length - 1 : this.tabCycleIndex - 1;\n } else {\n this.tabCycleIndex = (this.tabCycleIndex + 1) % suggestions.length;\n }\n\n this.currentInput.set(suggestions[this.tabCycleIndex]);\n }\n\n getSeverityClass(result: CommandResult): string {\n if (result.severity === 'info') return 'info';\n if (result.severity === 'warning') return 'warning';\n if (result.severity === 'error' || !result.success) return 'error';\n return '';\n }\n\n focusInput(): void {\n this.inputEl()?.nativeElement.focus();\n }\n}\n","<div class=\"terminal\">\n <div class=\"terminal-input-row\">\n <span class=\"prompt\">$</span>\n <div class=\"input-wrapper\">\n @if (ghostText()) {\n <input\n class=\"ghost-input\"\n type=\"text\"\n [value]=\"ghostText()\"\n disabled\n tabindex=\"-1\"\n aria-hidden=\"true\"\n />\n }\n <input\n #terminalInput\n class=\"terminal-input\"\n type=\"text\"\n [ngModel]=\"currentInput()\"\n (ngModelChange)=\"onInputChange($event)\"\n (keydown.enter)=\"onSubmit()\"\n (keydown.tab)=\"onTab($any($event))\"\n placeholder=\"Type a command...\"\n [disabled]=\"isProcessing()\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n </div>\n </div>\n <div class=\"terminal-output\">\n @for (entry of history(); track entry.result.timestamp) {\n @if (entry.input) {\n <div class=\"terminal-line\">\n <span class=\"prompt\">$</span>\n <span class=\"command-text\">{{ entry.input }}@if ((entry.repeatCount ?? 1) > 1) { <span class=\"repeat-count\">(×{{ entry.repeatCount }})</span>}</span>\n </div>\n }\n @if (entry.result.message) {\n <div class=\"terminal-line\" [class]=\"getSeverityClass(entry.result)\">{{ entry.result.message }}</div>\n }\n }\n </div>\n</div>\n","import { Component, inject, signal } from '@angular/core';\nimport { StatusBar } from '../status-bar/status-bar';\nimport { SideMenu } from '../side-menu/side-menu';\nimport { MainContent } from '../main-content/main-content';\nimport { CommandTerminal } from '../command-terminal/command-terminal';\nimport { ThinkingService } from '../../services/thinking.service';\n\nconst MIN_TERMINAL_HEIGHT = 80;\nconst MAX_TERMINAL_RATIO = 0.6;\nconst DEFAULT_TERMINAL_HEIGHT = 160;\n\n@Component({\n selector: 'shell-root',\n imports: [StatusBar, SideMenu, MainContent, CommandTerminal],\n templateUrl: './shell.html',\n styleUrl: './shell.css',\n})\nexport class Shell {\n readonly #thinkingService = inject(ThinkingService);\n readonly isThinking = this.#thinkingService.isThinking;\n readonly terminalHeight = signal(`${DEFAULT_TERMINAL_HEIGHT}px`);\n readonly isDragging = signal(false);\n\n #startY = 0;\n #startHeight = DEFAULT_TERMINAL_HEIGHT;\n\n readonly #onMouseMove = (event: MouseEvent) => {\n const deltaY = event.clientY - this.#startY;\n const maxHeight = Math.floor(window.innerHeight * MAX_TERMINAL_RATIO);\n const newHeight = Math.min(maxHeight, Math.max(MIN_TERMINAL_HEIGHT, this.#startHeight - deltaY));\n this.terminalHeight.set(`${newHeight}px`);\n };\n\n readonly #onMouseUp = () => {\n this.isDragging.set(false);\n document.removeEventListener('mousemove', this.#onMouseMove);\n document.removeEventListener('mouseup', this.#onMouseUp);\n };\n\n onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.#startY = event.clientY;\n this.#startHeight = parseInt(this.terminalHeight(), 10);\n this.isDragging.set(true);\n document.addEventListener('mousemove', this.#onMouseMove);\n document.addEventListener('mouseup', this.#onMouseUp);\n }\n}\n","<div class=\"shell\" [style.--terminal-height]=\"terminalHeight()\" [class.is-dragging]=\"isDragging()\">\n <shell-status-bar class=\"shell-status\" [class.disabled-zone]=\"isThinking()\" />\n <shell-side-menu class=\"shell-menu\" [class.disabled-zone]=\"isThinking()\" />\n <shell-main-content class=\"shell-main\" />\n <div class=\"shell-resize\" [class.dragging]=\"isDragging()\" (mousedown)=\"onResizeStart($event)\"></div>\n <shell-command-terminal class=\"shell-terminal\" [class.disabled-zone]=\"isThinking()\" />\n</div>\n","import { Component, inject, signal } from '@angular/core';\nimport { AutofillEvent, TextFieldModule } from '@angular/cdk/text-field';\nimport { Credentials, validateCredentials } from '@franzzemen/identity';\nimport { PASSWORD_REGEX, USERNAME_REGEX } from '@franzzemen/utility';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Router } from '@angular/router';\nimport { DatePipe } from '@angular/common';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { CommandService } from '../../services/command.service';\nimport { TerminalFocusService } from '../../services/terminal-focus.service';\nimport { RegexValidatorDirective } from '../../directives/regex-validator.directive';\nimport { SHELL_APP_NAME } from '../../tokens/shell-tokens';\n\n@Component({\n selector: 'shell-login',\n templateUrl: './login.html',\n styleUrl: './login.css',\n imports: [\n FormsModule,\n MatFormField,\n MatLabel,\n MatInput,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n RegexValidatorDirective,\n TextFieldModule,\n DatePipe,\n ],\n})\nexport class Login {\n model: Credentials = { username: '', password: '' };\n submitted = false;\n hide = signal(true);\n errors: { ndx: number; message: string }[] = [];\n\n protected readonly USERNAME_REGEX = USERNAME_REGEX;\n protected readonly PASSWORD_REGEX = PASSWORD_REGEX;\n protected readonly appName = inject(SHELL_APP_NAME, { optional: true }) ?? 'Application';\n\n readonly #commandService = inject(CommandService);\n readonly #terminalFocusService = inject(TerminalFocusService);\n\n constructor(\n protected authenticationService: AuthenticationService,\n protected router: Router,\n ) {}\n\n onAutofill(event: AutofillEvent, inputEl: HTMLInputElement): void {\n if (event.isAutofilled) {\n setTimeout(() => {\n const length = inputEl.value.length;\n inputEl.setSelectionRange(length, length);\n });\n }\n }\n\n clickEvent(event: MouseEvent): void {\n this.hide.set(!this.hide());\n event.stopPropagation();\n }\n\n onSubmit(event: Event): void {\n this.errors = [];\n event.preventDefault();\n this.submitted = true;\n const result = validateCredentials(this.model);\n if (result === true) {\n this.#doLogin(false);\n } else {\n for (let ndx = 0; ndx < result.length; ndx++) {\n this.errors.push({\n ndx,\n message: `${result[ndx].message ?? 'Unknown error'}: ${result[ndx].field ?? 'Unknown field'} ${result[ndx].type ?? 'Unknown type'} Expected: ${result[ndx].expected} Actual: ${result[ndx].actual}`,\n });\n }\n this.submitted = false;\n }\n }\n\n onTakeOver(): void {\n this.errors = [];\n this.submitted = true;\n this.#doLogin(true);\n }\n\n onCancelConflict(): void {\n this.authenticationService.conflictSessions.set(undefined);\n this.submitted = false;\n }\n\n #doLogin(force: boolean): void {\n this.authenticationService\n .login(this.model, force)\n .then(() => {\n this.#commandService.echoCommand(`login ${this.model.username}`);\n this.router.navigate(['/']).then(() => {\n setTimeout(() => this.#terminalFocusService.requestFocus());\n }).catch(console.error);\n })\n .catch((err) => {\n if (err !== 'conflict') {\n this.errors.push({ ndx: 0, message: typeof err === 'string' ? err : 'Unable to login' });\n }\n this.submitted = false;\n });\n }\n}\n","@let usernameRegex = USERNAME_REGEX;\n@let passwordRegex = PASSWORD_REGEX;\n<div class=\"login-container\">\n <div class=\"login-header\">\n <h2 class=\"text-text-primary\">{{ appName }}</h2>\n <p class=\"text-secondary-info\">Sign in to continue</p>\n </div>\n <form #loginForm=\"ngForm\" (ngSubmit)=\"onSubmit($event)\" class=\"login-form\">\n <mat-form-field appearance=\"outline\" class=\"login-field\">\n <mat-label>Username</mat-label>\n <input\n #usernameInput\n matInput\n placeholder=\"Enter username\"\n [(ngModel)]=\"model.username\"\n name=\"username\"\n [disabled]=\"submitted\"\n required\n regexValidator\n [regex]=\"usernameRegex\"\n (cdkAutofill)=\"onAutofill($event, usernameInput)\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"login-field\">\n <mat-label>Password</mat-label>\n <input\n #passwordInput\n matInput\n placeholder=\"Enter password\"\n [type]=\"hide() ? 'password' : 'text'\"\n [(ngModel)]=\"model.password\"\n name=\"password\"\n [disabled]=\"submitted\"\n regexValidator\n [regex]=\"passwordRegex\"\n (cdkAutofill)=\"onAutofill($event, passwordInput)\"\n />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"clickEvent($event)\"\n [attr.aria-label]=\"'Hide password'\"\n [attr.aria-pressed]=\"hide()\"\n >\n <mat-icon>{{ hide() ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n </mat-form-field>\n <button mat-flat-button type=\"submit\" [disabled]=\"submitted\" class=\"login-button\">\n Login\n </button>\n </form>\n @if (errors.length > 0) {\n <div class=\"login-errors\">\n @for (error of errors; track error.ndx) {\n <div class=\"login-error text-loss\">{{ error.message }}</div>\n }\n </div>\n }\n @if (authenticationService.conflictSessions(); as sessions) {\n <div class=\"login-conflict\">\n @for (session of sessions; track $index) {\n <p class=\"text-secondary-info\">\n Already logged in from <strong>{{ session.appContext }}</strong>\n since {{ session.startEpoch | date:'short' }}.\n </p>\n }\n <p class=\"text-secondary-info\">Log in here and end that session?</p>\n <div class=\"login-conflict-actions\">\n <button mat-stroked-button type=\"button\" (click)=\"onCancelConflict()\">Cancel</button>\n <button mat-flat-button type=\"button\" (click)=\"onTakeOver()\">Take Over</button>\n </div>\n </div>\n }\n</div>\n","import { Component, inject } from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport interface ConfirmDialogData {\n title: string;\n message: string;\n warningMessage?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n}\n\n@Component({\n selector: 'shell-confirm-dialog',\n imports: [MatDialogModule, MatButtonModule],\n template: `\n <h2 mat-dialog-title>{{ data.title }}</h2>\n <mat-dialog-content>\n <p>{{ data.message }}</p>\n @if (data.warningMessage) {\n <p class=\"warning-message\">{{ data.warningMessage }}</p>\n }\n </mat-dialog-content>\n <mat-dialog-actions align=\"end\">\n <button mat-button (click)=\"dialogRef.close(false)\">{{ data.cancelLabel ?? 'Cancel' }}</button>\n <button mat-flat-button color=\"warn\" (click)=\"dialogRef.close(true)\">{{ data.confirmLabel ?? 'Confirm' }}</button>\n </mat-dialog-actions>\n `,\n styles: [`\n :host { display: block; }\n .warning-message { color: var(--color-warning); margin-top: 8px; }\n `],\n})\nexport class ConfirmDialog {\n readonly data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\n readonly dialogRef = inject(MatDialogRef<ConfirmDialog>);\n}\n","/*\n * Public API surface for @franzzemen/brokenstock-shell\n */\n\n// Types\nexport * from './lib/types/command.types';\nexport * from './lib/types/menu.types';\n\n// Tokens & config\nexport * from './lib/tokens/shell-tokens';\nexport * from './lib/provide-shell-config';\n\n// Guards\nexport * from './lib/guards/auth.guard';\n\n// Interceptors\nexport * from './lib/interceptors/auth.interceptor';\n\n// Directives\nexport * from './lib/directives/regex-validator.directive';\n\n// Services\nexport * from './lib/services/thinking.service';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/terminal-focus.service';\nexport * from './lib/services/keyboard-shortcut.service';\nexport * from './lib/services/authentication.service';\nexport * from './lib/services/command-registry.service';\nexport * from './lib/services/command.service';\n\n// Commands\nexport * from './lib/commands/command.utils';\n\n// Components\nexport * from './lib/components/shell/shell';\nexport * from './lib/components/side-menu/side-menu';\nexport * from './lib/components/status-bar/status-bar';\nexport * from './lib/components/main-content/main-content';\nexport * from './lib/components/command-terminal/command-terminal';\nexport * from './lib/components/login/login';\nexport * from './lib/components/confirm-dialog/confirm-dialog';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.AuthenticationService","i2"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@franzzemen/brokenstock-shell",
3
+ "version": "0.0.1",
4
+ "description": "Shared Angular shell library for Brokenstock applications",
5
+ "author": "Franz Zemen",
6
+ "license": "UNLICENSED",
7
+ "peerDependencies": {
8
+ "@angular/animations": "^21.0.0",
9
+ "@angular/cdk": "^21.0.0",
10
+ "@angular/common": "^21.0.0",
11
+ "@angular/core": "^21.0.0",
12
+ "@angular/forms": "^21.0.0",
13
+ "@angular/material": "^21.0.0",
14
+ "@angular/router": "^21.0.0",
15
+ "@franzzemen/identity": "^21.10.6",
16
+ "@franzzemen/utility": "^13.5.5",
17
+ "rxjs": "~7.8.0",
18
+ "zod": "^4.3.6"
19
+ },
20
+ "module": "fesm2022/franzzemen-brokenstock-shell.mjs",
21
+ "typings": "types/franzzemen-brokenstock-shell.d.ts",
22
+ "exports": {
23
+ "./package.json": {
24
+ "default": "./package.json"
25
+ },
26
+ ".": {
27
+ "types": "./types/franzzemen-brokenstock-shell.d.ts",
28
+ "default": "./fesm2022/franzzemen-brokenstock-shell.mjs"
29
+ }
30
+ },
31
+ "sideEffects": false,
32
+ "type": "module",
33
+ "dependencies": {
34
+ "tslib": "^2.3.0"
35
+ }
36
+ }
@@ -0,0 +1,298 @@
1
+ import { z } from 'zod/v4';
2
+ import * as _angular_core from '@angular/core';
3
+ import { InjectionToken, EnvironmentProviders } from '@angular/core';
4
+ import { CanActivateFn, Router } from '@angular/router';
5
+ import { HttpInterceptorFn } from '@angular/common/http';
6
+ import { Validator, AbstractControl, ValidationErrors } from '@angular/forms';
7
+ import { BearerToken } from '@franzzemen/utility';
8
+ import { UserSession, EffectivePermissions, SessionSummary, RoleNames, Credentials } from '@franzzemen/identity';
9
+ import * as _franzzemen_brokenstock_shell from '@franzzemen/brokenstock-shell';
10
+ import { AutofillEvent } from '@angular/cdk/text-field';
11
+ import { MatDialogRef } from '@angular/material/dialog';
12
+
13
+ type Severity = 'error' | 'warning' | 'info';
14
+ interface CommandResult {
15
+ success: boolean;
16
+ message: string;
17
+ timestamp: Date;
18
+ severity?: Severity;
19
+ }
20
+ interface CommandHistoryEntry {
21
+ input: string;
22
+ result: CommandResult;
23
+ repeatCount?: number;
24
+ }
25
+ /**
26
+ * Lexicon entry: the platform-agnostic definition of a command.
27
+ * Execution is provided by each consumer (Angular app, CLI app, etc.).
28
+ */
29
+ interface CommandLexiconEntry {
30
+ readonly name: string;
31
+ readonly description: string;
32
+ readonly usage: string;
33
+ readonly requiresAuth: boolean;
34
+ readonly argsSchema: z.ZodType;
35
+ sanitizeInput?(input: string): string;
36
+ }
37
+ /**
38
+ * Full command definition including execution.
39
+ */
40
+ interface CommandDefinition extends CommandLexiconEntry {
41
+ execute(args: string[]): CommandResult | Promise<CommandResult>;
42
+ }
43
+
44
+ interface MenuItem {
45
+ icon: string;
46
+ label: string;
47
+ route: string;
48
+ command?: string;
49
+ visible?: () => boolean;
50
+ }
51
+
52
+ interface ShellAuthUrls {
53
+ login: string;
54
+ logout: string;
55
+ refresh: string;
56
+ }
57
+ declare const SHELL_APP_NAME: InjectionToken<string>;
58
+ declare const SHELL_MENU_ITEMS: InjectionToken<MenuItem[]>;
59
+ declare const SHELL_AUTH_URLS: InjectionToken<ShellAuthUrls>;
60
+ /**
61
+ * App-specific commands to register alongside the built-in command set.
62
+ * Provide via provideShellConfig().
63
+ */
64
+ declare const SHELL_COMMANDS: InjectionToken<CommandDefinition[]>;
65
+
66
+ interface ShellConfig {
67
+ appName: string;
68
+ menuItems: MenuItem[];
69
+ authUrls: ShellAuthUrls;
70
+ commands?: CommandDefinition[];
71
+ }
72
+ declare function provideShellConfig(config: ShellConfig): EnvironmentProviders;
73
+
74
+ declare const authGuard: CanActivateFn;
75
+
76
+ declare const authInterceptor: HttpInterceptorFn;
77
+
78
+ declare class RegexValidatorDirective implements Validator {
79
+ regex: _angular_core.InputSignal<RegExp>;
80
+ validate(control: AbstractControl): ValidationErrors | null;
81
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RegexValidatorDirective, never>;
82
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RegexValidatorDirective, "[regexValidator]", never, { "regex": { "alias": "regex"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
83
+ }
84
+
85
+ declare class ThinkingService {
86
+ #private;
87
+ readonly isThinking: _angular_core.Signal<boolean>;
88
+ startThinking(): void;
89
+ stopThinking(): void;
90
+ reset(): void;
91
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThinkingService, never>;
92
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThinkingService>;
93
+ }
94
+
95
+ type ThemeMode = 'dark';
96
+ declare class ThemeService {
97
+ readonly mode: _angular_core.WritableSignal<"dark">;
98
+ readonly isDark: _angular_core.Signal<boolean>;
99
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ThemeService, never>;
100
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ThemeService>;
101
+ }
102
+
103
+ declare class TerminalFocusService {
104
+ readonly focusRequested: _angular_core.WritableSignal<number>;
105
+ requestFocus(): void;
106
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TerminalFocusService, never>;
107
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TerminalFocusService>;
108
+ }
109
+
110
+ interface ShortcutRegistration {
111
+ key: string;
112
+ modifier?: 'Alt';
113
+ action: () => void;
114
+ description: string;
115
+ }
116
+ declare class KeyboardShortcutService {
117
+ #private;
118
+ readonly helpVisible: _angular_core.WritableSignal<boolean>;
119
+ readonly activeShortcuts: _angular_core.Signal<{
120
+ groupId: string;
121
+ shortcuts: ShortcutRegistration[];
122
+ }>;
123
+ constructor();
124
+ registerGroup(groupId: string, shortcuts: ShortcutRegistration[]): void;
125
+ unregisterGroup(groupId: string): void;
126
+ toggleHelp(): void;
127
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KeyboardShortcutService, never>;
128
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<KeyboardShortcutService>;
129
+ }
130
+
131
+ declare class AuthenticationService {
132
+ #private;
133
+ readonly authenticated: _angular_core.WritableSignal<boolean>;
134
+ readonly authenticating: _angular_core.WritableSignal<boolean>;
135
+ readonly userSession: _angular_core.WritableSignal<UserSession>;
136
+ readonly effectivePermissions: _angular_core.WritableSignal<EffectivePermissions>;
137
+ readonly conflictSessions: _angular_core.WritableSignal<SessionSummary[]>;
138
+ get auth(): BearerToken;
139
+ /** Check if the current user has a specific role. */
140
+ hasRole(roleName: RoleNames): boolean;
141
+ /** Check if the current user has any of the specified roles. */
142
+ hasAnyRole(roleNames: RoleNames[]): boolean;
143
+ refresh(): Promise<boolean>;
144
+ logout(): void;
145
+ login(credentials: Credentials, force?: boolean): Promise<void>;
146
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AuthenticationService, never>;
147
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AuthenticationService>;
148
+ }
149
+
150
+ declare class CommandRegistryService {
151
+ private readonly commands;
152
+ constructor();
153
+ register(command: CommandDefinition): void;
154
+ get(name: string): CommandDefinition | undefined;
155
+ getAll(): CommandDefinition[];
156
+ /**
157
+ * Returns command name suggestions for tab-completion.
158
+ * Built-ins (clear, help) are included when authenticated.
159
+ */
160
+ getSuggestions(prefix: string, isAuthenticated: boolean): string[];
161
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommandRegistryService, never>;
162
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CommandRegistryService>;
163
+ }
164
+
165
+ declare class CommandService {
166
+ #private;
167
+ readonly history: _angular_core.WritableSignal<CommandHistoryEntry[]>;
168
+ readonly currentInput: _angular_core.WritableSignal<string>;
169
+ readonly isProcessing: _angular_core.WritableSignal<boolean>;
170
+ private readonly authService;
171
+ private readonly registry;
172
+ constructor();
173
+ readonly lastResult: _angular_core.Signal<CommandResult>;
174
+ echoCommand(input: string): void;
175
+ pushNotification(notification: {
176
+ message: string;
177
+ severity: Severity;
178
+ }): void;
179
+ execute(rawInput: string): void;
180
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommandService, never>;
181
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CommandService>;
182
+ }
183
+
184
+ /**
185
+ * Quote-aware command tokenizer. Treats "..." as single tokens and strips enclosing quotes.
186
+ */
187
+ declare function tokenize(input: string): string[];
188
+ declare const CLEAR_USAGE: string;
189
+ declare const HELP_USAGE: string;
190
+
191
+ declare class Shell {
192
+ #private;
193
+ readonly isThinking: _angular_core.Signal<boolean>;
194
+ readonly terminalHeight: _angular_core.WritableSignal<string>;
195
+ readonly isDragging: _angular_core.WritableSignal<boolean>;
196
+ onResizeStart(event: MouseEvent): void;
197
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Shell, never>;
198
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Shell, "shell-root", never, {}, {}, never, never, true, never>;
199
+ }
200
+
201
+ declare class SideMenu {
202
+ #private;
203
+ readonly hasShortcuts: _angular_core.Signal<{
204
+ groupId: string;
205
+ shortcuts: _franzzemen_brokenstock_shell.ShortcutRegistration[];
206
+ }>;
207
+ readonly menuItems: _angular_core.Signal<MenuItem[]>;
208
+ onMenuClick(item: MenuItem): void;
209
+ toggleHelp(): void;
210
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SideMenu, never>;
211
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SideMenu, "shell-side-menu", never, {}, {}, never, never, true, never>;
212
+ }
213
+
214
+ declare class StatusBar {
215
+ #private;
216
+ readonly isAuthenticated: _angular_core.WritableSignal<boolean>;
217
+ readonly loginStatus: _angular_core.Signal<"Authenticating..." | "Logged in" | "Not logged in">;
218
+ logout(): void;
219
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatusBar, never>;
220
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatusBar, "shell-status-bar", never, {}, {}, never, ["*"], true, never>;
221
+ }
222
+
223
+ declare class MainContent {
224
+ #private;
225
+ readonly isThinking: _angular_core.Signal<boolean>;
226
+ readonly shortcutHelpVisible: _angular_core.WritableSignal<boolean>;
227
+ readonly activeShortcuts: _angular_core.Signal<{
228
+ groupId: string;
229
+ shortcuts: _franzzemen_brokenstock_shell.ShortcutRegistration[];
230
+ }>;
231
+ formatKey(key: string): string;
232
+ closeShortcutHelp(): void;
233
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MainContent, never>;
234
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MainContent, "shell-main-content", never, {}, {}, never, never, true, never>;
235
+ }
236
+
237
+ declare class CommandTerminal {
238
+ private readonly commandService;
239
+ private readonly registry;
240
+ private readonly authService;
241
+ private readonly terminalFocusService;
242
+ readonly history: _angular_core.Signal<_franzzemen_brokenstock_shell.CommandHistoryEntry[]>;
243
+ readonly currentInput: _angular_core.WritableSignal<string>;
244
+ readonly isProcessing: _angular_core.WritableSignal<boolean>;
245
+ private readonly inputEl;
246
+ private tabCycleIndex;
247
+ private lastTabPrefix;
248
+ readonly ghostText: _angular_core.Signal<string>;
249
+ constructor();
250
+ onSubmit(): void;
251
+ onInputChange(value: string): void;
252
+ onTab(event: KeyboardEvent): void;
253
+ getSeverityClass(result: CommandResult): string;
254
+ focusInput(): void;
255
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommandTerminal, never>;
256
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommandTerminal, "shell-command-terminal", never, {}, {}, never, never, true, never>;
257
+ }
258
+
259
+ declare class Login {
260
+ #private;
261
+ protected authenticationService: AuthenticationService;
262
+ protected router: Router;
263
+ model: Credentials;
264
+ submitted: boolean;
265
+ hide: _angular_core.WritableSignal<boolean>;
266
+ errors: {
267
+ ndx: number;
268
+ message: string;
269
+ }[];
270
+ protected readonly USERNAME_REGEX: RegExp;
271
+ protected readonly PASSWORD_REGEX: RegExp;
272
+ protected readonly appName: string;
273
+ constructor(authenticationService: AuthenticationService, router: Router);
274
+ onAutofill(event: AutofillEvent, inputEl: HTMLInputElement): void;
275
+ clickEvent(event: MouseEvent): void;
276
+ onSubmit(event: Event): void;
277
+ onTakeOver(): void;
278
+ onCancelConflict(): void;
279
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Login, never>;
280
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Login, "shell-login", never, {}, {}, never, never, true, never>;
281
+ }
282
+
283
+ interface ConfirmDialogData {
284
+ title: string;
285
+ message: string;
286
+ warningMessage?: string;
287
+ confirmLabel?: string;
288
+ cancelLabel?: string;
289
+ }
290
+ declare class ConfirmDialog {
291
+ readonly data: ConfirmDialogData;
292
+ readonly dialogRef: MatDialogRef<any, any>;
293
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmDialog, never>;
294
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmDialog, "shell-confirm-dialog", never, {}, {}, never, never, true, never>;
295
+ }
296
+
297
+ export { AuthenticationService, CLEAR_USAGE, CommandRegistryService, CommandService, CommandTerminal, ConfirmDialog, HELP_USAGE, KeyboardShortcutService, Login, MainContent, RegexValidatorDirective, SHELL_APP_NAME, SHELL_AUTH_URLS, SHELL_COMMANDS, SHELL_MENU_ITEMS, Shell, SideMenu, StatusBar, TerminalFocusService, ThemeService, ThinkingService, authGuard, authInterceptor, provideShellConfig, tokenize };
298
+ export type { CommandDefinition, CommandHistoryEntry, CommandLexiconEntry, CommandResult, ConfirmDialogData, MenuItem, Severity, ShellAuthUrls, ShellConfig, ShortcutRegistration, ThemeMode };