Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 4 additions & 13 deletions apps/notebook/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,6 @@ function AppContent() {
// UV Dependency management
const {
dependencies,
uvAvailable,
hasDependencies: hasUvDependencies,
isUvConfigured,
loading: depsLoading,
Expand Down Expand Up @@ -222,12 +221,8 @@ function AppContent() {
} = useCondaDependencies();

// Deno config detection and settings
const {
denoAvailable,
denoConfigInfo,
flexibleNpmImports,
setFlexibleNpmImports,
} = useDenoDependencies();
const { denoConfigInfo, flexibleNpmImports, setFlexibleNpmImports } =
useDenoDependencies();

// Get widget store handler for routing comm messages
const { handleMessage: handleWidgetMessage } = useWidgetStoreRequired();
Expand Down Expand Up @@ -316,11 +311,9 @@ function AppContent() {
? "conda"
: envSource?.startsWith("uv:")
? "uv"
: isUvConfigured && uvAvailable !== false
: isUvConfigured
? "uv"
: isCondaConfigured ||
environmentYmlInfo?.has_dependencies ||
uvAvailable === false
: isCondaConfigured || environmentYmlInfo?.has_dependencies
? "conda"
: null;

Expand Down Expand Up @@ -1068,7 +1061,6 @@ function AppContent() {
)}
{dependencyHeaderOpen && runtime === "deno" && (
<DenoDependencyHeader
denoAvailable={denoAvailable}
denoConfigInfo={denoConfigInfo}
flexibleNpmImports={flexibleNpmImports}
onSetFlexibleNpmImports={setFlexibleNpmImports}
Expand Down Expand Up @@ -1111,7 +1103,6 @@ function AppContent() {
dependencies={dependencies?.dependencies ?? []}
requiresPython={dependencies?.requires_python ?? null}
prerelease={dependencies?.prerelease ?? null}
uvAvailable={uvAvailable}
loading={depsLoading}
syncedWhileRunning={syncedWhileRunning}
needsKernelRestart={needsKernelRestart}
Expand Down
60 changes: 23 additions & 37 deletions apps/notebook/src/components/DenoDependencyHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import { Label } from "@/components/ui/label";
import type { DenoConfigInfo } from "../hooks/useDenoDependencies";

interface DenoDependencyHeaderProps {
denoAvailable: boolean | null;
denoConfigInfo: DenoConfigInfo | null;
flexibleNpmImports: boolean;
onSetFlexibleNpmImports: (enabled: boolean) => void;
Expand All @@ -24,7 +23,6 @@ interface DenoDependencyHeaderProps {
}

export function DenoDependencyHeader({
denoAvailable,
denoConfigInfo,
flexibleNpmImports,
onSetFlexibleNpmImports,
Expand Down Expand Up @@ -73,16 +71,6 @@ export function DenoDependencyHeader({
</div>
)}

{/* Deno availability notice */}
{denoAvailable === false && (
<div className="mb-3 rounded bg-amber-500/10 px-2 py-1.5 text-xs text-amber-700 dark:text-amber-400">
<span className="font-medium">Deno not found.</span> Install it with{" "}
<code className="rounded bg-amber-500/20 px-1">
curl -fsSL https://deno.land/install.sh | sh
</code>
</div>
)}

{/* deno.json detected banner */}
{denoConfigInfo && (
<div className="mb-3 rounded bg-muted/80 px-2 py-1.5 text-xs text-muted-foreground">
Expand Down Expand Up @@ -116,7 +104,7 @@ export function DenoDependencyHeader({
)}

{/* No config file - explain how Deno handles deps */}
{!denoConfigInfo && denoAvailable !== false && (
{!denoConfigInfo && (
<div className="mb-3 flex items-start gap-2 rounded bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground">
<Info className="h-3.5 w-3.5 mt-0.5 shrink-0" />
<span>
Expand All @@ -127,30 +115,28 @@ export function DenoDependencyHeader({
)}

{/* Auto-install npm packages setting */}
{denoAvailable !== false && (
<div className="mb-3 flex items-start gap-2.5">
<Checkbox
id="flexible-npm-imports"
checked={flexibleNpmImports}
onCheckedChange={(checked) =>
onSetFlexibleNpmImports(checked === true)
}
className="mt-0.5"
/>
<Label
htmlFor="flexible-npm-imports"
className="flex-1 flex-col items-start gap-1 cursor-pointer"
>
<span className="text-xs font-medium text-foreground">
Auto-install npm packages
</span>
<p className="text-xs text-muted-foreground font-normal">
Packages download automatically when you import them. Disable to
use your project&apos;s node_modules instead.
</p>
</Label>
</div>
)}
<div className="mb-3 flex items-start gap-2.5">
<Checkbox
id="flexible-npm-imports"
checked={flexibleNpmImports}
onCheckedChange={(checked) =>
onSetFlexibleNpmImports(checked === true)
}
className="mt-0.5"
/>
<Label
htmlFor="flexible-npm-imports"
className="flex-1 flex-col items-start gap-1 cursor-pointer"
>
<span className="text-xs font-medium text-foreground">
Auto-install npm packages
</span>
<p className="text-xs text-muted-foreground font-normal">
Packages download automatically when you import them. Disable to
use your project&apos;s node_modules instead.
</p>
</Label>
</div>

{/* Import examples */}
<div className="space-y-2">
Expand Down
15 changes: 0 additions & 15 deletions apps/notebook/src/components/DependencyHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ interface DependencyHeaderProps {
dependencies: string[];
requiresPython: string | null;
prerelease: string | null;
uvAvailable: boolean | null;
loading: boolean;
syncedWhileRunning: boolean;
needsKernelRestart: boolean;
Expand All @@ -45,7 +44,6 @@ export function DependencyHeader({
dependencies,
requiresPython,
prerelease,
uvAvailable,
loading,
syncedWhileRunning,
needsKernelRestart,
Expand Down Expand Up @@ -163,19 +161,6 @@ export function DependencyHeader({
</div>
)}

{/* UV availability notice */}
{uvAvailable === false && (
<div className="mb-3 flex items-start gap-2 rounded bg-muted/80 px-2 py-1.5 text-xs text-muted-foreground">
<Info className="h-3.5 w-3.5 mt-0.5 shrink-0" />
<span>
<span className="font-medium">uv not found.</span> Install it with{" "}
<code className="rounded bg-muted px-1">
curl -LsSf https://astral.sh/uv/install.sh | sh
</code>
</span>
</div>
)}

{/* pyproject.toml detected banner */}
{pyprojectInfo?.has_dependencies && (
<div className="mb-3 rounded bg-muted/80 px-2 py-1.5 text-xs text-muted-foreground">
Expand Down
6 changes: 2 additions & 4 deletions apps/notebook/src/hooks/useDenoDependencies.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { invoke } from "@tauri-apps/api/core";
import { useCallback, useEffect, useState } from "react";

import { logger } from "../lib/logger";
import {
setDenoFlexibleNpmImports as setDenoFlexibleWasm,
Expand All @@ -15,7 +16,6 @@ export interface DenoConfigInfo {
}

export function useDenoDependencies() {
const [denoAvailable, setDenoAvailable] = useState<boolean | null>(null);
const [denoConfigInfo, setDenoConfigInfo] = useState<DenoConfigInfo | null>(
null,
);
Expand All @@ -24,9 +24,8 @@ export function useDenoDependencies() {
const flexibleNpmImportsFromDoc = useDenoFlexibleNpmImports();
const flexibleNpmImports = flexibleNpmImportsFromDoc ?? true;

// Check Deno availability and detect config on mount
// Detect deno config on mount
useEffect(() => {
invoke<boolean>("check_deno_available").then(setDenoAvailable);
invoke<DenoConfigInfo | null>("detect_deno_config").then(setDenoConfigInfo);
}, []);

Expand All @@ -39,7 +38,6 @@ export function useDenoDependencies() {
}, []);

return {
denoAvailable,
denoConfigInfo,
flexibleNpmImports,
setFlexibleNpmImports,
Expand Down
5 changes: 1 addition & 4 deletions apps/notebook/src/hooks/useDependencies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ export interface PyProjectInfo {
}

export function useDependencies() {
const [uvAvailable, setUvAvailable] = useState<boolean | null>(null);
const [loading, setLoading] = useState(false);
// Track if deps were synced to a running kernel (user may need to restart for some changes)
const [syncedWhileRunning, setSyncedWhileRunning] = useState(false);
Expand All @@ -72,9 +71,8 @@ export function useDependencies() {
setSyncState(null);
}, []);

// Check if uv is available and detect pyproject on mount
// Detect pyproject on mount
useEffect(() => {
invoke<boolean>("check_uv_available").then(setUvAvailable);
invoke<PyProjectInfo | null>("detect_pyproject").then(setPyprojectInfo);
}, []);

Expand Down Expand Up @@ -261,7 +259,6 @@ export function useDependencies() {

return {
dependencies,
uvAvailable,
hasDependencies,
isUvConfigured,
loading,
Expand Down
1 change: 0 additions & 1 deletion crates/notebook/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ runtimed = { path = "../runtimed" }
notebook-sync = { path = "../notebook-sync" }
runt-trust = { path = "../runt-trust" }
runt-workspace = { path = "../runt-workspace" }
kernel-env = { path = "../kernel-env" }
nbformat = "1.2.1"
petname = "2"
log = "0.4"
Expand Down
35 changes: 0 additions & 35 deletions crates/notebook/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2402,12 +2402,6 @@ async fn send_frame(
// UV Dependency Management Commands
// ============================================================================

/// Check if uv is available on the system.
#[tauri::command]
async fn check_uv_available() -> bool {
uv_env::check_uv_available().await
}

// ============================================================================
// pyproject.toml Discovery and Environment Commands
// ============================================================================
Expand Down Expand Up @@ -2778,32 +2772,6 @@ async fn import_pixi_dependencies(

// ========== Deno kernel support ==========

/// Check if Deno is available on the system.
/// Queries the daemon via the notebook sync protocol so the notebook crate
/// does not need a direct dependency on kernel-launch.
#[tauri::command]
async fn check_deno_available(
window: tauri::Window,
registry: tauri::State<'_, WindowNotebookRegistry>,
) -> Result<bool, String> {
let Ok(notebook_sync) = notebook_sync_for_window(&window, registry.inner()) else {
return Ok(false);
};
let guard = notebook_sync.lock().await;
let Some(handle) = guard.as_ref() else {
return Ok(false);
};
match handle
.send_request(NotebookRequest::CheckToolAvailable {
tool: "deno".to_string(),
})
.await
{
Ok(NotebookResponse::ToolAvailable { available }) => Ok(available),
_ => Ok(false),
}
}

/// Detect deno.json/deno.jsonc near the notebook and return info about it
#[tauri::command]
async fn detect_deno_config(
Expand Down Expand Up @@ -3453,8 +3421,6 @@ pub fn run(
get_upgrade_notebook_status,
abort_kernel_for_upgrade,
run_upgrade,
// UV dependency management
check_uv_available,
// pyproject.toml discovery
detect_pyproject,
get_pyproject_dependencies,
Expand All @@ -3470,7 +3436,6 @@ pub fn run(
approve_notebook_trust,
check_typosquats,
// Deno kernel support
check_deno_available,
detect_deno_config,
// Synced settings (via runtimed Automerge)
get_synced_settings,
Expand Down
9 changes: 2 additions & 7 deletions crates/notebook/src/uv_env.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
//! UV-based notebook metadata operations.
//!
//! This module provides notebook-specific metadata operations (set
//! dependencies in `nbformat::Metadata`) and a thin availability check.
//! Environment creation is handled entirely by the daemon via `kernel_env::uv`.
//! dependencies in `nbformat::Metadata`). Environment creation and tool
//! availability checks are handled entirely by the daemon.

use serde::{Deserialize, Serialize};

Expand Down Expand Up @@ -36,8 +36,3 @@ pub fn set_dependencies(metadata: &mut nbformat::v4::Metadata, deps: &NotebookDe
runt_obj.insert("uv".to_string(), uv_value);
}
}

/// Check if uv is available (either on PATH or bootstrappable via rattler).
pub async fn check_uv_available() -> bool {
kernel_env::uv::check_uv_available().await
}
Loading