From d19c7e0cb76c8464fdbe7852aaf79946ced9679a Mon Sep 17 00:00:00 2001 From: jawelton74 <103591340+jawelton74@users.noreply.github.com> Date: Mon, 15 Jun 2026 06:29:14 -0700 Subject: [PATCH] =?UTF-8?q?Remove=20Phoenix=20&=20Notebooks=20=E2=80=94=20?= =?UTF-8?q?Phase=201:=20Decouple=20database=20shells=20to=20CloudShell=20(?= =?UTF-8?q?#2513)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add implementation plan for removing Phoenix and notebooks Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Phase 1: Decouple database shells from Phoenix to CloudShell-only Migrate all shell terminals to the CloudShell path and remove the legacy Phoenix notebook-server terminal code so shells no longer depend on notebook provisioning. - TerminalTab now always uses CloudShellTerminalComponentAdapter; removed the notebook-server adapter branch, getNotebookServerInfo, and the dead VCoreMongo firewall check - Migrate Postgres and VCore Mongo quickstart tabs to CloudShellTerminalComponent (drop allocateContainer/useNotebook dependencies) - Refactor useTerminal to send input via the CloudShell WebSocket instead of postRobot/iframe; register the socket from CloudShellTerminalComponent - Simplify Explorer.openNotebookTerminal to always open a CloudShell terminal - Delete NotebookTerminalComponent(+test/less/snapshot), NotebookTerminalComponentAdapter, and the src/Terminal/ entry point - Remove the terminal.html webpack entry/HTML plugin and src/Terminal from tsconfig.strict.json Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/remove-notebooks-plan.md | 214 ++++++++++++++++++ .../Notebook/NotebookTerminalComponent.less | 13 -- .../NotebookTerminalComponent.test.tsx | 146 ------------ .../Notebook/NotebookTerminalComponent.tsx | 99 -------- .../NotebookTerminalComponent.test.tsx.snap | 73 ------ src/Explorer/Explorer.tsx | 21 +- .../CloudShellTerminalComponent.tsx | 11 +- src/Explorer/Tabs/QuickstartTab.tsx | 42 +--- .../NotebookTerminalComponentAdapter.tsx | 32 --- src/Explorer/Tabs/Tabs.tsx | 6 +- src/Explorer/Tabs/TerminalTab.tsx | 82 +------ src/Explorer/Tabs/VCoreMongoQuickstartTab.tsx | 77 +------ src/Main.tsx | 1 - src/Terminal/JupyterLabAppFactory.ts | 125 ---------- src/Terminal/NotebookAppContracts.d.ts | 111 --------- src/Terminal/README.md | 74 ------ src/Terminal/TerminalProps.ts | 15 -- src/Terminal/index.css | 26 --- src/Terminal/index.html | 13 -- src/Terminal/index.ts | 125 ---------- src/hooks/useTerminal.ts | 24 +- tsconfig.strict.json | 1 - webpack.config.js | 6 - 23 files changed, 259 insertions(+), 1078 deletions(-) create mode 100644 docs/remove-notebooks-plan.md delete mode 100644 src/Explorer/Controls/Notebook/NotebookTerminalComponent.less delete mode 100644 src/Explorer/Controls/Notebook/NotebookTerminalComponent.test.tsx delete mode 100644 src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx delete mode 100644 src/Explorer/Controls/Notebook/__snapshots__/NotebookTerminalComponent.test.tsx.snap delete mode 100644 src/Explorer/Tabs/ShellAdapters/NotebookTerminalComponentAdapter.tsx delete mode 100644 src/Terminal/JupyterLabAppFactory.ts delete mode 100644 src/Terminal/NotebookAppContracts.d.ts delete mode 100644 src/Terminal/README.md delete mode 100644 src/Terminal/TerminalProps.ts delete mode 100644 src/Terminal/index.css delete mode 100644 src/Terminal/index.html delete mode 100644 src/Terminal/index.ts diff --git a/docs/remove-notebooks-plan.md b/docs/remove-notebooks-plan.md new file mode 100644 index 000000000..9b6104509 --- /dev/null +++ b/docs/remove-notebooks-plan.md @@ -0,0 +1,214 @@ +# Implementation Plan: Remove Phoenix & Notebooks + +## Problem statement + +Cosmos Explorer contains a large, deeply-integrated **notebooks** feature backed by +the **Phoenix** compute-container service and the **Juno** service, plus a **GitHub** +integration used to pin/browse notebook repositories. This functionality is being +retired. The goal is to remove all notebooks/Phoenix/Juno/GitHub-for-notebooks code, +dependencies, UI surfaces, telemetry, and configuration, while **preserving the +database shell terminals** (Mongo / Cassandra / Postgres / VCoreMongo), which today +share the Terminal infrastructure with notebooks. + +This document is the implementation plan only. No code changes are made here. + +## Scope decisions (confirmed) + +- **Database shells**: Keep the Mongo/Cassandra/Postgres/VCoreMongo shells, but migrate + them to use the **CloudShell** path exclusively. Remove the legacy Phoenix + notebook-server shell path. +- **GitHub integration**: Remove entirely (it exists only for notebook pinned repos). +- **Schema Analyzer** (`src/Explorer/Notebook/SchemaAnalyzer`): Remove. +- **Phasing**: Every phase must leave the app in a **buildable, shippable** state + (build + lint + strict compile + unit tests green; shells still work). +- **Localization**: Remove notebook/GitHub strings from **all** resource files — + `src/Localization/en/Resources.json` **and** every non-English locale + (`src/Localization//Resources.json`). (This deletion is an exception to the + usual convention of editing only the English file.) + +## Prior art / related commits + +This is a continuation of an in-progress removal effort. Reference commits: + +- `7295d63a` — Remove gallery.html and all associated gallery functionality (#2474) +- `a36467f4` — Remove Phoenix `getDbAccountAllowedStatus`; `isPhoenixNotebooks`/ + `isPhoenixFeatures` now always `false` (#2472) +- `31385950` — removed NotebookViewer file (#2281) + +> **Note:** An unmerged branch `users/jawelton/remove-notebooks-terminal-052126` +> already contains related work (`5989c77c` "Remove terminal.html webpack entry point +> and notebooks terminal code", `c7f9d7e3` "Switch VCore Mongo quickstart to use +> CloudShell terminal"). These are **not** in `master`. Reconcile with that branch +> before/while starting Phase 1 to avoid duplicate or conflicting work. + +## Current-state survey (what exists today) + +**Core directories / files** +- `src/Phoenix/PhoenixClient.ts` — container allocation, heartbeat, status polling. +- `src/Juno/JunoClient.ts` (+ test) — pinned-repo / notebook metadata service client. +- `src/Explorer/Notebook/` — the bulk of the feature: + - `useNotebook.ts` (Zustand store), `NotebookManager.tsx`, `NotebookContentClient.ts`, + `NotebookClientV2.ts`, `NotebookContainerClient.ts`, `NotebookContentItem.ts`, + `NotebookUtil.ts`, `NTeractUtil.ts`, `FileSystemUtil.ts` + - `NotebookComponent/` (nteract redux store, epics, reducers, content providers) + - `NotebookRenderer/` (nteract cell rendering, decorators, outputs) + - `SchemaAnalyzer/`, `SecurityWarningBar/` +- `src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx` (+ less/test) +- `src/Explorer/Controls/NotebookViewer/` — read-only viewer + metadata. +- `src/Explorer/Tabs/NotebookV2Tab.ts`, `NotebookTabBase.ts`, `SchemaAnalyzerTab.ts` +- `src/Explorer/Panes/CopyNotebookPane/` +- `src/Explorer/Tabs/ShellAdapters/NotebookTerminalComponentAdapter.tsx` +- `src/CellOutputViewer/` — webpack entry `cellOutputViewer`. +- `src/Utils/NotebookConfigurationUtils.ts`, `src/hooks/useNotebookSnapshotStore.ts` +- `src/Utils/arm/generatedClients/cosmosNotebooks/` — generated ARM client. + +**GitHub integration (notebook-only)** +- `src/GitHub/` (`GitHubClient.ts`, `GitHubContentProvider.ts`, `GitHubOAuthService.ts`, + `GitHubConnector.ts`), `src/Utils/GitHubUtils.ts` +- `src/Explorer/Controls/GitHub/` (AuthorizeAccess, AddRepo, GitHubRepos components) +- `src/Explorer/Panes/GitHubReposPanel/` +- webpack entry `connectToGitHub` + `src/connectToGitHub.html` + +**Integration / glue points (edited, not deleted)** +- `src/Explorer/Explorer.tsx` — `phoenixClient`, `notebookManager`, `gitHubOAuthService`, + `initNotebooks`, `initiateAndRefreshNotebookList`, `allocateContainer`, + `openNotebook*`, `openNotebookTerminal`, `createNotebookContentItemFile`, etc. +- `src/Explorer/Menus/CommandBar/CommandBarComponentButtonFactory.tsx` (+ adapter, test) + — New Notebook / Open Terminal / shell buttons branching on `isShellEnabled`. +- `src/Explorer/Tree/treeNodeUtil.tsx` / `ResourceTreeAdapter.tsx` / `ResourceTree.tsx` + — "My Notebooks" / "GitHub" tree nodes; `isNotebookEnabled` plumbing. +- `src/Explorer/SplashScreen/SplashScreen.tsx` — notebook cards + `openNotebookTerminal` + for Postgres/VCoreMongo shells. +- `src/Explorer/Tabs/TerminalTab.tsx` — chooses CloudShell vs notebook-server adapter. +- `src/Explorer/OpenActions/OpenActions.tsx`, `src/Explorer/ContextMenuButtonFactory.tsx`, + `src/Explorer/Tree/Collection.ts`, `src/Explorer/useSelectedNode.ts`, + `src/Explorer/MostRecentActivity/MostRecentActivity.ts` +- `src/hooks/useKnockoutExplorer.ts`, `src/hooks/useTabs.ts` +- `src/ConfigContext.ts`, `src/Common/Constants.ts`, `src/Contracts/DataModels.ts`, + `src/Contracts/ViewModels.ts`, `src/Contracts/ActionContracts.ts`, + `src/Platform/Hosted/extractFeatures.ts` (+ test) +- `src/Shared/Telemetry/TelemetryConstants.ts` +- `src/Localization/en/Resources.json` **and all non-English** `src/Localization//Resources.json` +- `webpack.config.js` — `cellOutputViewer`, `connectToGitHub` entries + HTML plugins. +- `package.json` — `@nteract/*`, `@jupyterlab/*`, `@phosphor/widgets`, `rx-jupyter`, + and other notebook-only dependencies. + +**Critical coupling — Terminal / shells** +- `TerminalTab` uses `CloudShellTerminalComponentAdapter` when + `userContext.features.enableCloudShell`, otherwise `NotebookTerminalComponentAdapter` + (which needs a Phoenix-allocated notebook server + `terminal.html` iframe). +- Command-bar/splash shell buttons branch on + `useNotebook.getState().isShellEnabled || userContext.features.enableCloudShell`. +- `Explorer.openNotebookTerminal(...)` is the shared entry for opening shells and must + be retained (and rewired to CloudShell-only) — only its notebook-server behavior is + removed. + +## Phased approach + +Each phase is independently buildable and shippable. Within each phase, **all +references to removed code are also removed** so the tree compiles. After every phase +run: `npm run compile`, `npm run compile:strict`, `npm run lint`, `npm run format:check`, +`npm test`, and a webpack build (`npm run build:ci`); manually verify the four shells +still open. + +### Phase 1 — Decouple database shells to CloudShell-only +Remove the legacy Phoenix notebook-server terminal path so shells no longer depend on +notebook provisioning. +- Rewire `TerminalTab` to always use `CloudShellTerminalComponentAdapter`; delete the + `NotebookTerminalComponentAdapter` branch and `getNotebookServerInfo`. +- Delete `src/Explorer/Tabs/ShellAdapters/NotebookTerminalComponentAdapter.tsx` and + `src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx` (+ less/test/snapshot). +- Simplify shell buttons in `CommandBarComponentButtonFactory` and `SplashScreen` to + drop the `isShellEnabled` branch (CloudShell path only); keep `openNotebookTerminal`. +- Verify whether the `terminal`/`terminal.html` webpack entry is still needed by + CloudShell. If unused, remove it and `src/Terminal/`; otherwise keep. +- **Outcome:** Shells run purely on CloudShell. Phoenix no longer needed for terminals. + +### Phase 2 — Remove the in-app notebook authoring & rendering experience +Delete the notebook tabs, the nteract rendering engine, panes, and the read-only viewer, +and remove all UI entry points that open notebooks. +- Delete: `src/Explorer/Notebook/NotebookComponent/`, + `src/Explorer/Notebook/NotebookRenderer/`, `src/Explorer/Notebook/SecurityWarningBar/`, + `NotebookClientV2.ts`, `notebookClientV2.test.ts`, `NotebookContentClient.ts`, + `NTeractUtil.ts`, `NotebookContentItem.ts`, `NotebookUtil.ts` (+ test), + `FileSystemUtil.ts`. +- Delete tabs/panes/viewer: `src/Explorer/Tabs/NotebookV2Tab.ts`, `NotebookTabBase.ts`, + `src/Explorer/Panes/CopyNotebookPane/`, `src/Explorer/Controls/NotebookViewer/`, + `src/CellOutputViewer/` (+ `cellOutputViewer` webpack entry & HTML plugin). +- Remove notebook entry points: "New Notebook"/open-notebook buttons in + `CommandBarComponentButtonFactory` (+ test), `OpenActions.tsx`, + `ContextMenuButtonFactory.tsx`, splash-screen notebook cards & recent-notebook items + (`MostRecentActivity` OpenNotebook type), and the `openNotebook*` / + `createNotebookContentItemFile` methods on `Explorer`. +- Remove notebook deps from `package.json`: `@nteract/*`, `@jupyterlab/*`, + `@phosphor/widgets`, `rx-jupyter` (and any now-unused transitive notebook-only libs). +- **Outcome:** Notebooks can no longer be authored, opened, or rendered. + +### Phase 3 — Remove Schema Analyzer +- Delete `src/Explorer/Notebook/SchemaAnalyzer/` and `src/Explorer/Tabs/SchemaAnalyzerTab.ts`. +- Remove Schema Analyzer command-bar button and any tree/menu entry points. + +### Phase 4 — Remove GitHub integration +- Delete `src/GitHub/`, `src/Explorer/Controls/GitHub/`, + `src/Explorer/Panes/GitHubReposPanel/`, `src/Utils/GitHubUtils.ts`, + `src/connectToGitHub.html`, and the `connectToGitHub` webpack entry & HTML plugin. +- Remove `gitHubOAuthService`, GitHub pinned-repo wiring, and `gitHubNotebooksContentRoot` + usage from `Explorer.tsx`, `useNotebook.ts`, `NotebookManager.tsx`, and `JunoClient` + pinned-repo methods. +- Remove GitHub-related localization keys from **all** locale files (`en` + non-English). + +### Phase 5 — Remove Phoenix and the notebook container/allocation core +- Delete `src/Phoenix/`, `src/Explorer/Notebook/NotebookContainerClient.ts`, + `src/Explorer/Notebook/NotebookManager.tsx`, `src/Explorer/Notebook/useNotebook.ts`, + `src/Utils/NotebookConfigurationUtils.ts`, `src/hooks/useNotebookSnapshotStore.ts`. +- Remove from `Explorer.tsx`: `phoenixClient`, `notebookManager`, `_isInitializingNotebooks`, + `initNotebooks`, `initiateAndRefreshNotebookList`, `refreshNotebookList`, + `allocateContainer`, container heartbeat/connection logic, and notebook-server URL + feature overrides. +- Remove notebook tree nodes ("My Notebooks") and `isNotebookEnabled` plumbing from + `treeNodeUtil.tsx`, `ResourceTreeAdapter.tsx`, `ResourceTree.tsx`, `Collection.ts`, + `useSelectedNode.ts` (+ update tree snapshots/tests). +- Remove notebook initialization from `useKnockoutExplorer.ts` and notebook tab handling + in `useTabs.ts`. + +### Phase 6 — Remove residual clients, config, contracts, telemetry & strings +- Delete `src/Juno/` and `src/Utils/arm/generatedClients/cosmosNotebooks/`. +- Remove notebook fields from `ConfigContext.ts`, `Constants.ts` (Notebook namespace), + `DataModels.ts` (notebook/Phoenix/container interfaces), `ViewModels.ts`, + `ActionContracts.ts`, and notebook feature flags from + `extractFeatures.ts` (+ update test). +- Remove notebook/Phoenix telemetry actions/areas from `TelemetryConstants.ts` (preserve + enum numbering if other systems depend on it — mirror the cautious approach in + `a36467f4`). +- Remove remaining notebook strings from **all** locale `Resources.json` files (`en` + + every non-English locale) and any notebook images (e.g. `images/notebook/`). +- Final full build + test sweep; update `EndpointUtils.ts` (`allowedNotebookServerUrls`) + and any docs/comments referencing notebooks. + +## Cross-cutting verification (run after each phase) + +``` +npm run compile +npm run compile:strict +npm run lint +npm run format:check +npm test +npm run build:ci +``` +Plus manual smoke test: open Mongo, Cassandra, Postgres, and VCoreMongo shells. + +## Notes & considerations + +- **Strict null checks:** any file edited may need to stay in / be removed from + `tsconfig.strict.json`. Remove deleted files from that list. +- **Snapshots:** several Jest snapshots reference notebook UI + (`treeNodeUtil`, `SettingsComponent`, panel snapshots). Regenerate after edits. +- **Telemetry enum safety:** prior commit `a36467f4` deliberately reverted removal of + enum values to avoid breaking downstream consumers. Prefer leaving enum numeric values + intact unless confirmed safe to remove. +- **`enableCloudShell` feature flag:** confirm it is enabled in all target environments + before removing the Phoenix shell fallback, or shells will break. +- **E2E tests:** check `test/` for notebook/terminal specs to update or remove; shells + may have E2E coverage that needs the CloudShell-only path. +- **Reconcile** with branch `users/jawelton/remove-notebooks-terminal-052126` to avoid + rework, especially in Phase 1. diff --git a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.less b/src/Explorer/Controls/Notebook/NotebookTerminalComponent.less deleted file mode 100644 index 305c8827c..000000000 --- a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.less +++ /dev/null @@ -1,13 +0,0 @@ -@import "../../../../less/Common/Constants"; - -.notebookTerminalContainer { - padding: @DefaultSpace; - height: 100%; - width: 100%; - - iframe { - border: none; - height: 100%; - width: 100%; - } -} \ No newline at end of file diff --git a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.test.tsx b/src/Explorer/Controls/Notebook/NotebookTerminalComponent.test.tsx deleted file mode 100644 index bd816ac31..000000000 --- a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.test.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { shallow } from "enzyme"; -import React from "react"; -import * as DataModels from "../../../Contracts/DataModels"; -import { NotebookTerminalComponent, NotebookTerminalComponentProps } from "./NotebookTerminalComponent"; - -const testAccount: DataModels.DatabaseAccount = { - id: "id", - kind: "kind", - location: "location", - name: "name", - properties: { - documentEndpoint: "https://testDocumentEndpoint.azure.com/", - }, - type: "type", -}; - -const testMongo32Account: DataModels.DatabaseAccount = { - ...testAccount, -}; - -const testMongo36Account: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - mongoEndpoint: "https://testMongoEndpoint.azure.com/", - }, -}; - -const testCassandraAccount: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - cassandraEndpoint: "https://testCassandraEndpoint.azure.com/", - }, -}; - -const testPostgresAccount: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - postgresqlEndpoint: "https://testPostgresEndpoint.azure.com/", - }, -}; - -const testVCoreMongoAccount: DataModels.DatabaseAccount = { - ...testAccount, - properties: { - vcoreMongoEndpoint: "https://testVCoreMongoEndpoint.azure.com/", - }, -}; - -const testNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com", - forwardingId: "Id", -}; - -const testMongoNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/mongo", - forwardingId: "Id", -}; - -const testCassandraNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/cassandra", - forwardingId: "Id", -}; - -const testPostgresNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/postgresql", - forwardingId: "Id", -}; - -const testVCoreMongoNotebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo = { - authToken: "authToken", - notebookServerEndpoint: "https://testNotebookServerEndpoint.azure.com/mongovcore", - forwardingId: "Id", -}; - -describe("NotebookTerminalComponent", () => { - it("renders terminal", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testAccount, - notebookServerInfo: testNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders mongo 3.2 shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testMongo32Account, - notebookServerInfo: testMongoNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders mongo 3.6 shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testMongo36Account, - notebookServerInfo: testMongoNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders cassandra shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testCassandraAccount, - notebookServerInfo: testCassandraNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders Postgres shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testPostgresAccount, - notebookServerInfo: testPostgresNotebookServerInfo, - tabId: undefined, - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); - - it("renders vCore Mongo shell", () => { - const props: NotebookTerminalComponentProps = { - databaseAccount: testVCoreMongoAccount, - notebookServerInfo: testVCoreMongoNotebookServerInfo, - tabId: undefined, - username: "username", - }; - - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); -}); diff --git a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx b/src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx deleted file mode 100644 index 96d41155e..000000000 --- a/src/Explorer/Controls/Notebook/NotebookTerminalComponent.tsx +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Wrapper around Notebook server terminal - */ - -import { useTerminal } from "hooks/useTerminal"; -import postRobot from "post-robot"; -import * as React from "react"; -import * as DataModels from "../../../Contracts/DataModels"; -import { TerminalProps } from "../../../Terminal/TerminalProps"; -import { userContext } from "../../../UserContext"; -import * as StringUtils from "../../../Utils/StringUtils"; - -export interface NotebookTerminalComponentProps { - notebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo; - databaseAccount: DataModels.DatabaseAccount; - tabId: string; - username?: string; -} - -export class NotebookTerminalComponent extends React.Component { - private terminalWindow: Window; - - constructor(props: NotebookTerminalComponentProps) { - super(props); - } - - componentDidMount(): void { - this.sendPropsToTerminalFrame(); - } - - public render(): JSX.Element { - return ( -
-