Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@
- `deepnoteSerializer.ts` - Main serializer (orchestration)
- `deepnoteActivationService.ts` - VSCode activation
- Whitespace is good for readability, add a blank line after const groups and before return statements
- Separate third-party and local file imports
- Separate third-party and local file imports
- How the extension works is described in @architecture.md
Comment on lines +29 to +30
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Fix reference and newline

Use a standard link and end with a newline to satisfy markdownlint.

- - Separate third-party and local file imports
- - How the extension works is described in @architecture.md
+ - Separate third-party and local file imports
+ - How the extension works is described in [architecture.md](./architecture.md)
+
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Separate third-party and local file imports
- How the extension works is described in @architecture.md
- Separate third-party and local file imports
- How the extension works is described in [architecture.md](./architecture.md)
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

30-30: Files should end with a single newline character

(MD047, single-trailing-newline)

🤖 Prompt for AI Agents
In CLAUDE.md around lines 29 to 30, the second bullet uses a non-standard
reference to @architecture.md and the line doesn't end with a newline; update
the bullet to use a standard Markdown link format (e.g.
[architecture](architecture.md) or a relative link to ARCHITECTURE.md as
appropriate) and ensure the line ends with a newline character so markdownlint
passes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Terminate file with a single trailing newline.

Fix MD047.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

30-30: Files should end with a single newline character

(MD047, single-trailing-newline)

🤖 Prompt for AI Agents
In CLAUDE.md around line 30, the file is missing a single trailing newline
(MD047). Ensure the file ends with exactly one newline character: open
CLAUDE.md, add a single '\n' at the end if absent, and remove any extra blank
lines so the file terminates with one trailing newline.

Comment on lines +29 to +30
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

⚠️ Potential issue

Fix link and end-of-file newline.

  • Use a proper Markdown link to architecture.md.
  • Add a trailing newline to satisfy MD047.
- - How the extension works is described in @architecture.md
+ - How the extension works is described in [architecture.md](architecture.md)
+
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Separate third-party and local file imports
- How the extension works is described in @architecture.md
- Separate third-party and local file imports
- How the extension works is described in [architecture.md](architecture.md)
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

30-30: Files should end with a single newline character

(MD047, single-trailing-newline)

