diff --git a/src/commands/webSocketTerminal.ts b/src/commands/webSocketTerminal.ts index 2c44b543..250437cc 100644 --- a/src/commands/webSocketTerminal.ts +++ b/src/commands/webSocketTerminal.ts @@ -96,7 +96,10 @@ class WebSocketTerminal implements vscode.Pseudoterminal { // eslint-disable-next-line no-control-regex private _colorsRegex = /\x1b[^m]*?m/g; - constructor(private readonly _targetUri: vscode.Uri) {} + constructor( + private readonly _targetUri: vscode.Uri, + private readonly _nsOverride?: string + ) {} /** Hide the cursor, write `data` to the terminal, then show the cursor again. */ private _hideCursorWrite(data: string): void { @@ -201,6 +204,7 @@ class WebSocketTerminal implements vscode.Pseudoterminal { open(initialDimensions?: vscode.TerminalDimensions): void { const api = new AtelierAPI(this._targetUri); + if (this._nsOverride) api.setNamespace(this._nsOverride); this._cols = initialDimensions?.columns ?? 100000; try { // Open the WebSocket @@ -728,7 +732,8 @@ function reportError(msg: string, throwErrors = false) { function terminalConfigForUri( api: AtelierAPI, targetUri: vscode.Uri, - throwErrors = false + throwErrors: boolean, + nsOverride?: string ): vscode.ExtensionTerminalOptions | undefined { // Make sure the server connection is active if (!api.active || api.ns == "") { @@ -751,13 +756,13 @@ function terminalConfigForUri( vscode.window.terminals.length > 0 ? vscode.TerminalLocation.Editor : vscode.TerminalLocation.Panel, - pty: new WebSocketTerminal(targetUri), + pty: new WebSocketTerminal(targetUri, nsOverride), isTransient: true, iconPath: iscIcon, }; } -export async function launchWebSocketTerminal(targetUri?: vscode.Uri): Promise { +export async function launchWebSocketTerminal(targetUri?: vscode.Uri, nsOverride?: string): Promise { // Determine the server to connect to if (targetUri) { // Uri passed as command argument might be for a server we haven't yet resolved @@ -779,7 +784,7 @@ export async function launchWebSocketTerminal(targetUri?: vscode.Uri): Promise { (namespaceTreeItem) => { sendCommandTelemetryEvent("intersystems-servermanager.webterminal"); const idArray = namespaceTreeItem.id.split(":"); - const serverId = idArray[1]; const namespace = idArray[3]; - const targetUri = vscode.Uri.from({ scheme: "isfs", authority: `${serverId}:${namespace}` }); - launchWebSocketTerminal(targetUri); + const serverTreeItem = namespaceTreeItem?.parent?.parent; + const isWsFolderServer = + serverTreeItem?.label.includes("(") && typeof serverTreeItem?.params?.serverSummary?.scope?.uri == "object"; + launchWebSocketTerminal( + // Support servers that are defined at the workspace-folder level + isWsFolderServer + ? serverTreeItem?.params?.serverSummary?.scope?.uri + : vscode.Uri.from({ scheme: "isfs", authority: `${idArray[1]}:${namespace}` }), + isWsFolderServer ? namespace : undefined + ); } ), vscode.commands.registerCommand("vscode-objectscript.ObjectScriptExplorer.webterminal", (node: NodeBase) => {