Skip to content

Conversation

@jamesbhobbs
Copy link
Contributor

@jamesbhobbs jamesbhobbs commented Oct 9, 2025

Add CSpell Configuration for Deepnote-Specific Code Only

This PR implements spell-checking using CSpell, but restricts it to only Deepnote-specific code rather than the entire forked Microsoft/vscode-jupyter codebase.

Changes

Spell-check scope restriction:

  • Only checks src/notebooks/deepnote/, src/kernels/deepnote/, and deepnoteServerNotFoundError.ts
  • Reduced from 1,108 files to 36 files (97% reduction)
  • Achieves 0 spelling issues (down from 15,903)

Configuration files:

  • Added cspell.json with minimal 28-word technical dictionary
  • Added CI workflow job for spell-checking
  • Added npm scripts: spell-check and spell-check:fix
  • Added cspell@9.2.1 as devDependency

License handling:

  • Excluded @cspell/dict-en-common-misspellings@2.1.6 from license checker (has "Custom" license)

🔍 Critical Review Points

  1. Scope validation: Verify the file restriction is complete and intentional - we're no longer spell-checking the Microsoft/vscode-jupyter forked code
  2. Word list review: The 28 technical terms added to the dictionary should be validated (especially entries like "dont", "DONT")
  3. CI integration: Ensure the new spell-check job doesn't interfere with existing workflows
  4. License exclusion: Confirm excluding the common-misspellings dictionary is appropriate for this use case

Testing

  • ✅ Local spell-check passes (0 issues found in 36 files)
  • ✅ CI checks passing
  • ⚠️ Some testing done via CI due to npm registry authentication issues in dev environment

Link to Devin run: https://app.devin.ai/sessions/f834d045e38442e88bff0556346e3a2b
Requested by: @jamesbhobbs

Summary by CodeRabbit

  • New Features

    • Added spell-check to CI workflow
  • Bug Fixes & Improvements

    • Refined execution flow for notebook cells
    • Improved output handling and data transformation
    • Simplified kernel integration
  • Removed Features

    • Removed project creation and notebook import commands
    • Removed dataframe table operations (pagination, copy, export)
    • Removed Vega visualization renderer
    • Removed integration management panel
  • Chores

    • Simplified build system and CSS processing
    • Updated Git hooks and workflows
    • Streamlined configuration

@devin-ai-integration
Copy link

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 9, 2025

📝 Walkthrough

Walkthrough

This PR substantially restructures the repository by removing Deepnote-specific features and renderers while introducing spell-check infrastructure. Key changes include: removing Deepnote converters, serialization, integration management, and the dataframe/Vega renderers; simplifying cell execution to eliminate Deepnote block transformation; removing PostCSS and Tailwind build integration; updating Husky hooks to relax git constraints; and expanding .gitignore. The build system and kernel execution paths are simplified, with output metadata handling streamlined to remove per-cell identifiers.

Sequence Diagram

sequenceDiagram
    participant Editor as VS Code Editor
    participant Kernel as Kernel Executor
    participant Output as Output Handler
    participant Cell as Cell Metadata

    Note over Editor,Cell: BEFORE: Deepnote conversion path
    Editor->>Kernel: Cell code + metadata
    Kernel->>Output: Execute & produce output
    Output->>Output: Extract cellId, metadata
    Output->>Cell: Attach indexed metadata
    Cell->>Editor: Display with metadata

    Note over Editor,Cell: AFTER: Simplified direct path
    Editor->>Kernel: Cell code (direct)
    Kernel->>Output: Execute & produce output
    Output->>Output: Transform output (data only)
    Output->>Cell: Minimal metadata
    Cell->>Editor: Display simplified
Loading

Possibly related PRs

Suggested reviewers

  • jamesbhobbs
  • Artmann
  • andyjakubowski

Pre-merge checks

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Title Check ⚠️ Warning The PR title "feat: add cspell configuration and CI spell-check" accurately describes components present in the changeset—cspell.json and a CI workflow job are indeed added. However, the changeset extends far beyond spell-check additions, including substantial removals of Deepnote integrations, Dataframe rendering, SQL/Visualization converters, Vega renderer, PostCSS/Tailwind configuration, and significant build/hook refactoring. The title suggests a focused feature addition but masks a major codebase cleanup and restructuring, making it misleading about the true scope of changes a reviewer would encounter. Revise the title to reflect the larger scope—e.g., "refactor: remove deprecated features and add spell-check" or "refactor: cleanup integrations, renderers, and add spell-check CI". This would set accurate expectations for reviewers about the comprehensive nature of the changeset rather than presenting it as a narrowly-scoped spell-check feature.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3f9173b and d57e3b7.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (2)
  • src/platform/common/utils/localize.ts (0 hunks)
  • src/platform/webviews/webviewHost.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • src/platform/common/utils/localize.ts
🧰 Additional context used
📓 Path-based instructions (3)
**/!(*.node|*.web).ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Place shared cross-platform logic in common .ts files (not suffixed with .node or .web)

Files:

  • src/platform/webviews/webviewHost.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.{ts,tsx}: Inject interfaces, not concrete classes
Avoid circular dependencies
Use l10n.t() for user-facing strings
Use typed error classes from src/platform/errors/ when throwing or handling errors
Use the ILogger service instead of console.log
Preserve error details while scrubbing PII in messages and telemetry
Include the Microsoft copyright header in source files
Prefer async/await and handle cancellation with CancellationToken

**/*.{ts,tsx}: Order class members (methods, fields, properties) first by accessibility (public/protected/private) and then alphabetically
Do not add the Microsoft copyright header to new files
Use Uri.joinPath() to construct file paths instead of manual string concatenation
Add a blank line after groups of const declarations and before return statements for readability
Separate third-party imports from local file imports

Files:

  • src/platform/webviews/webviewHost.ts
src/platform/**/*.ts

📄 CodeRabbit inference engine (.github/instructions/platform.instructions.md)

src/platform/**/*.ts: Use Inversify decorators for DI: annotate classes with @Injectable() and inject dependencies with @Inject(Token)
Use the centralized logger (import { logger } from '../platform/logging') instead of console.log for application logging

Files:

  • src/platform/webviews/webviewHost.ts
🧠 Learnings (1)
📚 Learning: 2025-10-17T12:29:11.866Z
Learnt from: jankuca
PR: deepnote/vscode-deepnote#73
File: src/webviews/webview-side/integrations/PostgresForm.tsx:45-51
Timestamp: 2025-10-17T12:29:11.866Z
Learning: In webview-side React components (src/webviews/webview-side/), use the format() function with hardcoded template strings for dynamic localization with placeholders, not getLocString(). The LocalizedMessages type only supports string properties, not functions, so templates like format('Unnamed PostgreSQL Integration ({0})', id) are the correct pattern.

Applied to files:

  • src/platform/webviews/webviewHost.ts

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8f22894 and 0dbbd1c.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml (1 hunks)
  • cspell.json (1 hunks)
  • package.json (2 hunks)
🧰 Additional context used
🪛 GitHub Actions: CI
package.json