🤖 Prompt for AI Agents
In CLAUDE.md around lines 29 to 30, replace the plain text reference "How the
extension works is described in @architecture.md" with a proper Markdown link to
the file (for example: "How the extension works is described in
[architecture.md](architecture.md)" or the correct relative path if different)
and ensure the file ends with a single trailing newline character to satisfy
MD047.

188 changes: 188 additions & 0 deletions architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
# VSCode Deepnote Extension Architecture

This extension adds support for Deepnote notebooks in Visual Studio Code. Deepnote is a collaborative data science notebook platform, and this extension allows users to open, edit, and manage Deepnote project files (`.deepnote` files) directly within VS Code.

## Key Components

### 1. Notebook Serializer (`deepnoteSerializer.ts`)

The core component responsible for converting between Deepnote's YAML format and VS Code's notebook format.

**Responsibilities:**

- **Deserialization**: Converts Deepnote YAML files into VS Code NotebookData format
- **Serialization**: Converts VS Code notebook changes back to Deepnote YAML format
- **State Management**: Maintains original project data for accurate serialization

Comment on lines +15 to +16
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix ownership of original project state (serializer vs manager).

Serializer shouldn’t “maintain original project data”; the Notebook Manager owns this state and the serializer queries it. Update wording to avoid implying duplicate state.

- **State Management**: Maintains original project data for accurate serialization
+ **State Access**: Reads original project data from the Notebook Manager for accurate serialization
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- **State Management**: Maintains original project data for accurate serialization
- **State Access**: Reads original project data from the Notebook Manager for accurate serialization
🤖 Prompt for AI Agents
In architecture.md around lines 15-16, the sentence implying the serializer
"maintains original project data" is incorrect; update the wording to state that
the Notebook Manager owns and maintains the original project state and the
serializer only queries or accesses that state for accurate serialization,
avoiding any implication of duplicated ownership.

**Key Methods:**

- `deserializeNotebook()`: Parses YAML, converts blocks to cells
- `serializeNotebook()`: Converts cells back to blocks, updates YAML
- `findCurrentNotebookId()`: Determines which notebook to deserialize using manager state

### 2. Data Converter (`deepnoteDataConverter.ts`)

Handles the transformation between Deepnote blocks and VS Code notebook cells.

**Responsibilities:**

- Convert Deepnote blocks (code, markdown, SQL, etc.) to VS Code cells
- Convert VS Code cells back to Deepnote blocks
- Preserve block metadata and outputs during conversion

**Supported Block Types:**

- Code blocks (Python, R, JavaScript, etc.)
- Markdown blocks

Comment on lines +25 to +37
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Clarify language resolution strategy.

State that code cell languageId comes from block/notebook metadata (e.g., block.metadata.language or executionMode), not hardcoded.

-Handles the transformation between Deepnote blocks and VS Code notebook cells.
+Handles the transformation between Deepnote blocks and VS Code notebook cells. For code cells, the languageId is derived from block/notebook metadata (e.g. block.metadata.language or executionMode) with a sensible default.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Handles the transformation between Deepnote blocks and VS Code notebook cells.
**Responsibilities:**
- Convert Deepnote blocks (code, markdown, SQL, etc.) to VS Code cells
- Convert VS Code cells back to Deepnote blocks
- Preserve block metadata and outputs during conversion
**Supported Block Types:**
- Code blocks (Python, R, JavaScript, etc.)
- Markdown blocks
Handles the transformation between Deepnote blocks and VS Code notebook cells. For code cells, the languageId is derived from block/notebook metadata (e.g. block.metadata.language or executionMode) with a sensible default.
**Responsibilities:**
- Convert Deepnote blocks (code, markdown, SQL, etc.) to VS Code cells
- Convert VS Code cells back to Deepnote blocks
- Preserve block metadata and outputs during conversion
**Supported Block Types:**
- Code blocks (Python, R, JavaScript, etc.)
- Markdown blocks
🤖 Prompt for AI Agents
In architecture.md around lines 25–37, clarify that code cell language
resolution must derive from block or notebook metadata rather than being
hardcoded; update the Responsibilities/Supported Block Types section to state
that VS Code cell.languageId is computed from sources such as
block.metadata.language, notebook-level language or block.executionMode (with a
clear precedence order), and that a sensible default fallback (e.g.,
"plaintext") should be used if none is present; also mention preserving
executionMode/metadata during conversions so the language mapping remains
consistent when converting back and forth.

### 3. Notebook Manager (`deepnoteNotebookManager.ts`)

Manages the state of Deepnote projects and notebook selections.

**Responsibilities:**

- Store original project data for serialization
- Track which notebook is selected for each project
- Maintain project-to-notebook mapping using project IDs

**Key Features:**

- In-memory caching of project data
- Project-ID based notebook selection tracking
- Support for multiple notebooks per project

**Key Methods:**

- `getTheSelectedNotebookForAProject()`: Retrieves selected notebook ID for a project
- `selectNotebookForProject()`: Associates a notebook ID with a project ID
- `storeOriginalProject()`: Caches project data and sets current notebook

Comment on lines +56 to +59
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Rename awkward API in docs for consistency.

Prefer getSelectedNotebookForProject over getTheSelectedNotebookForAProject.

- -   `getTheSelectedNotebookForAProject()`: Retrieves selected notebook ID for a project
+ -   `getSelectedNotebookForProject()`: Retrieves selected notebook ID for a project
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- `getTheSelectedNotebookForAProject()`: Retrieves selected notebook ID for a project
- `selectNotebookForProject()`: Associates a notebook ID with a project ID
- `storeOriginalProject()`: Caches project data and sets current notebook
- `getSelectedNotebookForProject()`: Retrieves selected notebook ID for a project
- `selectNotebookForProject()`: Associates a notebook ID with a project ID
- `storeOriginalProject()`: Caches project data and sets current notebook
🤖 Prompt for AI Agents
In architecture.md around lines 56 to 59, the documented API name
getTheSelectedNotebookForAProject is awkward and inconsistent; rename it to
getSelectedNotebookForProject in the docs (and update any neighbouring
references) so the list reads: getSelectedNotebookForProject(): Retrieves
selected notebook ID for a project, maintaining consistent camelCase and wording
with the other API names.

### 4. Explorer View (`deepnoteExplorerView.ts`)

Provides the sidebar UI for browsing and opening Deepnote notebooks.

**Responsibilities:**

- Create and manage the tree view in VS Code's sidebar
- Handle user interactions (clicking on notebooks/files)
- Register commands for notebook operations

**Commands:**

- `deepnote.refreshExplorer`: Refresh the file tree
- `deepnote.openNotebook`: Open a specific notebook
- `deepnote.openFile`: Open the raw .deepnote file
- `deepnote.revealInExplorer`: Show active notebook info

### 5. Tree Data Provider (`deepnoteTreeDataProvider.ts`)

Implements VS Code's TreeDataProvider interface for the sidebar view.

**Responsibilities:**

- Scan workspace for `.deepnote` files
- Parse project files to extract notebook information
- Provide tree structure for the explorer view
- Watch for file system changes

**Features:**

- Automatic workspace scanning
- File system watching for real-time updates
- Caching for performance optimization

### 6. Activation Service (`deepnoteActivationService.ts`)

Entry point for the Deepnote functionality within the extension.

**Responsibilities:**

- Register the notebook serializer with VS Code
- Initialize the explorer view
- Set up extension lifecycle

## Data Flow

### Opening a Notebook

1. **User Action**: User clicks on a notebook in the sidebar
2. **Explorer View**: Handles the click, stores notebook selection using project ID
3. **Notebook Manager**: Associates the notebook ID with the project ID
4. **VS Code**: Opens the document using the base file URI and calls `deserializeNotebook()`
5. **Serializer**:
- Uses `findCurrentNotebookId()` to determine which notebook to load
- Reads the YAML file and finds the selected notebook
- Converts blocks to cells using the Data Converter
6. **Display**: VS Code displays the notebook in the editor

### Saving Changes

1. **User Action**: User makes changes and saves (Ctrl+S)
2. **VS Code**: Calls the serializer's `serializeNotebook()` method
3. **Serializer**:
- Retrieves original project data from Notebook Manager
- Converts cells back to blocks using the Data Converter
- Updates the YAML structure
- Writes back to file
4. **File System**: Updates the `.deepnote` file

## File Format

### Deepnote YAML Structure

```yaml
version: 1.0
metadata:
modifiedAt: '2024-01-01T00:00:00Z'
project:
id: 'project-uuid'
name: 'Project Name'
notebooks:
- id: 'notebook-uuid'
name: 'Notebook Name'
blocks:
- id: 'block-uuid'
type: 'code'
source: "print('Hello')"
outputs: []
```
Comment on lines +141 to +149
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

YAML sample key mismatch with implementation.

Blocks use source: here, but code reads block.content. Align docs or add compatibility in serializer.

-              - id: 'block-uuid'
-                type: 'code'
-                source: "print('Hello')"
+              - id: 'block-uuid'
+                type: 'code'
+                content: "print('Hello')"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- id: 'notebook-uuid'
name: 'Notebook Name'
blocks:
- id: 'block-uuid'
type: 'code'
source: "print('Hello')"
outputs: []
```
- id: 'notebook-uuid'
name: 'Notebook Name'
blocks:
- id: 'block-uuid'
type: 'code'
content: "print('Hello')"
outputs: []
🤖 Prompt for AI Agents
In architecture.md around lines 141 to 149 the example YAML uses the key
"source" for block text while the implementation expects block.content; update
either the docs or the serializer. Fix option A: change the sample YAML to use
"content:" instead of "source:" so docs match runtime. Fix option B: modify the
serializer/deserializer to accept both keys by reading block.content ||
block.source when parsing and writing a single canonical key (pick one, e.g.,
always emit "content") when serializing so backward compatibility is preserved.

### VS Code Notebook Format
```typescript
interface NotebookData {
cells: NotebookCellData[];
metadata: {
deepnoteProjectId: string;
deepnoteProjectName: string;
deepnoteNotebookId: string;
deepnoteNotebookName: string;
deepnoteVersion: string;
};
}
```

## Multi-Notebook Support

The extension supports opening multiple notebooks from the same `.deepnote` file:

1. **Project-Based Selection**: The Notebook Manager tracks which notebook is selected for each project
2. **State Management**: When opening a notebook, the manager stores the project-to-notebook mapping
3. **Fallback Detection**: The serializer can detect the current notebook from VS Code's active document context

Comment on lines +169 to +172
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove inaccurate “fallback detection” claim.

VS Code’s NotebookSerializer lacks URI/editor context during deserialization, so the serializer can’t infer the active editor. Selection must come from the manager.

-3. **Fallback Detection**: The serializer can detect the current notebook from VS Code's active document context
+3. **No Editor Fallback**: Selection is provided by the Notebook Manager; the serializer has no editor/URI context.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
1. **Project-Based Selection**: The Notebook Manager tracks which notebook is selected for each project
2. **State Management**: When opening a notebook, the manager stores the project-to-notebook mapping
3. **Fallback Detection**: The serializer can detect the current notebook from VS Code's active document context
1. **Project-Based Selection**: The Notebook Manager tracks which notebook is selected for each project
2. **State Management**: When opening a notebook, the manager stores the project-to-notebook mapping
3. **No Editor Fallback**: Selection is provided by the Notebook Manager; the serializer has no editor/URI context.
🤖 Prompt for AI Agents
In architecture.md around lines 169 to 172, remove or correct the inaccurate
claim that the serializer can perform “Fallback Detection” of the current
notebook from VS Code’s active document context; instead state that VS Code’s
NotebookSerializer lacks URI/editor context during deserialization so it cannot
infer the active editor, and update the text to indicate that notebook selection
must be provided by the Notebook Manager (project-to-notebook mapping) rather
than the serializer.

## Technical Decisions

### Why YAML?

Deepnote uses YAML for its file format, which provides:

- Human-readable structure
- Support for complex nested data
- Easy to read Git diffs

### Why Project-ID Based Selection?

- Simpler than URI-based tracking - uses straightforward project ID mapping
- The VS Code NotebookSerializer interface doesn't provide URI context during deserialization
- Allows for consistent notebook selection regardless of how the document is opened
- Manager-based approach centralizes state management and reduces complexity
46 changes: 35 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,18 @@
}
],
"commands": [
{
"command": "deepnote.refreshExplorer",
"title": "%deepnote.commands.refreshExplorer.title%",
"category": "Deepnote",
"icon": "$(refresh)"
},
{
"command": "deepnote.revealInExplorer",
"title": "%deepnote.commands.revealInExplorer.title%",
"category": "Deepnote",
"icon": "$(reveal)"
},
{
"command": "dataScience.ClearCache",
"title": "%jupyter.command.dataScience.clearCache.title%",
Expand Down Expand Up @@ -320,12 +332,6 @@
"title": "%jupyter.command.jupyter.viewOutput.title%",
"category": "Jupyter"
},
{
"command": "jupyter.selectDeepnoteNotebook",
"title": "%deepnote.command.selectNotebook.title%",
"category": "Deepnote",
"enablement": "notebookType == 'deepnote'"
},
{
"command": "jupyter.notebookeditor.export",
"title": "%DataScience.notebookExportAs%",
Expand Down Expand Up @@ -894,11 +900,6 @@
"group": "navigation@2",
"when": "notebookType == 'jupyter-notebook' && config.jupyter.showOutlineButtonInNotebookToolbar"
},
{
"command": "jupyter.selectDeepnoteNotebook",
"group": "navigation@2",
"when": "notebookType == 'deepnote'"
},
{
"command": "jupyter.continueEditSessionInCodespace",
"group": "navigation@3",
Expand Down Expand Up @@ -1402,6 +1403,13 @@
"title": "%jupyter.command.jupyter.runFileInteractive.title%",
"when": "resourceLangId == python && !isInDiffEditor && isWorkspaceTrusted"
}
],
"view/item/context": [
{
"command": "deepnote.revealInExplorer",
"when": "view == deepnoteExplorer",
"group": "inline@2"
}
]
},
"configuration": {
Expand Down Expand Up @@ -2003,6 +2011,11 @@
"id": "jupyter",
"title": "Jupyter",
"icon": "$(notebook)"
},
{
"id": "deepnote",
"title": "Deepnote",
"icon": "resources/DnDeepnoteLineLogo.svg"
}
],
"panel": [
Expand All @@ -2021,6 +2034,17 @@
"name": "Jupyter Variables",
"when": "jupyter.hasNativeNotebookOrInteractiveWindowOpen"
}
],
"deepnote": [
{
"id": "deepnoteExplorer",
"name": "%deepnote.views.explorer.name%",
"when": "workspaceFolderCount != 0",
"iconPath": {
"light": "./resources/light/deepnote-icon.svg",
"dark": "./resources/dark/deepnote-icon.svg"
}
}
]
},
"debuggers": [
Expand Down
8 changes: 7 additions & 1 deletion package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -244,5 +244,11 @@
"jupyter.languageModelTools.configure_notebook.userDescription": "Ensure Notebook is ready for use, such as running cells.",
"jupyter.languageModelTools.notebook_list_packages.userDescription": "Lists Python packages available in the selected Notebook Kernel.",
"jupyter.languageModelTools.notebook_install_packages.userDescription": "Installs Python packages in the selected Notebook Kernel.",
"deepnote.notebook.displayName": "Deepnote Notebook"
"deepnote.notebook.displayName": "Deepnote Notebook",
"deepnote.commands.refreshExplorer.title": "Refresh Explorer",
"deepnote.commands.openNotebook.title": "Open Notebook",
"deepnote.commands.openFile.title": "Open File",
"deepnote.commands.revealInExplorer.title": "Reveal in Explorer",
"deepnote.views.explorer.name": "Explorer",
"deepnote.command.selectNotebook.title": "Select Notebook"
Comment on lines +247 to +253
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Localize the activity bar title (missing key).

Add a key for the Deepnote container title and reference it from package.json.

@@
-    "deepnote.views.explorer.name": "Explorer",
+    "deepnote.views.explorer.name": "Explorer",
+    "deepnote.activitybar.title": "Deepnote",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"deepnote.notebook.displayName": "Deepnote Notebook",
"deepnote.commands.refreshExplorer.title": "Refresh Explorer",
"deepnote.commands.openNotebook.title": "Open Notebook",
"deepnote.commands.openFile.title": "Open File",
"deepnote.commands.revealInExplorer.title": "Reveal in Explorer",
"deepnote.views.explorer.name": "Explorer",
"deepnote.command.selectNotebook.title": "Select Notebook"
"deepnote.notebook.displayName": "Deepnote Notebook",
"deepnote.commands.refreshExplorer.title": "Refresh Explorer",
"deepnote.commands.openNotebook.title": "Open Notebook",
"deepnote.commands.openFile.title": "Open File",
"deepnote.commands.revealInExplorer.title": "Reveal in Explorer",
"deepnote.views.explorer.name": "Explorer",
"deepnote.activitybar.title": "Deepnote",
"deepnote.command.selectNotebook.title": "Select Notebook"
🤖 Prompt for AI Agents
In package.nls.json around lines 247-253 add a new localization key for the
Deepnote activity bar/container title (for example "deepnote.container.title":
"Deepnote") and then update package.json to reference that key (use the
%deepnote.container.title% token) in the contributes.viewsContainers.activitybar
entry for the Deepnote container so the activity bar title is localized.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Remove unused string if the command was deleted.

If deepnote.command.selectNotebook is no longer contributed, drop its nls entry to avoid drift.

🤖 Prompt for AI Agents
In package.nls.json around line 253, the "deepnote.command.selectNotebook.title"
entry appears unused; remove this key/value pair from the file and save, then
search the repository for any remaining references to
"deepnote.command.selectNotebook" (command contributions or code) and delete or
update them accordingly if found.

}
Comment on lines +247 to 254
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Localize activity bar title and drop unused key.

Add deepnote.activitybar.title and remove stale deepnote.command.selectNotebook.title.

     "deepnote.notebook.displayName": "Deepnote Notebook",
+    "deepnote.activitybar.title": "Deepnote",
     "deepnote.commands.refreshExplorer.title": "Refresh Explorer",
     "deepnote.commands.openNotebook.title": "Open Notebook",
     "deepnote.commands.openFile.title": "Open File",
     "deepnote.commands.revealInExplorer.title": "Reveal in Explorer",
     "deepnote.views.explorer.name": "Explorer",
-    "deepnote.command.selectNotebook.title": "Select Notebook"
+    // (removed) "deepnote.command.selectNotebook.title"

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In package.nls.json around lines 247 to 254, localize the Activity Bar title by
adding a new key "deepnote.activitybar.title" with the appropriate display
string (e.g., "Deepnote") and remove the stale key
"deepnote.command.selectNotebook.title" from the file; ensure the JSON remains
valid (commas adjusted) and the new key uses the same localization style as the
neighboring entries.

3 changes: 3 additions & 0 deletions resources/DnDeepnoteLineLogo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions resources/dark/deepnote-icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions resources/light/deepnote-icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading