@eclipse-docks/extension-terminal 0.0.0

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 (38) hide show
  1. package/dist/api.d.ts +8 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +2 -0
  4. package/dist/commands-backend.d.ts +24 -0
  5. package/dist/commands-backend.d.ts.map +1 -0
  6. package/dist/i18n.de-BVmQFS_U.js +35 -0
  7. package/dist/i18n.de-BVmQFS_U.js.map +1 -0
  8. package/dist/i18n.en-BzXd1VkS.js +35 -0
  9. package/dist/i18n.en-BzXd1VkS.js.map +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +17 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/js-terminal-backend-BcQIBeMe.js +741 -0
  15. package/dist/js-terminal-backend-BcQIBeMe.js.map +1 -0
  16. package/dist/js-terminal-backend.d.ts +21 -0
  17. package/dist/js-terminal-backend.d.ts.map +1 -0
  18. package/dist/line-input.d.ts +24 -0
  19. package/dist/line-input.d.ts.map +1 -0
  20. package/dist/shell-parser.d.ts +11 -0
  21. package/dist/shell-parser.d.ts.map +1 -0
  22. package/dist/terminal-api.d.ts +76 -0
  23. package/dist/terminal-api.d.ts.map +1 -0
  24. package/dist/terminal-extension-U1ZIJJzf.js +439 -0
  25. package/dist/terminal-extension-U1ZIJJzf.js.map +1 -0
  26. package/dist/terminal-extension.d.ts +2 -0
  27. package/dist/terminal-extension.d.ts.map +1 -0
  28. package/dist/terminal-panel.d.ts +20 -0
  29. package/dist/terminal-panel.d.ts.map +1 -0
  30. package/dist/terminal-persistence.d.ts +5 -0
  31. package/dist/terminal-persistence.d.ts.map +1 -0
  32. package/dist/terminal-service.d.ts +49 -0
  33. package/dist/terminal-service.d.ts.map +1 -0
  34. package/dist/terminal-theme.d.ts +6 -0
  35. package/dist/terminal-theme.d.ts.map +1 -0
  36. package/dist/terminal-view.d.ts +40 -0
  37. package/dist/terminal-view.d.ts.map +1 -0
  38. package/package.json +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-terminal-backend-BcQIBeMe.js","names":[],"sources":["../src/terminal-api.ts","../src/terminal-persistence.ts","../src/terminal-service.ts","../src/shell-parser.ts","../src/line-input.ts","../src/commands-backend.ts","../src/js-terminal-backend.ts"],"sourcesContent":["export const TARGET_TERMINAL_PROFILES = 'system.terminal.profiles';\n\nexport const VIEW_TERMINAL = 'view.terminal';\nexport const TERMINAL_INSTANCES_TABS_ID = 'terminal-instances';\n/** Dropdown target: contributors register items that create a terminal with a profile. */\nexport const TERMINAL_NEW_DROPDOWN = `${TERMINAL_INSTANCES_TABS_ID}-new`;\nexport const TERMINAL_PANEL_SETTINGS_KEY = 'docks-terminal-panel';\n\nexport const TOPIC_TERMINAL_OPENED = 'events/terminal/opened';\nexport const TOPIC_TERMINAL_CLOSED = 'events/terminal/closed';\nexport const TOPIC_TERMINAL_ACTIVE_CHANGED = 'events/terminal/activeChanged';\n\nexport interface TerminalDimensions {\n cols: number;\n rows: number;\n}\n\nexport interface TerminalCreationOptions {\n name?: string;\n profileId?: string;\n cwd?: string;\n env?: Record<string, string>;\n groupId?: string;\n hidden?: boolean;\n}\n\nexport interface TerminalBackend {\n open?(initialDimensions?: TerminalDimensions): void | Promise<void>;\n close?(): void | Promise<void>;\n onDidWrite(callback: (data: string) => void): () => void;\n handleInput(data: string): void;\n setDimensions?(dimensions: TerminalDimensions): void;\n}\n\nexport interface TerminalProfileContribution {\n id: string;\n label: string;\n icon?: string;\n isDefault?: boolean;\n hidden?: boolean;\n create(options?: TerminalCreationOptions): Promise<TerminalBackend>;\n}\n\nexport interface TerminalTaskPresentation {\n profileId: string;\n reveal?: 'always' | 'silent' | 'never';\n focus?: boolean;\n clear?: boolean;\n}\n\nexport interface Terminal {\n readonly id: string;\n name: string;\n readonly profileId: string;\n readonly creationOptions: TerminalCreationOptions;\n readonly groupId: string;\n hidden: boolean;\n sendText(text: string, addNewLine?: boolean): void;\n show(preserveFocus?: boolean): void;\n hide(): void;\n dispose(): Promise<void>;\n clear?(): void;\n}\n\n/** Internal terminal handle used by the host UI (not for provider extensions). */\nexport interface TerminalRuntime extends Terminal {\n backend: TerminalBackend | null;\n clearScreen?: () => void;\n}\n\nexport interface TerminalTaskRunner {\n runTask(\n presentation: TerminalTaskPresentation,\n execute: (terminal: Terminal) => Promise<void>\n ): Promise<void>;\n}\n\nexport interface PersistedTerminalState {\n terminals: PersistedTerminalEntry[];\n activeTerminalId: string | null;\n preferredProfileId: string | null;\n}\n\nexport interface PersistedTerminalEntry {\n id: string;\n name: string;\n profileId: string;\n groupId: string;\n creationOptions: TerminalCreationOptions;\n}\n","import type { PersistedTerminalEntry, PersistedTerminalState, TerminalCreationOptions } from './terminal-api';\n\nconst MAX_PERSISTED_ENV_KEYS = 32;\n\nexport function serializeTerminalState(state: PersistedTerminalState): PersistedTerminalState {\n return {\n activeTerminalId: state.activeTerminalId,\n preferredProfileId: state.preferredProfileId,\n terminals: state.terminals.map(serializeTerminalEntry),\n };\n}\n\nfunction serializeTerminalEntry(entry: PersistedTerminalEntry): PersistedTerminalEntry {\n const opts = entry.creationOptions;\n const env = opts.env\n ? Object.fromEntries(Object.entries(opts.env).slice(0, MAX_PERSISTED_ENV_KEYS))\n : undefined;\n return {\n id: entry.id,\n name: entry.name,\n profileId: entry.profileId,\n groupId: entry.groupId,\n creationOptions: {\n name: opts.name,\n profileId: opts.profileId,\n cwd: opts.cwd,\n env,\n groupId: opts.groupId,\n },\n };\n}\n\nexport function parseTerminalState(raw: unknown): PersistedTerminalState | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n if (!Array.isArray(obj.terminals)) return null;\n\n const terminals: PersistedTerminalEntry[] = [];\n for (const item of obj.terminals) {\n if (!item || typeof item !== 'object') continue;\n const t = item as Record<string, unknown>;\n if (typeof t.id !== 'string' || typeof t.name !== 'string' || typeof t.profileId !== 'string') {\n continue;\n }\n const creationOptions = (t.creationOptions ?? {}) as TerminalCreationOptions;\n terminals.push({\n id: t.id,\n name: t.name,\n profileId: t.profileId,\n groupId: typeof t.groupId === 'string' ? t.groupId : t.id,\n creationOptions,\n });\n }\n\n return {\n terminals,\n activeTerminalId: typeof obj.activeTerminalId === 'string' ? obj.activeTerminalId : null,\n preferredProfileId: typeof obj.preferredProfileId === 'string' ? obj.preferredProfileId : null,\n };\n}\n\nexport function emptyTerminalState(): PersistedTerminalState {\n return { terminals: [], activeTerminalId: null, preferredProfileId: null };\n}\n","import { html } from '@eclipse-docks/core/externals/lit';\nimport {\n confirmDialog,\n contributionRegistry,\n i18n,\n PANEL_BOTTOM,\n publish,\n rootContext,\n subscribe,\n unsubscribe,\n type TabContribution,\n} from '@eclipse-docks/core';\nimport {\n TARGET_TERMINAL_PROFILES,\n TERMINAL_NEW_DROPDOWN,\n TOPIC_TERMINAL_ACTIVE_CHANGED,\n TOPIC_TERMINAL_CLOSED,\n TOPIC_TERMINAL_OPENED,\n VIEW_TERMINAL,\n type Terminal,\n type TerminalBackend,\n type TerminalCreationOptions,\n type TerminalProfileContribution,\n type TerminalTaskPresentation,\n type TerminalTaskRunner,\n type PersistedTerminalState,\n type TerminalRuntime,\n} from './terminal-api';\nimport { emptyTerminalState, parseTerminalState, serializeTerminalState } from './terminal-persistence';\n\nconst t = await i18n(import.meta.glob('./i18n*.json'), true);\n\nasync function confirmKillTerminal(name: string): Promise<boolean> {\n return confirmDialog(t.TERMINAL_KILL_CONFIRM({ name }));\n}\n\ninterface TerminalTabsHost {\n has(key: string): boolean;\n activate(key: string): void;\n open(contribution: TabContribution): void;\n closeTab(event: Event, tabName: string): Promise<void>;\n updateTabLabel(tabName: string, label: string): void;\n}\n\nexport type { TerminalTabsHost };\n\nlet terminalCounter = 0;\n\nfunction nextTerminalId(): string {\n terminalCounter += 1;\n return `terminal-${terminalCounter}`;\n}\n\nclass TerminalInstance implements TerminalRuntime {\n readonly id: string;\n name: string;\n readonly profileId: string;\n readonly creationOptions: TerminalCreationOptions;\n readonly groupId: string;\n hidden = false;\n backend: TerminalBackend | null = null;\n clearScreen?: () => void;\n\n constructor(\n id: string,\n name: string,\n profileId: string,\n creationOptions: TerminalCreationOptions,\n groupId: string\n ) {\n this.id = id;\n this.name = name;\n this.profileId = profileId;\n this.creationOptions = creationOptions;\n this.groupId = groupId;\n }\n\n sendText(text: string, addNewLine = true): void {\n if (!this.backend) return;\n this.backend.handleInput(text + (addNewLine ? '\\r' : ''));\n }\n\n show(_preserveFocus?: boolean): void {\n terminalService.focusTerminalPanel();\n terminalService.activateTerminal(this.id);\n this.hidden = false;\n }\n\n hide(): void {\n this.hidden = true;\n }\n\n async dispose(): Promise<void> {\n await terminalService.disposeTerminal(this.id);\n }\n\n clear(): void {\n this.clearScreen?.();\n }\n}\n\nclass TerminalService implements TerminalTaskRunner {\n private terminals = new Map<string, TerminalInstance>();\n private activeTerminalId: string | null = null;\n private preferredProfileId: string | null = null;\n private persistenceHandler: (() => Promise<PersistedTerminalState | null>) | null = null;\n private persistCallback: ((state: PersistedTerminalState) => Promise<void>) | null = null;\n private restoreStarted = false;\n private instanceTabsHost: TerminalTabsHost | null = null;\n\n get activeTerminal(): Terminal | undefined {\n if (!this.activeTerminalId) return undefined;\n return this.terminals.get(this.activeTerminalId);\n }\n\n getTerminals(): Terminal[] {\n return [...this.terminals.values()];\n }\n\n onDidOpenTerminal(callback: (terminal: Terminal) => void): () => void {\n const token = subscribe(TOPIC_TERMINAL_OPENED, callback);\n return () => unsubscribe(token);\n }\n\n onDidCloseTerminal(callback: (terminal: Terminal) => void): () => void {\n const token = subscribe(TOPIC_TERMINAL_CLOSED, callback);\n return () => unsubscribe(token);\n }\n\n onDidChangeActiveTerminal(callback: (terminal: Terminal | undefined) => void): () => void {\n const token = subscribe(TOPIC_TERMINAL_ACTIVE_CHANGED, callback);\n return () => unsubscribe(token);\n }\n\n setPersistenceHandlers(\n load: () => Promise<PersistedTerminalState | null>,\n save: (state: PersistedTerminalState) => Promise<void>\n ): void {\n this.persistenceHandler = load;\n this.persistCallback = save;\n }\n\n async restorePersistedTerminals(): Promise<void> {\n if (this.restoreStarted || !this.persistenceHandler) return;\n this.restoreStarted = true;\n const raw = await this.persistenceHandler();\n const state = raw ? parseTerminalState(raw) : null;\n if (!state || state.terminals.length === 0) return;\n\n this.preferredProfileId = state.preferredProfileId;\n for (const entry of state.terminals) {\n await this.createTerminal({\n ...entry.creationOptions,\n name: entry.name,\n profileId: entry.profileId,\n groupId: entry.groupId,\n }, entry.id);\n }\n if (state.activeTerminalId && this.terminals.has(state.activeTerminalId)) {\n this.setActiveTerminal(state.activeTerminalId);\n }\n }\n\n getProfiles(): TerminalProfileContribution[] {\n return contributionRegistry.getContributions<TerminalProfileContribution>(TARGET_TERMINAL_PROFILES);\n }\n\n resolveDefaultProfileId(): string | null {\n if (this.preferredProfileId) {\n const preferred = this.getProfiles().find((p) => p.id === this.preferredProfileId);\n if (preferred) return preferred.id;\n }\n const profiles = this.getProfiles().filter((p) => !p.hidden);\n const defaultProfile = profiles.find((p) => p.isDefault) ?? profiles[0];\n return defaultProfile?.id ?? null;\n }\n\n setInstanceTabsHost(host: TerminalTabsHost | null): void {\n this.instanceTabsHost = host;\n }\n\n getInstanceTabs(): TerminalTabsHost | null {\n return this.instanceTabsHost;\n }\n\n focusTerminalPanel(): void {\n const panel = document.querySelector(`docks-tabs#${PANEL_BOTTOM}`) as TerminalTabsHost | null;\n panel?.activate(VIEW_TERMINAL);\n }\n\n activateTerminal(id: string): void {\n const tabs = this.getInstanceTabs();\n if (tabs?.has(id)) {\n tabs.activate(id);\n }\n this.setActiveTerminal(id);\n }\n\n private setActiveTerminal(id: string | null): void {\n if (this.activeTerminalId === id) return;\n this.activeTerminalId = id;\n publish(TOPIC_TERMINAL_ACTIVE_CHANGED, id ? this.terminals.get(id) : undefined);\n void this.persistState();\n }\n\n async createTerminal(\n options: TerminalCreationOptions = {},\n forcedId?: string\n ): Promise<Terminal | undefined> {\n const profileId = options.profileId ?? this.resolveDefaultProfileId();\n if (!profileId) return undefined;\n\n const profile = this.getProfiles().find((p) => p.id === profileId);\n if (!profile) return undefined;\n\n const id = forcedId ?? nextTerminalId();\n if (forcedId) syncTerminalCounterFromId(forcedId);\n const groupId = options.groupId ?? id;\n const name = options.name ?? profile.label;\n\n let backend: TerminalBackend;\n try {\n backend = await profile.create({ ...options, profileId, name, groupId });\n } catch {\n return undefined;\n }\n\n const terminal = new TerminalInstance(id, name, profileId, { ...options, profileId, name, groupId }, groupId);\n terminal.backend = backend;\n terminal.hidden = options.hidden ?? false;\n\n this.terminals.set(id, terminal);\n this.openTerminalTab(terminal, profile.icon);\n\n if (!options.hidden) {\n this.focusTerminalPanel();\n this.activateTerminal(id);\n }\n\n publish(TOPIC_TERMINAL_OPENED, terminal);\n void this.persistState();\n return terminal;\n }\n\n private openTerminalTab(terminal: TerminalInstance, icon?: string): void {\n const tabs = this.getInstanceTabs();\n if (!tabs) return;\n\n const contribution: TabContribution = {\n name: terminal.id,\n label: terminal.name,\n icon: icon ?? 'terminal',\n closable: true,\n toolbar: false,\n beforeClose: async () => confirmKillTerminal(terminal.name),\n component: (tabId: string) =>\n html`<docks-terminal-view id=\"${tabId}\" .terminal=${terminal}></docks-terminal-view>`,\n };\n\n if (tabs.has(terminal.id)) {\n tabs.activate(terminal.id);\n return;\n }\n tabs.open(contribution);\n }\n\n async disposeTerminal(id: string, options?: { skipTabRemoval?: boolean }): Promise<void> {\n const terminal = this.terminals.get(id);\n if (!terminal) return;\n\n if (!options?.skipTabRemoval) {\n const tabs = this.getInstanceTabs();\n if (tabs?.has(id)) {\n await tabs.closeTab(new Event('close'), id);\n return;\n }\n }\n\n await terminal.backend?.close?.();\n terminal.backend = null;\n this.terminals.delete(id);\n\n if (this.activeTerminalId === id) {\n const remaining = [...this.terminals.keys()];\n this.setActiveTerminal(remaining.length > 0 ? remaining[remaining.length - 1] : null);\n }\n\n publish(TOPIC_TERMINAL_CLOSED, terminal);\n void this.persistState();\n }\n\n async killAll(): Promise<void> {\n const tabs = this.getInstanceTabs();\n const ids = [...this.terminals.keys()];\n for (const id of ids) {\n if (tabs?.has(id)) {\n await tabs.closeTab(new Event('close'), id);\n } else {\n await this.disposeTerminal(id, { skipTabRemoval: true });\n }\n }\n }\n\n renameActiveTerminal(name: string): void {\n const active = this.activeTerminal;\n if (!active || !(active instanceof TerminalInstance)) return;\n active.name = name;\n this.getInstanceTabs()?.updateTabLabel(active.id, name);\n void this.persistState();\n }\n\n setPreferredProfile(profileId: string): void {\n this.preferredProfileId = profileId;\n void this.persistState();\n }\n\n clearActiveTerminal(): void {\n this.activeTerminal?.clear?.();\n }\n\n async runTask(\n presentation: TerminalTaskPresentation,\n execute: (terminal: Terminal) => Promise<void>\n ): Promise<void> {\n let terminal = this.getTerminals().find((t) => t.profileId === presentation.profileId);\n if (!terminal) {\n terminal = await this.createTerminal({ profileId: presentation.profileId });\n }\n if (!terminal) return;\n\n if (presentation.reveal !== 'never') {\n if (presentation.focus !== false) {\n terminal.show();\n } else {\n this.focusTerminalPanel();\n }\n }\n if (presentation.clear) {\n terminal.clear?.();\n }\n await execute(terminal);\n }\n\n private async persistState(): Promise<void> {\n if (!this.persistCallback) return;\n const state: PersistedTerminalState = {\n activeTerminalId: this.activeTerminalId,\n preferredProfileId: this.preferredProfileId,\n terminals: [...this.terminals.values()].map((t) => ({\n id: t.id,\n name: t.name,\n profileId: t.profileId,\n groupId: t.groupId,\n creationOptions: t.creationOptions,\n })),\n };\n await this.persistCallback(serializeTerminalState(state));\n }\n\n handleTabActivated(tabName: string): void {\n if (this.terminals.has(tabName)) {\n this.setActiveTerminal(tabName);\n }\n }\n\n handleTabClosed(tabName: string): void {\n if (this.terminals.has(tabName)) {\n void this.disposeTerminal(tabName, { skipTabRemoval: true });\n }\n }\n}\n\nfunction syncTerminalCounterFromId(id: string): void {\n const match = /^terminal-(\\d+)$/.exec(id);\n if (!match) return;\n const n = Number.parseInt(match[1], 10);\n if (n > terminalCounter) terminalCounter = n;\n}\n\nexport const terminalService = new TerminalService();\nrootContext.put('terminalService', terminalService);\n\nexport function registerTerminalProfile(contribution: TerminalProfileContribution): void {\n contributionRegistry.registerContribution(TARGET_TERMINAL_PROFILES, contribution);\n if (contribution.hidden) return;\n const profileId = contribution.id;\n contributionRegistry.registerContribution(TERMINAL_NEW_DROPDOWN, {\n label: contribution.label,\n icon: contribution.icon ?? 'terminal',\n component: () => html`\n <docks-command\n icon=\"${contribution.icon ?? 'terminal'}\"\n title=\"${contribution.label}\"\n .action=${() => {\n terminalService.setPreferredProfile(profileId);\n void terminalService.createTerminal({ profileId });\n }}\n >\n ${contribution.label}\n </docks-command>\n `,\n });\n}\n","import type { CommandRegistry, Command } from '@eclipse-docks/core';\n\nexport interface ParsedCommand {\n commandId: string;\n params: Record<string, string | boolean>;\n}\n\nexport interface ParsedSegment {\n command: ParsedCommand;\n operator: '&&' | '|' | null;\n}\n\nconst NAMED_PARAM_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*=.*$/;\n\nfunction tokenize(segment: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n const len = segment.length;\n\n while (i < len) {\n while (i < len && /\\s/.test(segment[i])) i++;\n if (i >= len) break;\n\n if (segment[i] === '\"') {\n let end = i + 1;\n while (end < len && segment[end] !== '\"') {\n if (segment[end] === '\\\\') end++;\n end++;\n }\n tokens.push(segment.slice(i + 1, end).replace(/\\\\\"/g, '\"'));\n i = end + 1;\n } else {\n let start = i;\n while (i < len && !/\\s/.test(segment[i]) && segment[i] !== '\"') i++;\n if (i > start) {\n tokens.push(segment.slice(start, i));\n }\n }\n }\n return tokens;\n}\n\nfunction splitChain(line: string): { segment: string; operator: '&&' | '|' | null }[] {\n const result: { segment: string; operator: '&&' | '|' | null }[] = [];\n const regex = /(\\s*&&\\s*|\\s*\\|\\s*)/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(line)) !== null) {\n const segment = line.slice(lastIndex, match.index).trim();\n if (segment) {\n const op = match[0].includes('|') ? ('|' as const) : ('&&' as const);\n result.push({ segment, operator: op });\n }\n lastIndex = regex.lastIndex;\n }\n const tail = line.slice(lastIndex).trim();\n if (tail) {\n result.push({ segment: tail, operator: null });\n }\n return result;\n}\n\nfunction resolveParams(\n tokens: string[],\n command: Command | undefined\n): Record<string, string | boolean> {\n const params: Record<string, string | boolean> = {};\n const positionals: string[] = [];\n const paramNames = command?.parameters?.map((p) => p.name) ?? [];\n\n for (const token of tokens) {\n if (NAMED_PARAM_REGEX.test(token)) {\n const eqIdx = token.indexOf('=');\n const name = token.slice(0, eqIdx);\n const value = token.slice(eqIdx + 1);\n params[name] = value === 'true' || value === 'false' ? value === 'true' : value;\n } else {\n positionals.push(token);\n }\n }\n\n paramNames.forEach((name, i) => {\n if (positionals[i] !== undefined && !(name in params)) {\n params[name] = positionals[i];\n }\n });\n\n return params;\n}\n\nexport function parseShellLine(line: string, commandRegistry: CommandRegistry): ParsedSegment[] {\n const segments = splitChain(line);\n return segments.map(({ segment, operator }) => {\n const tokens = tokenize(segment);\n if (tokens.length === 0) {\n return { command: { commandId: '', params: {} }, operator };\n }\n const commandId = tokens[0];\n const command = commandRegistry.hasCommand(commandId)\n ? commandRegistry.getCommand(commandId)\n : undefined;\n const params = resolveParams(tokens.slice(1), command);\n return { command: { commandId, params }, operator };\n });\n}\n","/** Minimal readline-style editor for xterm-backed REPL backends. */\nexport class LineInput {\n private buffer = '';\n private cursor = 0;\n private history: string[] = [];\n private historyDraft = '';\n private historyIndex = 0;\n\n constructor(private write: (data: string) => void) {}\n\n reset(): void {\n this.buffer = '';\n this.cursor = 0;\n this.historyDraft = '';\n this.historyIndex = this.history.length;\n }\n\n /** Returns the submitted line on Enter, otherwise null. */\n feed(data: string): string | null {\n if (data === '\\r') {\n const line = this.buffer;\n this.pushHistory(line);\n this.buffer = '';\n this.cursor = 0;\n this.write('\\r\\n');\n return line;\n }\n\n if (data === '\\u007f' || data === '\\b') {\n this.deleteBackward();\n return null;\n }\n\n if (data === '\\x1b[D' || data === '\\x1bOD') {\n this.move(-1);\n return null;\n }\n if (data === '\\x1b[C' || data === '\\x1bOC') {\n this.move(1);\n return null;\n }\n if (data === '\\x1b[A' || data === '\\x1bOA') {\n this.historyPrev();\n return null;\n }\n if (data === '\\x1b[B' || data === '\\x1bOB') {\n this.historyNext();\n return null;\n }\n if (data === '\\x1b[3~') {\n this.deleteForward();\n return null;\n }\n if (data === '\\x1b[H' || data === '\\x1bOH') {\n this.cursorHome();\n return null;\n }\n if (data === '\\x1b[F' || data === '\\x1bOF') {\n this.cursorEnd();\n return null;\n }\n\n if (data.startsWith('\\x1b')) return null;\n\n for (const char of data) {\n if (char < ' ') continue;\n this.insert(char);\n }\n return null;\n }\n\n private move(delta: number): void {\n const next = this.cursor + delta;\n if (next < 0 || next > this.buffer.length) return;\n const steps = Math.abs(delta);\n this.cursor = next;\n this.write(delta < 0 ? `\\x1b[${steps}D` : `\\x1b[${steps}C`);\n }\n\n private cursorHome(): void {\n if (this.cursor === 0) return;\n this.write(`\\x1b[${this.cursor}D`);\n this.cursor = 0;\n }\n\n private cursorEnd(): void {\n const steps = this.buffer.length - this.cursor;\n if (steps <= 0) return;\n this.write(`\\x1b[${steps}C`);\n this.cursor = this.buffer.length;\n }\n\n private insert(char: string): void {\n if (this.cursor === this.buffer.length) {\n this.buffer += char;\n this.cursor++;\n this.write(char);\n return;\n }\n const tail = this.buffer.slice(this.cursor);\n this.buffer = this.buffer.slice(0, this.cursor) + char + tail;\n this.cursor++;\n this.write(char + tail + `\\x1b[${tail.length}D`);\n }\n\n private deleteBackward(): void {\n if (this.cursor === 0) return;\n if (this.cursor === this.buffer.length) {\n this.buffer = this.buffer.slice(0, -1);\n this.cursor--;\n this.write('\\b \\b');\n return;\n }\n const after = this.buffer.slice(this.cursor);\n this.buffer = this.buffer.slice(0, this.cursor - 1) + after;\n this.cursor--;\n this.write(`\\b${after} ` + `\\x1b[${after.length + 1}D`);\n }\n\n private deleteForward(): void {\n if (this.cursor >= this.buffer.length) return;\n const after = this.buffer.slice(this.cursor + 1);\n this.write(`${after} ` + `\\x1b[${after.length + 1}D`);\n this.buffer = this.buffer.slice(0, this.cursor) + after;\n }\n\n private replaceBuffer(next: string): void {\n if (this.cursor > 0) this.write(`\\x1b[${this.cursor}D`);\n if (this.buffer.length > 0) this.write('\\x1b[K');\n this.buffer = next;\n this.cursor = next.length;\n if (next) this.write(next);\n }\n\n private historyPrev(): void {\n if (this.history.length === 0) return;\n if (this.historyIndex === this.history.length) {\n this.historyDraft = this.buffer;\n }\n if (this.historyIndex === 0) return;\n this.historyIndex--;\n this.replaceBuffer(this.history[this.historyIndex]);\n }\n\n private historyNext(): void {\n if (this.historyIndex >= this.history.length) return;\n this.historyIndex++;\n if (this.historyIndex === this.history.length) {\n this.replaceBuffer(this.historyDraft);\n this.historyDraft = '';\n return;\n }\n this.replaceBuffer(this.history[this.historyIndex]);\n }\n\n private pushHistory(line: string): void {\n if (line.length > 0 && this.history[this.history.length - 1] !== line) {\n this.history.push(line);\n }\n this.historyIndex = this.history.length;\n this.historyDraft = '';\n }\n}\n","import { commandRegistry, type CommandRegistry, type Command } from '@eclipse-docks/core';\nimport { parseShellLine } from './shell-parser';\nimport { LineInput } from './line-input';\n\nexport interface RunResult {\n success: boolean;\n results: unknown[];\n error?: string;\n}\n\nfunction mapOutputToParams(\n output: unknown,\n producerCommand: Command | undefined\n): Record<string, unknown> {\n if (output == null) return {};\n if (typeof output === 'object' && !Array.isArray(output)) {\n return output as Record<string, unknown>;\n }\n const firstOutput = producerCommand?.output?.[0];\n if (firstOutput) {\n return { [firstOutput.name]: output };\n }\n return {};\n}\n\nexport async function runShellLine(\n line: string,\n registry: CommandRegistry = commandRegistry\n): Promise<RunResult> {\n const segments = parseShellLine(line, registry);\n const results: unknown[] = [];\n let pipedOutput: Record<string, unknown> | null = null;\n let lastProducerCommand: Command | undefined;\n\n for (let i = 0; i < segments.length; i++) {\n const { command, operator } = segments[i];\n if (!command.commandId) continue;\n\n const cmd = registry.hasCommand(command.commandId)\n ? registry.getCommand(command.commandId)\n : undefined;\n if (!cmd) {\n return {\n success: false,\n results,\n error: `Command not found: ${command.commandId}`,\n };\n }\n\n const mergedParams = {\n ...mapOutputToParams(pipedOutput ?? undefined, lastProducerCommand),\n ...command.params,\n };\n\n const context = registry.createExecutionContext(mergedParams);\n\n try {\n const result = registry.execute(command.commandId, context);\n const resolved = result instanceof Promise ? await result : result;\n results.push(resolved);\n\n if (operator === '|') {\n pipedOutput = mapOutputToParams(resolved, cmd) as Record<string, unknown>;\n lastProducerCommand = cmd;\n } else {\n pipedOutput = null;\n lastProducerCommand = undefined;\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { success: false, results, error: msg };\n }\n }\n\n return { success: true, results };\n}\n\nfunction formatResult(result: RunResult): string {\n if (result.error) return `\\r\\n\\x1b[31m${result.error}\\x1b[0m\\r\\n`;\n if (result.results.length === 0) return '';\n const last = result.results[result.results.length - 1];\n if (last == null) return '';\n if (typeof last === 'object') return JSON.stringify(last, null, 2) + '\\r\\n';\n return String(last) + '\\r\\n';\n}\n\nexport class CommandsBackend {\n private writeCallbacks = new Set<(data: string) => void>();\n private lineInput: LineInput;\n private prompt = '> ';\n\n constructor() {\n this.lineInput = new LineInput((data) => this.emit(data));\n }\n\n onDidWrite(callback: (data: string) => void): () => void {\n this.writeCallbacks.add(callback);\n return () => this.writeCallbacks.delete(callback);\n }\n\n private emit(data: string): void {\n for (const cb of this.writeCallbacks) cb(data);\n }\n\n async open(): Promise<void> {\n this.emit('Commands\\r\\nType commands (supports && and |)\\r\\n\\r\\n' + this.prompt);\n }\n\n close(): void {\n this.lineInput.reset();\n }\n\n setDimensions(_dimensions: { cols: number; rows: number }): void {}\n\n handleInput(data: string): void {\n const line = this.lineInput.feed(data);\n if (line === null) return;\n void this.runLine(line);\n }\n\n private async runLine(line: string): Promise<void> {\n const trimmed = line.trim();\n if (!trimmed) {\n this.emit(this.prompt);\n return;\n }\n const result = await runShellLine(trimmed);\n this.emit(formatResult(result));\n this.emit(this.prompt);\n }\n}\n","import { createJsRuntime, type JsRuntime } from '@eclipse-docks/core';\nimport type { TerminalBackend } from './terminal-api';\nimport { LineInput } from './line-input';\n\nexport const JS_REPL_PROFILE_ID = 'terminal.javascript-repl';\n\nconst PROMPT = '> ';\n\nfunction formatJsResult(value: unknown): string {\n if (value === undefined) return '';\n if (value === null) return 'null\\r\\n';\n if (typeof value === 'object') return JSON.stringify(value, null, 2) + '\\r\\n';\n return String(value) + '\\r\\n';\n}\n\nexport class JsReplBackend implements TerminalBackend {\n private writeCallbacks = new Set<(data: string) => void>();\n private lineInput: LineInput;\n private runtime: JsRuntime | null = null;\n private running = false;\n\n constructor() {\n this.lineInput = new LineInput((data) => this.emit(data));\n }\n\n onDidWrite(callback: (data: string) => void): () => void {\n this.writeCallbacks.add(callback);\n return () => this.writeCallbacks.delete(callback);\n }\n\n private emit(data: string): void {\n for (const cb of this.writeCallbacks) cb(data);\n }\n\n private getRuntime(): JsRuntime {\n if (!this.runtime) {\n this.runtime = createJsRuntime();\n }\n return this.runtime;\n }\n\n async open(): Promise<void> {\n this.emit('JavaScript REPL\\r\\n\\r\\n' + PROMPT);\n }\n\n close(): void {\n this.runtime?.close();\n this.runtime = null;\n this.lineInput.reset();\n }\n\n setDimensions(_dimensions: { cols: number; rows: number }): void {}\n\n handleInput(data: string): void {\n if (this.running) return;\n const line = this.lineInput.feed(data);\n if (line === null) return;\n void this.runLine(line);\n }\n\n private async runLine(line: string): Promise<void> {\n const trimmed = line.trim();\n if (!trimmed) {\n this.emit(PROMPT);\n return;\n }\n\n this.running = true;\n try {\n const result = await this.getRuntime().execute(trimmed);\n const output = formatJsResult(result);\n if (output) this.emit(output);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.emit(`\\x1b[31m${msg}\\x1b[0m\\r\\n`);\n } finally {\n this.running = false;\n this.emit(PROMPT);\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { TerminalBackend } from './terminal-api';
2
+ export declare const JS_REPL_PROFILE_ID = "terminal.javascript-repl";
3
+ export declare class JsReplBackend implements TerminalBackend {
4
+ private writeCallbacks;
5
+ private lineInput;
6
+ private runtime;
7
+ private running;
8
+ constructor();
9
+ onDidWrite(callback: (data: string) => void): () => void;
10
+ private emit;
11
+ private getRuntime;
12
+ open(): Promise<void>;
13
+ close(): void;
14
+ setDimensions(_dimensions: {
15
+ cols: number;
16
+ rows: number;
17
+ }): void;
18
+ handleInput(data: string): void;
19
+ private runLine;
20
+ }
21
+ //# sourceMappingURL=js-terminal-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-terminal-backend.d.ts","sourceRoot":"","sources":["../src/js-terminal-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAW7D,qBAAa,aAAc,YAAW,eAAe;IACnD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,OAAO,CAAS;;IAMxB,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxD,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,UAAU;IAOZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,KAAK,IAAI,IAAI;IAMb,aAAa,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAEhE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;YAOjB,OAAO;CAoBtB"}
@@ -0,0 +1,24 @@
1
+ /** Minimal readline-style editor for xterm-backed REPL backends. */
2
+ export declare class LineInput {
3
+ private write;
4
+ private buffer;
5
+ private cursor;
6
+ private history;
7
+ private historyDraft;
8
+ private historyIndex;
9
+ constructor(write: (data: string) => void);
10
+ reset(): void;
11
+ /** Returns the submitted line on Enter, otherwise null. */
12
+ feed(data: string): string | null;
13
+ private move;
14
+ private cursorHome;
15
+ private cursorEnd;
16
+ private insert;
17
+ private deleteBackward;
18
+ private deleteForward;
19
+ private replaceBuffer;
20
+ private historyPrev;
21
+ private historyNext;
22
+ private pushHistory;
23
+ }
24
+ //# sourceMappingURL=line-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-input.d.ts","sourceRoot":"","sources":["../src/line-input.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,qBAAa,SAAS;IAOR,OAAO,CAAC,KAAK;IANzB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,YAAY,CAAK;gBAEL,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IAEjD,KAAK,IAAI,IAAI;IAOb,2DAA2D;IAC3D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAqDjC,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;CAOpB"}
@@ -0,0 +1,11 @@
1
+ import { CommandRegistry } from '@eclipse-docks/core';
2
+ export interface ParsedCommand {
3
+ commandId: string;
4
+ params: Record<string, string | boolean>;
5
+ }
6
+ export interface ParsedSegment {
7
+ command: ParsedCommand;
8
+ operator: '&&' | '|' | null;
9
+ }
10
+ export declare function parseShellLine(line: string, commandRegistry: CommandRegistry): ParsedSegment[];
11
+ //# sourceMappingURL=shell-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-parser.d.ts","sourceRoot":"","sources":["../src/shell-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAW,MAAM,qBAAqB,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;CAC7B;AAiFD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,GAAG,aAAa,EAAE,CAc9F"}
@@ -0,0 +1,76 @@
1
+ export declare const TARGET_TERMINAL_PROFILES = "system.terminal.profiles";
2
+ export declare const VIEW_TERMINAL = "view.terminal";
3
+ export declare const TERMINAL_INSTANCES_TABS_ID = "terminal-instances";
4
+ /** Dropdown target: contributors register items that create a terminal with a profile. */
5
+ export declare const TERMINAL_NEW_DROPDOWN = "terminal-instances-new";
6
+ export declare const TERMINAL_PANEL_SETTINGS_KEY = "docks-terminal-panel";
7
+ export declare const TOPIC_TERMINAL_OPENED = "events/terminal/opened";
8
+ export declare const TOPIC_TERMINAL_CLOSED = "events/terminal/closed";
9
+ export declare const TOPIC_TERMINAL_ACTIVE_CHANGED = "events/terminal/activeChanged";
10
+ export interface TerminalDimensions {
11
+ cols: number;
12
+ rows: number;
13
+ }
14
+ export interface TerminalCreationOptions {
15
+ name?: string;
16
+ profileId?: string;
17
+ cwd?: string;
18
+ env?: Record<string, string>;
19
+ groupId?: string;
20
+ hidden?: boolean;
21
+ }
22
+ export interface TerminalBackend {
23
+ open?(initialDimensions?: TerminalDimensions): void | Promise<void>;
24
+ close?(): void | Promise<void>;
25
+ onDidWrite(callback: (data: string) => void): () => void;
26
+ handleInput(data: string): void;
27
+ setDimensions?(dimensions: TerminalDimensions): void;
28
+ }
29
+ export interface TerminalProfileContribution {
30
+ id: string;
31
+ label: string;
32
+ icon?: string;
33
+ isDefault?: boolean;
34
+ hidden?: boolean;
35
+ create(options?: TerminalCreationOptions): Promise<TerminalBackend>;
36
+ }
37
+ export interface TerminalTaskPresentation {
38
+ profileId: string;
39
+ reveal?: 'always' | 'silent' | 'never';
40
+ focus?: boolean;
41
+ clear?: boolean;
42
+ }
43
+ export interface Terminal {
44
+ readonly id: string;
45
+ name: string;
46
+ readonly profileId: string;
47
+ readonly creationOptions: TerminalCreationOptions;
48
+ readonly groupId: string;
49
+ hidden: boolean;
50
+ sendText(text: string, addNewLine?: boolean): void;
51
+ show(preserveFocus?: boolean): void;
52
+ hide(): void;
53
+ dispose(): Promise<void>;
54
+ clear?(): void;
55
+ }
56
+ /** Internal terminal handle used by the host UI (not for provider extensions). */
57
+ export interface TerminalRuntime extends Terminal {
58
+ backend: TerminalBackend | null;
59
+ clearScreen?: () => void;
60
+ }
61
+ export interface TerminalTaskRunner {
62
+ runTask(presentation: TerminalTaskPresentation, execute: (terminal: Terminal) => Promise<void>): Promise<void>;
63
+ }
64
+ export interface PersistedTerminalState {
65
+ terminals: PersistedTerminalEntry[];
66
+ activeTerminalId: string | null;
67
+ preferredProfileId: string | null;
68
+ }
69
+ export interface PersistedTerminalEntry {
70
+ id: string;
71
+ name: string;
72
+ profileId: string;
73
+ groupId: string;
74
+ creationOptions: TerminalCreationOptions;
75
+ }
76
+ //# sourceMappingURL=terminal-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-api.d.ts","sourceRoot":"","sources":["../src/terminal-api.ts"],"names":[],"mappings":"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"}