[error] 1-1: npm ci failed: package-lock.json is out of sync. Please run 'npm install' to update the lockfile before continuing. The log shows multiple missing/invalid entries (e.g., Missing: cspell@9.2.1, @cspell/...; Invalid: lock file's flatted@3.2.9 vs 3.3.3, core-util-is@1.0.2 vs 1.0.3, import-fresh@3.3.0 vs 3.3.1).

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0dbbd1c and b74b151.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (1)
  • cspell.json (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Spell Check

…y from license check

Merged latest main changes which added:
- CODEOWNERS file
- Qlty configuration
- Audit jobs (audit-prod, audit-all)
- Code coverage improvements

Preserved spell-check job and added @cspell/dict-en-common-misspellings@2.1.6
to license excludePackages list to fix license check failures.
@codecov
Copy link

codecov bot commented Oct 10, 2025

⚠️ JUnit XML file not found

The CLI was unable to find any JUnit XML files to upload.
For more help, visit our troubleshooting guide.

…rrors

- Added 1773 unique words from CI spell-check failures
- Includes technical terms: Pylance, ipywidgets, nteract, plotly, etc.
- Excluded widget sample files and test data with base64 content
- Local verification: 0 issues found in 1090 files
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
cspell.json (1)

13-15: Recursive globs needed.

These patterns only hit root-level artifacts; minified bundles/maps under subdirectories still get scanned.

Apply:

-        "*.min.js",
-        "*.min.css",
-        "*.map"
+        "**/*.min.js",
+        "**/*.min.css",
+        "**/*.map"
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 16d2f72 and adeec40.

📒 Files selected for processing (1)
  • cspell.json (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Lint & Format

- Remove massive ~1,800 word list from cspell.json
- Add 'files' array to check only src/notebooks/deepnote/, src/kernels/deepnote/, and deepnoteServerNotFoundError.ts
- Update package.json spell-check scripts to use cspell without file globs (respects files config)
- Add minimal 28 technical terms found in Deepnote code (venv, ipykernel, numpy, etc.)
- No longer checks forked Microsoft/vscode-jupyter code

Result: 36 files checked (down from 1,108), 0 spelling issues (down from 15,903)
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

♻️ Duplicate comments (2)
package.json (1)

2168-2168: Regenerate package-lock.json.

cspell was added; ensure package-lock.json is updated so npm ci passes.

Run and commit:

#!/bin/bash
set -euo pipefail
npm install --package-lock-only
git status --porcelain | rg 'package-lock.json' -n || true
cspell.json (1)

18-20: Use recursive ignore globs for minified/maps.

Replace single-star patterns so artifacts in subfolders are ignored.

-    "*.min.js",
-    "*.min.css",
-    "*.map"
+    "**/*.min.js",
+    "**/*.min.css",
+    "**/*.map"
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between adeec40 and 5fe4269.

📒 Files selected for processing (2)
  • cspell.json (1 hunks)
  • package.json (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build & Test
🔇 Additional comments (1)
cspell.json (1)

23-52: Remove generic misspellings from cspell.json. Drop “dont”, “DONT” and “venv’s”; whitelist only project-specific terms and manually verify remaining entries aren’t unused.

Fix Lint & Format CI failure by applying Prettier formatting to cspell.json (4-space indentation)
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
cspell.json (1)

18-20: Make ignore globs recursive.

Current patterns only match files at repo root; use recursive to ignore artifacts anywhere.

-        "*.min.js",
-        "*.min.css",
-        "*.map"
+        "**/*.min.js",
+        "**/*.min.css",
+        "**/*.map"
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5fe4269 and 8a35e2e.

📒 Files selected for processing (1)
  • cspell.json (1 hunks)
🔇 Additional comments (1)
cspell.json (1)

3-7: No drift in spell-check globs: both spell-check and spell-check:fix invoke cspell without overriding paths, so cspell.json’s files filter applies consistently.

@jamesbhobbs jamesbhobbs marked this pull request as ready for review October 14, 2025 17:44
@@ -0,0 +1,54 @@
{
"version": "0.2",
"files": [
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Pls check if we should add to here when reviewing

Copy link
Member

Choose a reason for hiding this comment

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

I would add src/webviews/** and package.json

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8a35e2e and a3c409b.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: jamesbhobbs
PR: deepnote/deepnote#1
File: package.json:24-28
Timestamp: 2025-09-30T13:33:12.669Z
Learning: In the deepnote repository, do not suggest adding spell-check to lint-staged pre-commit hooks due to performance concerns. Spell-check runs in CI instead.
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build & Test
  • GitHub Check: copilot-setup-steps

Comment on lines +175 to +186
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
cache: 'npm'
node-version: ${{ env.NODE_VERSION }}
registry-url: 'https://npm.pkg.github.com'
scope: '@deepnote'

- name: Install dependencies
run: npm ci --prefer-offline --no-audit
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 | 🟠 Major

Re-pin GitHub Actions to SHAs.

Every other job pins actions/checkout and actions/setup-node to vetted SHAs; this job drops back to floating @v5, undermining the supply-chain hardening we already enforce. Please use the same commit SHAs as the rest of the workflow.

-      - name: Checkout
-        uses: actions/checkout@v5
+      - name: Checkout
+        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
@@
-      - name: Setup Node.js
-        uses: actions/setup-node@v5
+      - name: Setup Node.js
+        uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5

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

🤖 Prompt for AI Agents
.github/workflows/ci.yml lines 175-186: the job uses floating action tags
actions/checkout@v5 and actions/setup-node@v5 which weakens the repository's
supply-chain hardening; replace both with the exact commit SHAs used elsewhere
in this workflow (or the vetted SHAs used in other jobs) so they are pinned to
specific commits, i.e. locate the SHA entries for actions/checkout and
actions/setup-node in the other jobs and substitute @v5 with the corresponding
@<full-commit-sha> for each action.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8a35e2e and a3c409b.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: copilot-setup-steps

Comment on lines +175 to +188
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
cache: 'npm'
node-version: ${{ env.NODE_VERSION }}
registry-url: 'https://npm.pkg.github.com'
scope: '@deepnote'

- name: Install dependencies
run: npm ci --prefer-offline --no-audit
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
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 | 🟠 Major

Pin actions to commit SHAs.
Other jobs lock actions/checkout and actions/setup-node to specific SHAs; this job floats on the v5 tag, reopening a supply-chain risk. Please pin both actions to the same commits used elsewhere in the workflow.

-      - name: Checkout
-        uses: actions/checkout@v5
+      - name: Checkout
+        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
@@
-      - name: Setup Node.js
-        uses: actions/setup-node@v5
+      - name: Setup Node.js
+        uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5

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

🤖 Prompt for AI Agents
.github/workflows/ci.yml lines 175-188: the workflow uses floating tags for
actions/checkout@v5 and actions/setup-node@v5; replace both with the exact
commit SHAs used by the other jobs in this workflow (match the same commit SHAs
already pinned elsewhere) to eliminate the supply-chain risk — update the two
"uses:" lines to reference the exact SHA commits, run a quick lint/test of the
workflow, and commit the change.

- Resolves lockfile sync issue reported by user
- Brings in new features: dataframe renderer, vega charts, SQL integration
- Updates dependencies: @deepnote/blocks v1.2.0, react-vega, tailwindcss, etc.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 20

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (23)
src/notebooks/deepnote/deepnoteSerializer.ts (2)

84-89: Use typed error classes and ILogger service.

Guidelines require:

  • ILogger service instead of console.error
  • Typed error classes from src/platform/errors/

As per coding guidelines.


151-155: Use typed error classes and ILogger service.

Guidelines require:

  • ILogger service instead of console.error
  • Typed error classes from src/platform/errors/

As per coding guidelines.

src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts (1)

80-90: Replace hardcoded strings with l10n.t() calls.

User-facing strings must use localization per coding guidelines. These prompts appear in modal dialogs.

As per coding guidelines.

-                    const yes = 'Yes';
-                    const no = 'No';
-                    const dontAskAgain = "Don't Ask Again";
+                    const yes = l10n.t('Yes');
+                    const no = l10n.t('No');
+                    const dontAskAgain = l10n.t("Don't Ask Again");
 
                     const response = await window.showWarningMessage(
-                        `A requirements.txt file already exists in this workspace. Do you want to override it with requirements from your Deepnote project?`,
+                        l10n.t('A requirements.txt file already exists in this workspace. Do you want to override it with requirements from your Deepnote project?'),
                         { modal: true },
build/esbuild/build.ts (6)

183-186: Bug: externals mutated globally across builds.

Pushing into common/web externals mutates shared arrays, causing cross-build leakage.

-    const external = target === 'web' ? webExternals : commonExternals;
-    if (source.toLowerCase().endsWith('extension.node.ts')) {
-        external.push(...desktopExternals);
-    }
+    const externalBase = target === 'web' ? webExternals : commonExternals;
+    const external = [...externalBase];
+    if (source.toLowerCase().endsWith('extension.node.ts')) {
+        external.push(...desktopExternals);
+    }

56-56: webExternals duplicates commonExternals.

Simplify and avoid dupes.

-const webExternals = commonExternals.concat('os').concat(commonExternals);
+const webExternals = [...commonExternals, 'os'];

18-34: Duplicate dependency entry ("fontkit").

Listed twice; keep one.

 const deskTopNodeModulesToExternalize = [
     'pdfkit/js/pdfkit.standalone',
     'crypto-js',
-    'fontkit',
     'png-js',
     'zeromq', // Copy, do not bundle
     'zeromqold', // Copy, do not bundle
@@
-    // Its loaded by ivonv-lite, & since that is lazy loaded
+    // Its loaded by iconv-lite, & since that is lazy loaded
     // there's no need to include into the main bundle.
-    'fontkit',
+    'fontkit',

16-31: Fix typos in comments.

Minor polish.

-// In desktop, we will bundle/copye each of these separately into the node_modules folder.
+// In desktop, we will bundle/copy each of these separately into the node_modules folder.
@@
-// Its loaded by ivonv-lite, & since that is lazy loaded
+// Its loaded by iconv-lite, & since that is lazy loaded

432-446: Prefer resolving by package id for robustness.

require.resolve on an absolute dir can be brittle; resolve the package entry directly.

-    const fullPath = require.resolve(source);
+    const fullPath = require.resolve('vscode-jsonrpc');

497-498: Remove unused variable.

started is never used.

-const started = Date.now();
src/notebooks/deepnote/deepnoteExplorerView.ts (2)

92-93: Localize all user-facing strings.

Wrap showError/Info/Warning messages with l10n.t and use placeholders.

- await window.showErrorMessage(`Failed to open notebook: ${errorMessage}`);
+ await window.showErrorMessage(l10n.t('Failed to open notebook: {0}', errorMessage));

- await window.showInformationMessage('No active Deepnote notebook found.');
+ await window.showInformationMessage(l10n.t('No active Deepnote notebook found.'));

- await window.showWarningMessage('Cannot reveal notebook: missing metadata.');
+ await window.showWarningMessage(l10n.t('Cannot reveal notebook: missing metadata.'));

- await window.showInformationMessage(
-   `Active notebook: ${notebookMetadata?.deepnoteNotebookName || 'Untitled'} in project ${
-       notebookMetadata?.deepnoteProjectName || 'Untitled'
-   }`
- );
+ await window.showInformationMessage(
+   l10n.t('Active notebook: {0} in project {1}',
+     notebookMetadata?.deepnoteNotebookName || l10n.t('Untitled'),
+     notebookMetadata?.deepnoteProjectName || l10n.t('Untitled'))
+);

Also applies to: 113-116, 123-141, 145-149


62-89: Add ILogger injection and replace all console calls; redact IDs and localize error messages.

File requires:

  • Import ILogger from ../../platform/logging/types
  • Inject via @inject(ILogger) private readonly logger: ILogger
  • Replace 4 console.log calls in openNotebook() (lines 61, 75, 79, 83) with this.logger.debug(), redacting IDs via .slice(0,8)
  • Replace console.error in revealActiveNotebook() (line 142) with this.logger.error()
  • Wrap error message at line 88 with l10n.t()
src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts (4)

78-85: Test description mismatches implementation.

Code adds a query to URI; it’s not a “base file URI without fragments.” Rename the test to reflect query usage.

- test('should use base file URI without fragments', async () => {
+ test('should use file URI with query to disambiguate notebooks', async () => {

93-101: Use enum values, not strings, for item types.

Import DeepnoteTreeItemType and use its members; string literals can bypass branches and weaken tests.

-import type { DeepnoteTreeItemContext } from './deepnoteTreeItem';
+import type { DeepnoteTreeItemContext } from './deepnoteTreeItem';
+import { DeepnoteTreeItemType } from './deepnoteTreeItem';

-const mockTreeItem = { type: 'notebook', context: { filePath: '/test/path' } } as any;
+const mockTreeItem = { type: DeepnoteTreeItemType.Notebook, context: { filePath: '/test/path' } } as any;

-const mockTreeItem = { type: 'ProjectFile', context: { filePath: '/test/path/project.deepnote' } } as any;
+const mockTreeItem = { type: DeepnoteTreeItemType.ProjectFile, context: { filePath: '/test/path/project.deepnote' } } as any;

If enum member for “notebook” differs, adjust accordingly.

Also applies to: 108-116


167-177: Remove stale serializer reference.

explorerView has no serializer; this assertion misleads and can mask issues.

- const hasSerializer = (explorerView as any).serializer !== undefined;
- assert.isTrue(hasTreeDataProvider || hasSerializer, 'Components are being initialized');
+ assert.isTrue(hasTreeDataProvider, 'Components are being initialized');

34-46: Stub the window.createTreeView() dependency instead of catching errors.

The activate() method depends on VS Code's window API. Rather than wrapping in try-catch, mock this dependency at the module level or inject it via the test setup.

Example approach:

  • Use sinon.stub(vscode.window, 'createTreeView') in test setup
  • Or provide a test mock that implements the required vscode module exports
  • Verify the method called the API with correct arguments rather than verifying no error was thrown

Lines 34–46 should assert specific behavior, not just catch exceptions.

src/notebooks/deepnote/pocket.unit.test.ts (1)

182-189: Add a test for markup default type.

Ensure createBlockFromPocket defaults to 'markdown' for markup cells with no pocket.

+        test('uses markdown type for markup cells when no pocket exists', () => {
+            const cell = new NotebookCellData(NotebookCellKind.Markup, '# Title', 'markdown');
+            const block = createBlockFromPocket(cell, 0);
+            assert.strictEqual(block.type, 'markdown');
+        });
src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts (2)

150-172: Add ordering test by sortingKey.

JSDoc promises sorting; assert that output order follows sortingKey when input is unsorted.

+        test('orders cells by sortingKey when converting blocks', () => {
+            const blocks: DeepnoteBlock[] = [
+                { id: 'b', type: 'code', content: '2', sortingKey: 'a1', blockGroup: 'g' },
+                { id: 'a', type: 'code', content: '1', sortingKey: 'a0', blockGroup: 'g' }
+            ] as any;
+            const cells = converter.convertBlocksToCells(blocks);
+            assert.strictEqual(cells[0].value, '1');
+            assert.strictEqual(cells[1].value, '2');
+        });

263-299: Add image output tests to catch base64 encode/decode issues.

Covers PNG/JPEG paths and prevents regressions in binary handling.

src/notebooks/deepnote/pocket.ts (1)

18-40: Merging existing pockets.

addPocketToCellMetadata overwrites any pre-existing __deepnotePocket. If callers may set it earlier, consider shallow-merging instead.

-    cell.metadata = {
-        ...src,
-        __deepnotePocket: pocket
-    };
+    cell.metadata = {
+        ...src,
+        __deepnotePocket: { ...(src.__deepnotePocket as object | undefined), ...pocket }
+    };
src/notebooks/deepnote/deepnoteDataConverter.ts (4)

90-99: Replace atob/btoa; these aren’t available in Node/VS Code EH and are slow for large data.

Use Buffer for base64 encode/decode; avoid spread on large arrays.

-  private base64ToUint8Array(base64: string): Uint8Array {
-      const binaryString = atob(base64);
-      const bytes = new Uint8Array(binaryString.length);
-      for (let i = 0; i < binaryString.length; i++) {
-          bytes[i] = binaryString.charCodeAt(i);
-      }
-      return bytes;
-  }
+  private base64ToUint8Array(base64: string): Uint8Array {
+      return Uint8Array.from(Buffer.from(base64, 'base64'));
+  }
...
-                    data['image/png'] = btoa(String.fromCharCode(...new Uint8Array(item.data)));
+                    data['image/png'] = Buffer.from(item.data).toString('base64');
...
-                    data['image/jpeg'] = btoa(String.fromCharCode(...new Uint8Array(item.data)));
+                    data['image/jpeg'] = Buffer.from(item.data).toString('base64');

Verification:

#!/bin/bash
rg -nP '\b(atob|btoa)\s*\('

Also applies to: 173-178


24-31: Either sort blocks or update JSDoc.

JSDoc claims sorting by sortingKey; implement it or fix the comment.

-  convertBlocksToCells(blocks: DeepnoteBlock[]): NotebookCellData[] {
-      return blocks.map((block) => {
+  convertBlocksToCells(blocks: DeepnoteBlock[]): NotebookCellData[] {
+      const sorted = blocks.slice().sort((a, b) => (a.sortingKey || '').localeCompare(b.sortingKey || ''));
+      return sorted.map((block) => {

111-121: Align fallback cell metadata with pocket mechanism.

Use the same pocket fields for consistency; optional but reduces special cases.

-  private createFallbackCell(block: DeepnoteBlock): NotebookCellData {
-      const cell = new NotebookCellData(NotebookCellKind.Markup, block.content || '', 'markdown');
-      cell.metadata = {
-          deepnoteBlockId: block.id,
-          deepnoteBlockType: block.type,
-          deepnoteSortingKey: block.sortingKey,
-          deepnoteMetadata: block.metadata
-      };
-      return cell;
-  }
+  private createFallbackCell(block: DeepnoteBlock): NotebookCellData {
+      const cell = new NotebookCellData(NotebookCellKind.Markup, block.content || '', 'markdown');
+      cell.metadata = {
+          id: block.id,
+          type: block.type,
+          sortingKey: block.sortingKey,
+          ...(block.metadata ?? {})
+      };
+      addPocketToCellMetadata(cell);
+      return cell;
+  }

205-321: Minor: reuse encoders/decoders to reduce churn.

Cache TextEncoder/TextDecoder or use NotebookCellOutputItem helpers consistently. Non-blocking.

♻️ Duplicate comments (2)
package.json (1)

2058-2060: Prior review comments remain unresolved.

Past comments flagged:

  1. Critical: Missing package-lock.json update blocks CI
  2. Major: Spell-check scripts lack cache/determinism
  3. Major (resolved by maintainer): License exclusion rationale

Address the lockfile issue before merging.

.github/workflows/ci.yml (1)

175-178: Pin actions to commit SHAs.

Past comments already flagged: floating @v5 tags weaken supply-chain security. Use the same pinned SHAs as other jobs (e.g., actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8).

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fda0a3f and 3f9173b.

⛔ Files ignored due to path filters (2)
  • package-lock.json is excluded by !**/package-lock.json
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (71)
  • .github/workflows/ci.yml (1 hunks)
  • .gitignore (1 hunks)
  • .husky/post-checkout (0 hunks)
  • .husky/pre-commit (1 hunks)
  • .husky/pre-push (0 hunks)
  • build/esbuild/build.ts (2 hunks)
  • package.json (6 hunks)
  • package.nls.json (0 hunks)
  • postcss.config.js (0 hunks)
  • src/kernels/deepnote/deepnoteToolkitInstaller.node.ts (2 hunks)
  • src/kernels/execution/cellExecution.ts (0 hunks)
  • src/kernels/execution/cellExecutionCreator.ts (3 hunks)
  • src/kernels/execution/cellExecutionCreator.unit.test.ts (0 hunks)
  • src/kernels/execution/cellExecutionMessageHandler.ts (3 hunks)
  • src/kernels/execution/helpers.ts (9 hunks)
  • src/messageTypes.ts (0 hunks)
  • src/notebooks/deepnote/blocks.md (0 hunks)
  • src/notebooks/deepnote/converters/sqlBlockConverter.ts (0 hunks)
  • src/notebooks/deepnote/converters/sqlBlockConverter.unit.test.ts (0 hunks)
  • src/notebooks/deepnote/converters/visualizationBlockConverter.ts (0 hunks)
  • src/notebooks/deepnote/converters/visualizationBlockConverter.unit.test.ts (0 hunks)
  • src/notebooks/deepnote/deepnoteActivationService.ts (1 hunks)
  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts (3 hunks)
  • src/notebooks/deepnote/deepnoteDataConverter.ts (10 hunks)
  • src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts (3 hunks)
  • src/notebooks/deepnote/deepnoteExplorerView.ts (1 hunks)
  • src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts (1 hunks)
  • src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts (3 hunks)
  • src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts (16 hunks)
  • src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts (5 hunks)
  • src/notebooks/deepnote/deepnoteSerializer.ts (5 hunks)
  • src/notebooks/deepnote/integrations/integrationDetector.ts (0 hunks)
  • src/notebooks/deepnote/integrations/integrationManager.ts (0 hunks)
  • src/notebooks/deepnote/integrations/integrationStorage.ts (0 hunks)
  • src/notebooks/deepnote/integrations/integrationTypes.ts (0 hunks)
  • src/notebooks/deepnote/integrations/integrationUtils.ts (0 hunks)
  • src/notebooks/deepnote/integrations/integrationWebview.ts (0 hunks)
  • src/notebooks/deepnote/integrations/types.ts (0 hunks)
  • src/notebooks/deepnote/pocket.ts (3 hunks)
  • src/notebooks/deepnote/pocket.unit.test.ts (7 hunks)
  • src/notebooks/deepnote/serialization.md (1 hunks)
  • src/notebooks/serviceRegistry.node.ts (0 hunks)
  • src/notebooks/serviceRegistry.web.ts (0 hunks)
  • src/notebooks/types.ts (1 hunks)
  • src/platform/common/constants.ts (0 hunks)
  • src/platform/common/utils/localize.ts (0 hunks)
  • src/platform/webviews/webviewHost.ts (1 hunks)
  • src/standalone/intellisense/resolveCompletionItem.unit.test.ts (1 hunks)
  • src/test/vscode-mock.ts (0 hunks)
  • src/webviews/extension-side/dataframe/dataframeController.ts (0 hunks)
  • src/webviews/extension-side/dataframe/dataframeController.unit.test.ts (0 hunks)
  • src/webviews/extension-side/serviceRegistry.node.ts (0 hunks)
  • src/webviews/extension-side/serviceRegistry.web.ts (0 hunks)
  • src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx (0 hunks)
  • src/webviews/webview-side/dataframe-renderer/index.ts (0 hunks)
  • src/webviews/webview-side/dataframe-renderer/tailwind.css (0 hunks)
  • src/webviews/webview-side/integrations/BigQueryForm.tsx (0 hunks)
  • src/webviews/webview-side/integrations/ConfigurationForm.tsx (0 hunks)
  • src/webviews/webview-side/integrations/IntegrationItem.tsx (0 hunks)
  • src/webviews/webview-side/integrations/IntegrationList.tsx (0 hunks)
  • src/webviews/webview-side/integrations/IntegrationPanel.tsx (0 hunks)
  • src/webviews/webview-side/integrations/PostgresForm.tsx (0 hunks)
  • src/webviews/webview-side/integrations/index.html (0 hunks)
  • src/webviews/webview-side/integrations/index.tsx (0 hunks)
  • src/webviews/webview-side/integrations/integrations.css (0 hunks)
  • src/webviews/webview-side/integrations/types.ts (0 hunks)
  • src/webviews/webview-side/vega-renderer/VegaRenderer.tsx (0 hunks)
  • src/webviews/webview-side/vega-renderer/colors.ts (0 hunks)
  • src/webviews/webview-side/vega-renderer/index.ts (0 hunks)
  • src/webviews/webview-side/vega-renderer/number-formats.ts (0 hunks)
  • tailwind.config.js (0 hunks)
💤 Files with no reviewable changes (46)
  • src/platform/common/constants.ts
  • package.nls.json
  • src/notebooks/deepnote/blocks.md
  • src/notebooks/deepnote/integrations/integrationTypes.ts
  • src/webviews/webview-side/integrations/BigQueryForm.tsx
  • src/notebooks/serviceRegistry.node.ts
  • src/notebooks/deepnote/converters/sqlBlockConverter.ts
  • src/webviews/webview-side/vega-renderer/VegaRenderer.tsx
  • src/notebooks/deepnote/integrations/integrationManager.ts
  • src/webviews/webview-side/integrations/ConfigurationForm.tsx
  • src/notebooks/deepnote/integrations/integrationDetector.ts
  • src/test/vscode-mock.ts
  • src/notebooks/deepnote/integrations/integrationStorage.ts
  • src/notebooks/deepnote/integrations/types.ts
  • src/webviews/extension-side/serviceRegistry.node.ts
  • src/webviews/webview-side/integrations/IntegrationItem.tsx
  • src/messageTypes.ts
  • src/kernels/execution/cellExecutionCreator.unit.test.ts
  • src/webviews/webview-side/integrations/index.html
  • .husky/pre-push
  • src/notebooks/deepnote/converters/visualizationBlockConverter.ts
  • src/webviews/webview-side/integrations/IntegrationList.tsx
  • src/webviews/webview-side/integrations/integrations.css
  • src/webviews/webview-side/vega-renderer/colors.ts
  • src/webviews/webview-side/vega-renderer/number-formats.ts
  • src/webviews/webview-side/integrations/types.ts
  • src/notebooks/deepnote/integrations/integrationWebview.ts
  • src/webviews/extension-side/dataframe/dataframeController.unit.test.ts
  • tailwind.config.js
  • src/notebooks/serviceRegistry.web.ts
  • src/platform/common/utils/localize.ts
  • src/webviews/extension-side/serviceRegistry.web.ts
  • src/webviews/webview-side/integrations/PostgresForm.tsx
  • src/webviews/webview-side/dataframe-renderer/DataframeRenderer.tsx
  • .husky/post-checkout
  • src/webviews/webview-side/integrations/index.tsx
  • src/webviews/extension-side/dataframe/dataframeController.ts
  • src/notebooks/deepnote/converters/visualizationBlockConverter.unit.test.ts
  • postcss.config.js
  • src/webviews/webview-side/integrations/IntegrationPanel.tsx
  • src/webviews/webview-side/vega-renderer/index.ts
  • src/webviews/webview-side/dataframe-renderer/tailwind.css
  • src/kernels/execution/cellExecution.ts
  • src/notebooks/deepnote/integrations/integrationUtils.ts
  • src/notebooks/deepnote/converters/sqlBlockConverter.unit.test.ts
  • src/webviews/webview-side/dataframe-renderer/index.ts
🧰 Additional context used
📓 Path-based instructions (12)
**/!(*.node|*.web).ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Place shared cross-platform logic in common .ts files (not suffixed with .node or .web)

Files:

  • src/platform/webviews/webviewHost.ts
  • src/standalone/intellisense/resolveCompletionItem.unit.test.ts
  • src/notebooks/deepnote/deepnoteSerializer.ts
  • src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts
  • src/notebooks/deepnote/pocket.ts
  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • build/esbuild/build.ts
  • src/notebooks/deepnote/deepnoteExplorerView.ts
  • src/notebooks/types.ts
  • src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts
  • src/notebooks/deepnote/deepnoteActivationService.ts
  • src/notebooks/deepnote/deepnoteDataConverter.ts
  • src/kernels/execution/helpers.ts
  • src/kernels/execution/cellExecutionCreator.ts
  • src/kernels/execution/cellExecutionMessageHandler.ts
  • src/notebooks/deepnote/pocket.unit.test.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.{ts,tsx}: Inject interfaces, not concrete classes
Avoid circular dependencies
Use l10n.t() for user-facing strings
Use typed error classes from src/platform/errors/ when throwing or handling errors
Use the ILogger service instead of console.log
Preserve error details while scrubbing PII in messages and telemetry
Include the Microsoft copyright header in source files
Prefer async/await and handle cancellation with CancellationToken

**/*.{ts,tsx}: Order class members (methods, fields, properties) first by accessibility (public/protected/private) and then alphabetically
Do not add the Microsoft copyright header to new files
Use Uri.joinPath() to construct file paths instead of manual string concatenation
Add a blank line after groups of const declarations and before return statements for readability
Separate third-party imports from local file imports

Files:

  • src/platform/webviews/webviewHost.ts
  • src/standalone/intellisense/resolveCompletionItem.unit.test.ts
  • src/notebooks/deepnote/deepnoteSerializer.ts
  • src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts
  • src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts
  • src/notebooks/deepnote/pocket.ts
  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • build/esbuild/build.ts
  • src/notebooks/deepnote/deepnoteExplorerView.ts
  • src/notebooks/types.ts
  • src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts
  • src/kernels/deepnote/deepnoteToolkitInstaller.node.ts
  • src/notebooks/deepnote/deepnoteActivationService.ts
  • src/notebooks/deepnote/deepnoteDataConverter.ts
  • src/kernels/execution/helpers.ts
  • src/kernels/execution/cellExecutionCreator.ts
  • src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts
  • src/kernels/execution/cellExecutionMessageHandler.ts
  • src/notebooks/deepnote/pocket.unit.test.ts
  • src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts
src/platform/**/*.ts

📄 CodeRabbit inference engine (.github/instructions/platform.instructions.md)

src/platform/**/*.ts: Use Inversify decorators for DI: annotate classes with @Injectable() and inject dependencies with @Inject(Token)
Use the centralized logger (import { logger } from '../platform/logging') instead of console.log for application logging

Files:

  • src/platform/webviews/webviewHost.ts
**/*.unit.test.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Place unit tests in files matching *.unit.test.ts

**/*.unit.test.ts: Unit tests must use Mocha/Chai and have the .unit.test.ts extension
Place unit test files alongside the source files they test
Use assert.deepStrictEqual() for object comparisons in tests instead of checking individual properties

Files:

  • src/standalone/intellisense/resolveCompletionItem.unit.test.ts
  • src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts
  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts
  • src/notebooks/deepnote/pocket.unit.test.ts
**/*.{test,spec}.ts

📄 CodeRabbit inference engine (.github/instructions/typescript.instructions.md)

In unit tests, when a mock is returned from a promise, ensure the mocked instance has an undefined then property to avoid hanging tests

Files:

  • src/standalone/intellisense/resolveCompletionItem.unit.test.ts
  • src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts
  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts
  • src/notebooks/deepnote/pocket.unit.test.ts
src/notebooks/deepnote/**

📄 CodeRabbit inference engine (CLAUDE.md)

Deepnote integration code resides under src/notebooks/deepnote/

Files:

  • src/notebooks/deepnote/deepnoteSerializer.ts
  • src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts
  • src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts
  • src/notebooks/deepnote/serialization.md
  • src/notebooks/deepnote/pocket.ts
  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • src/notebooks/deepnote/deepnoteExplorerView.ts
  • src/notebooks/deepnote/deepnoteDataConverter.unit.test.ts
  • src/notebooks/deepnote/deepnoteActivationService.ts
  • src/notebooks/deepnote/deepnoteDataConverter.ts
  • src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts
  • src/notebooks/deepnote/pocket.unit.test.ts
  • src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts
src/notebooks/deepnote/deepnoteSerializer.ts

📄 CodeRabbit inference engine (CLAUDE.md)

deepnoteSerializer.ts is the main serializer orchestrating Deepnote integration

Files:

  • src/notebooks/deepnote/deepnoteSerializer.ts
**/*.node.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Use *.node.ts for Desktop-specific implementations that require full file system access and Python environments

Files:

  • src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts
  • src/kernels/deepnote/deepnoteToolkitInstaller.node.ts
  • src/notebooks/deepnote/deepnoteRequirementsHelper.node.ts
  • src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts
src/kernels/**/*.ts

📄 CodeRabbit inference engine (.github/instructions/kernel.instructions.md)

src/kernels/**/*.ts: Use event-driven updates (EventEmitter) for state changes
Monitor and dispose pending promises to prevent leaks during teardown
Use WeakRef/weak references for notebook/object backreferences to avoid memory leaks
Respect CancellationToken in all async operations

Files:

  • src/kernels/deepnote/deepnoteToolkitInstaller.node.ts
  • src/kernels/execution/helpers.ts
  • src/kernels/execution/cellExecutionCreator.ts
  • src/kernels/execution/cellExecutionMessageHandler.ts
src/notebooks/deepnote/deepnoteActivationService.ts

📄 CodeRabbit inference engine (CLAUDE.md)

deepnoteActivationService.ts manages VS Code activation for Deepnote

Files:

  • src/notebooks/deepnote/deepnoteActivationService.ts
src/notebooks/deepnote/deepnoteDataConverter.ts

📄 CodeRabbit inference engine (CLAUDE.md)

deepnoteDataConverter.ts performs Deepnote data transformations

Files:

  • src/notebooks/deepnote/deepnoteDataConverter.ts
src/kernels/execution/**/*.ts

📄 CodeRabbit inference engine (.github/instructions/kernel.instructions.md)

Notebook-level execution must enqueue cells via CellExecutionQueue and manage per-cell lifecycles through CellExecution

Files:

  • src/kernels/execution/helpers.ts
  • src/kernels/execution/cellExecutionCreator.ts
  • src/kernels/execution/cellExecutionMessageHandler.ts
🧠 Learnings (18)
📓 Common learnings
Learnt from: jamesbhobbs
PR: deepnote/deepnote#1
File: package.json:24-28
Timestamp: 2025-09-30T13:33:12.669Z
Learning: In the deepnote repository, do not suggest adding spell-check to lint-staged pre-commit hooks due to performance concerns. Spell-check runs in CI instead.
📚 Learning: 2025-10-09T11:21:57.494Z
Learnt from: CR
PR: deepnote/vscode-deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-09T11:21:57.494Z
Learning: Applies to src/notebooks/deepnote/deepnoteSerializer.ts : deepnoteSerializer.ts is the main serializer orchestrating Deepnote integration

Applied to files:

  • src/notebooks/deepnote/deepnoteSerializer.ts
  • src/notebooks/deepnote/serialization.md
  • src/notebooks/deepnote/deepnoteActivationService.ts
📚 Learning: 2025-10-09T11:21:57.494Z
Learnt from: CR
PR: deepnote/vscode-deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-09T11:21:57.494Z
Learning: Applies to src/notebooks/deepnote/deepnoteNotebookManager.ts : deepnoteNotebookManager.ts handles Deepnote notebook state management

Applied to files:

  • src/notebooks/deepnote/deepnoteSerializer.ts
  • src/notebooks/deepnote/deepnoteExplorerView.ts
  • src/notebooks/types.ts
  • src/notebooks/deepnote/deepnoteActivationService.ts
  • src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts
📚 Learning: 2025-10-09T11:21:57.494Z
Learnt from: CR
PR: deepnote/vscode-deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-09T11:21:57.494Z
Learning: Applies to src/notebooks/deepnote/deepnoteActivationService.ts : deepnoteActivationService.ts manages VS Code activation for Deepnote

Applied to files:

  • src/notebooks/deepnote/deepnoteSerializer.ts
  • src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts
  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • src/kernels/deepnote/deepnoteToolkitInstaller.node.ts
  • src/notebooks/deepnote/deepnoteActivationService.ts
  • src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts
📚 Learning: 2025-10-09T11:21:57.494Z
Learnt from: CR
PR: deepnote/vscode-deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-09T11:21:57.494Z
Learning: Applies to src/notebooks/deepnote/deepnoteDataConverter.ts : deepnoteDataConverter.ts performs Deepnote data transformations

Applied to files:

  • src/notebooks/deepnote/deepnoteSerializer.ts
  • src/notebooks/deepnote/deepnoteDataConverter.ts
📚 Learning: 2025-09-03T12:54:35.368Z
Learnt from: CR
PR: deepnote/vscode-extension#0
File: .github/instructions/interactiveWindow.instructions.md:0-0
Timestamp: 2025-09-03T12:54:35.368Z
Learning: Applies to src/interactive-window/{interactiveWindow.ts,interactiveWindowController.ts} : Implement robust kernel error handling: automatic restart, clear error display in system info cells, graceful degradation when kernels are unavailable, and user notifications for critical failures

Applied to files:

  • src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts
📚 Learning: 2025-10-14T13:43:36.364Z
Learnt from: CR
PR: deepnote/deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-14T13:43:36.364Z
Learning: Applies to packages/*/src/**/*.test.{ts,tsx} : Import { describe, expect, it } from 'vitest' in tests

Applied to files:

  • src/notebooks/deepnote/deepnoteExplorerView.unit.test.ts
📚 Learning: 2025-10-09T11:21:57.494Z
Learnt from: CR
PR: deepnote/vscode-deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-09T11:21:57.494Z
Learning: Applies to src/notebooks/deepnote/deepnoteTypes.ts : deepnoteTypes.ts contains Deepnote-related type definitions

Applied to files:

  • src/notebooks/deepnote/pocket.ts
  • src/notebooks/types.ts
📚 Learning: 2025-09-12T07:58:04.493Z
Learnt from: Artmann
PR: deepnote/vscode-deepnote#12
File: src/notebooks/deepnote/deepnoteActivationService.unit.test.ts:31-45
Timestamp: 2025-09-12T07:58:04.493Z
Learning: In src/notebooks/deepnote/deepnoteActivationService.ts, the activate() method is synchronous with signature `public activate()` and returns void. It should be called without await in tests.

Applied to files:

  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • src/notebooks/deepnote/deepnoteActivationService.ts
📚 Learning: 2025-09-12T07:58:04.493Z
Learnt from: Artmann
PR: deepnote/vscode-deepnote#12
File: src/notebooks/deepnote/deepnoteActivationService.unit.test.ts:31-45
Timestamp: 2025-09-12T07:58:04.493Z
Learning: In src/notebooks/deepnote/deepnoteActivationService.ts, the activate() method is synchronous and returns void, not a Promise. It should be called without await in tests.

Applied to files:

  • src/notebooks/deepnote/deepnoteActivationService.unit.test.ts
  • src/notebooks/deepnote/deepnoteActivationService.ts
📚 Learning: 2025-09-03T13:01:49.096Z
Learnt from: CR
PR: deepnote/vscode-extension#0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-09-03T13:01:49.096Z
Learning: Use `npm run format` to check code style

Applied to files:

  • .husky/pre-commit
📚 Learning: 2025-09-03T12:53:28.421Z
Learnt from: CR
PR: deepnote/vscode-extension#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-09-03T12:53:28.421Z
Learning: Run `npm run format-fix` before committing any changes

Applied to files:

  • .husky/pre-commit
📚 Learning: 2025-09-03T13:01:49.096Z
Learnt from: CR
PR: deepnote/vscode-extension#0
File: .github/instructions/typescript.instructions.md:0-0
Timestamp: 2025-09-03T13:01:49.096Z
Learning: ALWAYS run `npm run format-fix` before committing changes

Applied to files:

  • .husky/pre-commit
📚 Learning: 2025-10-07T19:51:40.201Z
Learnt from: m1so
PR: deepnote/vscode-deepnote#25
File: src/kernels/deepnote/deepnoteServerStarter.node.ts:150-154
Timestamp: 2025-10-07T19:51:40.201Z
Learning: The deepnote-toolkit server is a separate Python package maintained in a different repository from the VS Code extension (vscode-deepnote). The VS Code extension launches the toolkit as a subprocess and communicates via environment variables and HTTP. The toolkit implementation cannot be verified from the extension codebase.

Applied to files:

  • src/kernels/deepnote/deepnoteToolkitInstaller.node.ts
📚 Learning: 2025-09-03T12:59:14.489Z
Learnt from: CR
PR: deepnote/vscode-extension#0
File: .github/instructions/notebooks.instructions.md:0-0
Timestamp: 2025-09-03T12:59:14.489Z
Learning: Applies to src/notebooks/export/**/*.ts : Update FileConverter to handle the new export format

Applied to files:

  • src/notebooks/deepnote/deepnoteDataConverter.ts
📚 Learning: 2025-09-03T12:58:18.091Z
Learnt from: CR
PR: deepnote/vscode-extension#0
File: .github/instructions/kernel.instructions.md:0-0
Timestamp: 2025-09-03T12:58:18.091Z
Learning: Applies to src/kernels/execution/CellExecutionMessageHandler.ts : CellExecutionMessageHandler must process kernel messages (iopub, execute_reply) and update VS Code cell outputs

Applied to files:

  • src/kernels/execution/cellExecutionMessageHandler.ts
📚 Learning: 2025-10-09T11:21:57.494Z
Learnt from: CR
PR: deepnote/vscode-deepnote#0
File: CLAUDE.md:0-0
Timestamp: 2025-10-09T11:21:57.494Z
Learning: Use dependency injection with inversify

Applied to files:

  • src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts
📚 Learning: 2025-09-30T13:33:12.669Z
Learnt from: jamesbhobbs
PR: deepnote/deepnote#1
File: package.json:24-28
Timestamp: 2025-09-30T13:33:12.669Z
Learning: In the deepnote repository, do not suggest adding spell-check to lint-staged pre-commit hooks due to performance concerns. Spell-check runs in CI instead.

Applied to files:

  • package.json
🧬 Code graph analysis (8)
src/standalone/intellisense/resolveCompletionItem.unit.test.ts (1)
src/kernels/execution/helpers.ts (1)
  • cellOutputToVSCCellOutput (129-163)
src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts (1)
src/platform/logging/index.ts (1)
  • logger (35-48)
src/notebooks/deepnote/pocket.ts (2)
src/notebooks/deepnote/deepnoteTypes.ts (1)
  • DeepnoteOutput (23-51)
src/notebooks/deepnote/dataConversionUtils.ts (1)
  • generateBlockId (8-15)
src/notebooks/deepnote/deepnoteDataConverter.ts (4)
src/notebooks/deepnote/converters/markdownBlockConverter.ts (1)
  • MarkdownBlockConverter (6-24)
src/notebooks/deepnote/pocket.ts (2)
  • addPocketToCellMetadata (18-40)
  • createBlockFromPocket (46-78)
src/test/mocks/vsc/extHostedTypes.ts (3)
  • NotebookCellData (2523-2549)
  • NotebookCellOutput (71-103)
  • NotebookCellOutputItem (16-69)
src/notebooks/deepnote/deepnoteTypes.ts (2)
  • DeepnoteBlock (6-6)
  • DeepnoteOutput (23-51)
src/kernels/execution/helpers.ts (1)
src/test/mocks/vsc/extHostedTypes.ts (2)
  • NotebookCellOutput (71-103)
  • NotebookCellOutputItem (16-69)
src/kernels/execution/cellExecutionCreator.ts (3)
src/platform/logging/index.ts (1)
  • logger (35-48)
src/platform/common/utils/misc.ts (1)
  • noop (11-11)
src/notebooks/controllers/notebookIPyWidgetCoordinator.ts (1)
  • controller (27-32)
src/kernels/execution/cellExecutionMessageHandler.ts (2)
src/kernels/execution/helpers.ts (1)
  • cellOutputToVSCCellOutput (129-163)
src/platform/common/utils.ts (2)
  • concatMultilineString (211-225)
  • formatStreamText (275-278)
src/notebooks/deepnote/pocket.unit.test.ts (1)
src/notebooks/deepnote/pocket.ts (1)
  • extractPocketFromCellMetadata (42-44)
🔇 Additional comments (21)
src/notebooks/deepnote/deepnoteInitNotebookRunner.node.ts (1)

237-237: Verify progress calculation change is intentional.

Calculation changed from (i + 1) / length to i / length. Now shows 0% for first block and never reaches 100% during execution (max is (n-1)/n %). Confirm this matches intended progress semantics.

src/notebooks/deepnote/deepnoteKernelAutoSelector.node.ts (1)

15-15: Verify removal of localization against coding guidelines.

The l10n import was removed and all user-facing strings in this file are now hard-coded English. This conflicts with the coding guideline "Use l10n.t() for user-facing strings."

Confirm this is intentional as part of the broader localization removal described in the PR.

As per coding guidelines.

src/notebooks/deepnote/deepnoteActivationService.ts (1)

18-21: LGTM.

Constructor correctly simplified to remove integration manager dependency, aligning with broader integration infrastructure removal.

src/notebooks/deepnote/deepnoteActivationService.unit.test.ts (3)

18-18: LGTM.

Test correctly updated for two-argument constructor.


78-79: LGTM.

Service instances correctly instantiated with updated constructor signature.


104-105: LGTM.

Constructor calls properly updated.

src/platform/webviews/webviewHost.ts (1)

261-261: No issues found—removed localization keys verified absent from codebase.

The search across all TypeScript and JavaScript files returned zero matches for the seven removed keys. Webview code contains no references to the deprecated localization strings.

package.json (1)

1834-1834: LGTM.

Condition change ensures Deepnote explorer only shows when folders are open.

.github/workflows/ci.yml (1)

169-192: Spell-check job structure is sound.

Job mirrors the existing CI pattern (checkout → setup → install → run script) and correctly keeps spell-check out of pre-commit hooks per learnings.

Based on learnings

.gitignore (1)

1-74: LGTM.

Comprehensive reorganization covers build outputs, dependencies, test artifacts, logs, and temporary files. Negations for !yarn.lock, !build/, and !src/test/pythonEnvironments/**/*.* are preserved correctly.

src/kernels/deepnote/deepnoteToolkitInstaller.node.ts (1)

21-22: Well-handled concurrent installation prevention.

The pendingInstallations map correctly prevents multiple simultaneous installs to the same venv, with proper double-check and cleanup logic.

Also applies to: 70-113

src/standalone/intellisense/resolveCompletionItem.unit.test.ts (1)

549-549: Direct function reference is fine.

Single-arg function; extra map args are ignored. No behavior change.

src/kernels/execution/cellExecutionMessageHandler.ts (2)

1149-1153: Update‑display path aligned.

Translator usage matches simplified signature; good.


637-637: API shift verified: all 19 call sites use single-arg signature.

Every invocation of cellOutputToVSCCellOutput() passes exactly one argument. No multi-arg calls remain. The refactor is consistent across production, tests, and helpers.

src/kernels/execution/helpers.ts (5)

118-129: Mapper typed to single‑arg translators: good.

Cleaner public surface; matches call‑site refactors.


129-161: cellOutputToVSCCellOutput refactor: good.

Fallback to display_data is acceptable; logs warn.


165-188: Metadata builder is sound.

Deep‑clones output.metadata and carries transient/executionCount.


203-236: Display data translation OK.

Single‑arg path; preserves metadata and item ordering.


545-556: Error translation preserves original error.

Attaches originalError and uses unified metadata. Good.

src/kernels/execution/cellExecutionCreator.ts (2)

65-76: Review comment is satisfied; all real executions properly set clearOutputOnStartWithTime.

Call sites correctly differentiate: kernel executions (vscodeNotebookController.ts:529, cellExecution.ts:126-129 for non-resumed) pass true; error-handling and temporary executions (helpers.ts:771, interactiveWindow.ts:259) correctly default to false. No issues found.


126-147: Review comment is incorrect.

VS Code's NotebookCellExecution API allows calling end() before start(). The execution gracefully transitions from Pending → Idle without rejection. The current code at line 135 is correct and requires no guard. The suggested guard based on "VS Code may reject end() pre-start" is unnecessary.

Likely an incorrect or invalid review comment.

Comment on lines +2 to +17
if npm list prettier | grep -q prettier@ ; then
echo husky - prettier is installed
else
echo husky - prettier is not installed, skipping format check
exit 0
fi

# run prettier on all .ts files that are in the commit
changed=$(git diff --diff-filter=ACM --cached --name-only | grep .ts$ | tr '\n' ' ')

if [ -z "$changed" ]; then
echo husky - No modified files to check
exit 0
fi

npx prettier $changed --check
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 | 🟠 Major

🧩 Analysis chain

Pre-commit hook checks but doesn't fix formatting.

Learnings indicate "ALWAYS run npm run format-fix before committing changes," but this hook runs prettier --check (line 17), which fails the commit without auto-fixing. Either switch to prettier --write or add guidance that developers must manually run format-fix.

Based on learnings


🏁 Script executed:

#!/bin/bash
# Check actual .husky/pre-commit file
echo "=== .husky/pre-commit ===" 
cat .husky/pre-commit 2>/dev/null || echo "File not found"

# Check npm scripts for format-fix and related commands
echo -e "\n=== package.json scripts (format-related) ===" 
jq '.scripts | with_entries(select(.key | contains("format") or contains("prettier")))' package.json 2>/dev/null || echo "package.json not found or jq failed"

# List .husky directory contents
echo -e "\n=== .husky directory ===" 
ls -la .husky/ 2>/dev/null || echo ".husky directory not found"

Length of output: 1030


Pre-commit hook enforces but doesn't fix formatting.

The hook runs prettier --check without --write, failing commits with formatting issues instead of auto-fixing them. Learnings indicate developers should always run format-fix before committing. Either switch to prettier --write or add npm run format-fix as a prior step in this hook.

🤖 Prompt for AI Agents
In .husky/pre-commit around lines 2 to 17, the hook currently runs Prettier with
--check which rejects commits instead of auto-fixing formatting; change the hook
to run Prettier in write mode or invoke the repository's format-fix script
before checking. Update the sequence to first run "npm run format-fix" (or "npx
prettier --write" on the staged .ts files), then re-stage any changed files and
finally run "npx prettier --check" to verify formatting so commits get
auto-corrected rather than failing.

fi

# run prettier on all .ts files that are in the commit
changed=$(git diff --diff-filter=ACM --cached --name-only | grep .ts$ | tr '\n' ' ')
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Strengthen the file pattern.

grep .ts$ matches .ts anywhere in the path (e.g., foo.ts.backup). Use grep '\.ts$' or grep -E '\.ts$' for an anchored extension match.

-changed=$(git diff --diff-filter=ACM --cached --name-only | grep .ts$ | tr '\n' ' ')
+changed=$(git diff --diff-filter=ACM --cached --name-only | grep '\.ts$' | tr '\n' ' ')
📝 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
changed=$(git diff --diff-filter=ACM --cached --name-only | grep .ts$ | tr '\n' ' ')
changed=$(git diff --diff-filter=ACM --cached --name-only | grep '\.ts$' | tr '\n' ' ')
🤖 Prompt for AI Agents
In .husky/pre-commit around line 10, the grep pattern grep .ts$ matches anywhere
in filenames (e.g., foo.ts.backup); replace it with an anchored, escaped
extension match such as grep '\.ts$' or grep -E '\.ts$' so only files ending
with .ts are selected (ensure the backslash is quoted so the shell passes the
pattern correctly).

Comment on lines +161 to 163
plugins.push(style());
plugins.push(lessLoader());

Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Align CSS minify with dev/prod.

style() always minifies; degrade DX in dev. Pass minify based on isDevbuild.

-        plugins.push(style());
+        plugins.push(style({ minify: !isDevbuild }));
📝 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
plugins.push(style());
plugins.push(lessLoader());
plugins.push(style({ minify: !isDevbuild }));
plugins.push(lessLoader());
🤖 Prompt for AI Agents
In build/esbuild/build.ts around lines 161 to 163, the call
plugins.push(style()) always enables CSS minification which hurts DX in
development; update the call to pass a minify option tied to the build mode
(e.g., plugins.push(style({ minify: !isDevbuild }))) so minification is disabled
when isDevbuild is true and enabled for production builds; leave lessLoader()
unchanged.

import { CancellationToken, Uri, workspace } from 'vscode';
import { PythonEnvironment } from '../../platform/pythonEnvironments/info';
import { IDeepnoteToolkitInstaller, DEEPNOTE_TOOLKIT_WHEEL_URL, DEEPNOTE_TOOLKIT_VERSION } from './types';
import { IDeepnoteToolkitInstaller, DEEPNOTE_TOOLKIT_WHEEL_URL } from './types';
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 | 🔴 Critical

🧩 Analysis chain

Toolkit version upgrades won't invalidate existing venvs.

Removing version from the venv path means ensureInstalled (line 84) will reuse old venvs even after DEEPNOTE_TOOLKIT_WHEEL_URL points to a new version. Users won't get toolkit upgrades without manual cleanup.

If version-independent venvs are intentional, add explicit version checking to isToolkitInstalled or document the manual cleanup requirement. Otherwise, restore version in the venv path or add a version file check.

Verify whether toolkit version tracking is handled elsewhere:

Also applies to: 32-35


🏁 Script executed:

#!/bin/bash
# Check if version tracking exists in related files
rg -n "DEEPNOTE_TOOLKIT_VERSION" --type=ts

# Check types file for version constant
rg -nA5 "DEEPNOTE_TOOLKIT_WHEEL_URL" src/kernels/deepnote/types.ts

Length of output: 937



---

🏁 Script executed:

```shell
#!/bin/bash
# Get the actual implementation of key methods in deepnoteToolkitInstaller.node.ts
rg -nA10 "private.*getVenvPath\|protected.*getVenvPath\|public.*getVenvPath" src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

echo "---"

# Check isToolkitInstalled implementation  
rg -nA15 "isToolkitInstalled" src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

echo "---"

# Check ensureInstalled to see version logic
rg -nA20 "ensureInstalled" src/kernels/deepnote/deepnoteToolkitInstaller.node.ts | head -30

Length of output: 289



---

🏁 Script executed:

```shell
#!/bin/bash
# Find all .node.ts files in deepnote directory
fd "\.node\.ts$" src/kernels/deepnote/

echo "---"

# List all files in deepnote directory
fd "." src/kernels/deepnote/ --max-depth 1 --type f

echo "---"

# Search for any file with "deepnote" and "Installer" in name
fd "Installer" src/kernels/deepnote/

Length of output: 334


🏁 Script executed:

#!/bin/bash
# Find all files in deepnote directory
find src/kernels/deepnote -maxdepth 1 -type f -name "*.ts"

echo "---"

# Check directory structure
ls -la src/kernels/deepnote/ | head -20

Length of output: 763


🏁 Script executed:

#!/bin/bash
# Get line 7 and surrounding context (imports)
echo "=== IMPORTS (lines 1-15) ==="
head -15 src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

echo -e "\n=== getVenvPath method (lines 32-45) ==="
sed -n '32,45p' src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

echo -e "\n=== ensureInstalled method (lines 82-100) ==="
sed -n '82,100p' src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

echo -e "\n=== isToolkitInstalled method (lines 260-280) ==="
sed -n '260,280p' src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

Length of output: 3462


🏁 Script executed:

#!/bin/bash
# Get full getVenvHash implementation
sed -n '276,295p' src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

echo -e "\n=== Check if DEEPNOTE_TOOLKIT_WHEEL_URL is used anywhere else in file ==="
grep -n "DEEPNOTE_TOOLKIT_WHEEL_URL" src/kernels/deepnote/deepnoteToolkitInstaller.node.ts

Length of output: 1212


Toolkit version upgrades won't invalidate existing venvs.

Removing DEEPNOTE_TOOLKIT_VERSION from imports eliminates version tracking. The venv hash (line 276) depends only on the file path—not the toolkit version or DEEPNOTE_TOOLKIT_WHEEL_URL. When the URL updates to a new version, ensureInstalled (line 84) reuses the existing venv because isToolkitInstalled (line 262) only checks module presence, not version. Users remain on stale toolkit versions without manual cleanup.

Fix: Include the toolkit URL/version in the venv hash, or add version validation to isToolkitInstalled.

Comment on lines +1006 to +1010
const output = cellOutputToVSCCellOutput({
output_type: 'stream',
name: msg.content.name,
text: msg.content.text
});
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Normalize stream text across all branches.

Apply CR/backspace fixes consistently to avoid mismatched rendering.

@@
-            const output = cellOutputToVSCCellOutput({
+            const output = cellOutputToVSCCellOutput({
                 output_type: 'stream',
                 name: msg.content.name,
-                text: msg.content.text
+                text: formatStreamText(concatMultilineString(msg.content.text))
             });
@@
-            const output = cellOutputToVSCCellOutput({
+            const output = cellOutputToVSCCellOutput({
                 output_type: 'stream',
                 name: msg.content.name,
-                text
+                text: formatStreamText(text)
             });
@@
-            const output = cellOutputToVSCCellOutput({
+            const output = cellOutputToVSCCellOutput({
                 output_type: 'stream',
                 name: msg.content.name,
                 text
             });

Also applies to: 1016-1020, 1027-1031

🤖 Prompt for AI Agents
In src/kernels/execution/cellExecutionMessageHandler.ts around lines 1006-1010
(and also apply to 1016-1020 and 1027-1031), the stream branch creates the VS
Code cell output using msg.content.text directly which results in inconsistent
handling of carriage returns/backspaces across branches; normalize the stream
text in all branches by running the same CR/backspace sanitization function (the
one used elsewhere in this file) on msg.content.text before passing it to
cellOutputToVSCCellOutput so every branch produces the same cleaned string and
rendering behavior.

const cells = this.converter.convertBlocksToCells(selectedNotebook.blocks);

logger.debug(`DeepnoteSerializer: Converted ${cells.length} cells from notebook blocks`);
console.log(`Converted ${cells.length} cells from notebook blocks.`);
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 | 🟠 Major

Violates coding guidelines: use ILogger service.

Coding guidelines require ILogger service instead of console.log.

As per coding guidelines.

🤖 Prompt for AI Agents
In src/notebooks/deepnote/deepnoteSerializer.ts around line 67, replace the
console.log call with the project's ILogger usage: remove console.log and call
the ILogger instance (e.g., logger.info(...)) with the same message; if there is
no local logger variable, import or accept the ILogger service used across the
codebase (or obtain it via the existing DI/getLogger helper) and use
logger.info(`Converted ${cells.length} cells from notebook blocks.`); ensure no
other console.* calls remain in this file.

Comment on lines 1 to 4
import type { NotebookCellData } from 'vscode';

import type { DeepnoteBlock } from './deepnoteTypes';
import type { DeepnoteBlock, DeepnoteOutput } from './deepnoteTypes';
import { generateBlockId, generateSortingKey } from './dataConversionUtils';
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 | 🔴 Critical

Default block type should reflect cell.kind.

Currently defaults to 'code' even for markup cells without a pocket; leads to incorrect conversions.

-import type { NotebookCellData } from 'vscode';
+import type { NotebookCellData } from 'vscode';
+import { NotebookCellKind } from 'vscode';
...
-        type: pocket?.type || 'code'
+        type: pocket?.type || (cell.kind === NotebookCellKind.Markup ? 'markdown' : 'code')

Would you like a follow-up PR to add the corresponding unit test (see suggested test in pocket.unit.test.ts)?

Also applies to: 64-67

🤖 Prompt for AI Agents
In src/notebooks/deepnote/pocket.ts around lines 1-4 and also lines 64-67, the
function currently defaults block.type to 'code' even for markup cells without a
pocket; change the default to reflect the NotebookCellData.kind so markup cells
get 'markup' and code cells get 'code'. Update the logic to inspect cell.kind
(e.g., NotebookCellKind.Markup vs code) and set block.type = 'markup' for markup
cells and 'code' otherwise, and mirror the same fix for the code paths at lines
64-67 so both creation sites use the cell.kind-aware default.

Comment on lines +52 to +56
**Key functions:**
- `deepnoteDataConverter.ts::convertBlocksToCells(blocks)` - Main entry point
- `pocket.ts::addPocketToCellMetadata(cell)` - Creates the pocket
- `deepnoteDataConverter.ts::transformOutputsForVsCode(outputs)` - Converts outputs

Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Doc aligns with implementation; add one caution.

Note that storing outputs in the pocket can be large; prefer keeping only round‑trip‑critical fields if size becomes an issue.

Also applies to: 79-83

🤖 Prompt for AI Agents
In src/notebooks/deepnote/serialization.md around lines 52-56 (and similarly
79-83), the docs mention storing outputs in the pocket but lack a caution about
size; update the documentation to warn that output payloads can be large and
recommend storing only round-trip-critical fields (e.g., output type, minimal
metadata, hashes or references) or truncating/omitting bulky data (full
binary/blobs, large text) when size is a concern, and add a brief example
sentence describing this trade-off and a pointer to where to list the specific
fields to keep.

export interface IDeepnoteNotebookManager {
getCurrentNotebookId(projectId: string): string | undefined;
getOriginalProject(projectId: string): DeepnoteProject | undefined;
getOriginalProject(projectId: string): unknown | undefined;
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 | 🔴 Critical

🧩 Analysis chain

Verify callers handle unknown return type.

Changed from DeepnoteProject | undefined to unknown | undefined. Confirm all call sites of getOriginalProject handle the opaque type correctly.


🏁 Script executed:

#!/bin/bash
# Find all usages of getOriginalProject
rg -n -C5 'getOriginalProject\(' --type=ts -g '!*.unit.test.ts'

Length of output: 148



🏁 Script executed:

#!/bin/bash
# Check if file exists and search for getOriginalProject more broadly
echo "=== Checking file existence ==="
fd -t f "types.ts" | grep notebooks

echo -e "\n=== Search for getOriginalProject without type filter ==="
rg -n 'getOriginalProject' --glob '*.ts' --glob '*.tsx' -C3

echo -e "\n=== Search in entire repo without filters ==="
rg -n 'getOriginalProject' -C3

Length of output: 15724


Interface-implementation type mismatch requires resolution.

The interface signature changed to return unknown | undefined, but the implementation in src/notebooks/deepnote/deepnoteNotebookManager.ts:31 still returns DeepnoteProject | undefined. All three call sites compensate with explicit as DeepnoteProject | undefined casts, so functionality works—but this violates the type contract and requires casting workarounds.

Either update the interface to match the implementation (DeepnoteProject | undefined) or align the implementation with the interface (unknown | undefined).

🤖 Prompt for AI Agents
In src/notebooks/types.ts around line 30 the getOriginalProject signature
returns unknown | undefined which mismatches the implementation in
src/notebooks/deepnote/deepnoteNotebookManager.ts (returns DeepnoteProject |
undefined) and forces callers to cast; update the interface to return
DeepnoteProject | undefined to match the implementation and remove the need for
casts, or alternatively change the deepnoteNotebookManager method to return
unknown | undefined and update its callers to handle/validate the unknown;
preferred fix: change the types.ts signature to DeepnoteProject | undefined so
it aligns with the manager implementation and remove the explicit casts at call
sites.

getTheSelectedNotebookForAProject(projectId: string): string | undefined;
selectNotebookForProject(projectId: string, notebookId: string): void;
storeOriginalProject(projectId: string, project: DeepnoteProject, notebookId: string): void;
storeOriginalProject(projectId: string, project: unknown, notebookId: string): void;
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 | 🔴 Critical

🧩 Analysis chain

Verify callers can pass unknown type.

Changed from project: DeepnoteProject to project: unknown. Ensure call sites are updated or their types are compatible.


🏁 Script executed:

#!/bin/bash
# Find all usages of storeOriginalProject
rg -n -C5 'storeOriginalProject\(' --type=ts -g '!*.unit.test.ts'

Length of output: 148


🏁 Script executed:

#!/bin/bash
# Broader search: find all TypeScript files first to verify structure
fd -e ts -e tsx | head -20

Length of output: 667


🏁 Script executed:

#!/bin/bash
# Search for storeOriginalProject without restrictive filters
rg 'storeOriginalProject' --type ts -n

Length of output: 2626


🏁 Script executed:

#!/bin/bash
# Check the actual interface definition in the file mentioned
cat src/notebooks/types.ts | head -50

Length of output: 1802


Implementation parameter type does not match interface declaration.

The interface in src/notebooks/types.ts:33 declares project: unknown, but the implementation in src/notebooks/deepnote/deepnoteNotebookManager.ts:63 still has project: DeepnoteProject. Update the implementation's parameter type to unknown to match the interface signature.

🤖 Prompt for AI Agents
In src/notebooks/types.ts around line 33 and
src/notebooks/deepnote/deepnoteNotebookManager.ts at line 63, the interface
declares storeOriginalProject(projectId: string, project: unknown, notebookId:
string): void but the implementation still types project as DeepnoteProject;
change the implementation signature to use project: unknown to match the
interface, update any internal usages to safely narrow or validate the unknown
(with type guards or casts) before accessing properties, and run TypeScript
build to ensure no other signature mismatches remain.

- Restore integration-related files and imports from main
- Accept main's new integration panel localization strings
- Restore SqlCellStatusBarProvider registration
- Restore missing integrationDetector.ts file
@devin-ai-integration
Copy link

Closing this PR in favor of #87 which has a clean spell-check implementation without merge conflict artifacts.

The new PR:

  • Only checks Deepnote-specific code (not forked Microsoft code)
  • Has minimal 37-word technical dictionary
  • Results in 0 spelling errors
  • Has clean diff with only 4 files changed

All spell-check related CI checks are passing in #87.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants