feat: enhance jupyter notebook functions with auto-init and kernel management

Auto-create notebooks y sesiones en jupyter_exec (append y cell).
Auto-create en jupyter_write (append_code, append_markdown, batch).
Nuevos subcomandos cleanup y shutdown-all en jupyter_kernel.
README.md renombrado a README.txt para evitar error de parseo del indexer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-08 00:10:23 +02:00
parent 7eef2544ab
commit fc8062bade
7 changed files with 215 additions and 7 deletions
@@ -30,6 +30,35 @@ def _resolve_collab_username(server_url: str, token: str) -> str:
return "Anonymous"
# ---------------------------------------------------------------------------
# Helpers internos
# ---------------------------------------------------------------------------
def _notebook_exists(notebook_path: str, server_url: str, token: str) -> bool:
"""Comprueba si un notebook existe en el servidor Jupyter via HEAD /api/contents."""
headers = {"Accept": "application/json"}
if token:
headers["Authorization"] = f"token {token}"
check_url = f"{server_url}/api/contents/{notebook_path}"
req = Request(check_url, headers=headers, method="HEAD")
try:
with urlopen(req, timeout=5):
return True
except HTTPError as e:
if e.code == 404:
return False
raise
def _auto_create_notebook(notebook_path: str, server_url: str, token: str) -> bool:
"""Crea el notebook si no existe. Retorna True si fue creado."""
if not _notebook_exists(notebook_path, server_url, token):
jupyter_create_notebook(notebook_path, server_url=server_url, token=token)
return True
return False
# ---------------------------------------------------------------------------
# Helpers internos async
# ---------------------------------------------------------------------------
@@ -42,6 +71,7 @@ async def _append_cell(
server_url: str,
token: str,
) -> dict:
_auto_create_notebook(notebook_path, server_url, token)
ws_url = get_jupyter_notebook_websocket_url(
server_url=server_url,
token=token,
@@ -139,6 +169,7 @@ async def _batch_write(
token: str,
) -> dict:
"""Anade multiples celdas en una sola conexion WebSocket."""
_auto_create_notebook(notebook_path, server_url, token)
ws_url = get_jupyter_notebook_websocket_url(
server_url=server_url,
token=token,